From 7983dd4c269997ff288de5a67896170be54997cc Mon Sep 17 00:00:00 2001 From: leibale Date: Thu, 2 Sep 2021 11:12:55 -0400 Subject: [PATCH 001/112] update workflows & README --- .github/workflows/benchmark.yml | 3 ++- .github/workflows/documentation.yml | 3 ++- .github/workflows/tests.yml | 3 ++- README.md | 4 ++-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index b6e5802a914..2df438eb19c 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -3,7 +3,8 @@ name: Benchmark on: push: branches: - - v4 + - master + - v4.0 jobs: benchmark: diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 16ca16b5608..9575d4639b9 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -3,7 +3,8 @@ name: Documentation on: push: branches: - - v4 + - master + - v4.0 jobs: documentation: diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 028600f1a17..557d4f452dc 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -3,7 +3,8 @@ name: Tests on: push: branches: - - v4 + - master + - v4.0 jobs: tests: diff --git a/README.md b/README.md index acc229b69c2..db0fa71cc7f 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,8 @@

- - Coverage Status + + Coverage Status Downloads From e421dc4bed75ae50eac927103b5254780e7d8994 Mon Sep 17 00:00:00 2001 From: leibale Date: Thu, 2 Sep 2021 11:20:57 -0400 Subject: [PATCH 002/112] add .deepsource.toml --- .deepsource.toml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .deepsource.toml diff --git a/.deepsource.toml b/.deepsource.toml new file mode 100644 index 00000000000..72aefc7b07a --- /dev/null +++ b/.deepsource.toml @@ -0,0 +1,9 @@ +version = 1 + +[[analyzers]] +name = "javascript" +enabled = true + + [analyzers.meta] + environment = ["nodejs"] + dialect = "typescript" From b80afc6346ab51a77123a5e3f59bd06524a0e02e Mon Sep 17 00:00:00 2001 From: leibale Date: Thu, 2 Sep 2021 14:00:52 -0400 Subject: [PATCH 003/112] fix client.quit, add error events on cluster, fix some "deepsource.io" warnings --- lib/client.ts | 5 +- lib/cluster-slots.ts | 43 ++++------- lib/cluster.ts | 7 +- lib/commander.ts | 4 +- lib/commands-queue.ts | 13 +++- lib/commands/MIGRATE.ts | 2 +- lib/commands/generic-transformers.spec.ts | 1 - package-lock.json | 94 +++++++++++------------ package.json | 2 +- 9 files changed, 86 insertions(+), 85 deletions(-) diff --git a/lib/client.ts b/lib/client.ts index a8da7f5ddd5..ed06317c14c 100644 --- a/lib/client.ts +++ b/lib/client.ts @@ -298,9 +298,10 @@ export default class RedisClient { - return this.#socket.quit(async () => { - this.#queue.addEncodedCommand(encodeCommand(['QUIT'])); + return this.#socket.quit(() => { + const promise = this.#queue.addEncodedCommand(encodeCommand(['QUIT'])); this.#tick(); + return promise; }); } diff --git a/lib/cluster-slots.ts b/lib/cluster-slots.ts index 3e255fc2a66..5fae5b92342 100644 --- a/lib/cluster-slots.ts +++ b/lib/cluster-slots.ts @@ -17,54 +17,40 @@ interface SlotNodes { clientIterator: IterableIterator> | undefined; } +type OnError = (err: unknown) => void; + export default class RedisClusterSlots { readonly #options: RedisClusterOptions; + readonly #onError: OnError; readonly #nodeByUrl = new Map>(); readonly #slots: Array> = []; - constructor(options: RedisClusterOptions) { + constructor(options: RedisClusterOptions, onError: OnError) { this.#options = options; + this.#onError = onError; } async connect(): Promise { for (const rootNode of this.#options.rootNodes) { - try { - await this.#discoverNodes(rootNode); - return; - } catch (err) { - console.error(err); - // this.emit('error', err); - } + if (await this.#discoverNodes(rootNode)) return; } throw new Error('None of the root nodes is available'); } async discover(startWith: RedisClientType): Promise { - try { - await this.#discoverNodes(startWith.options?.socket); - return; - } catch (err) { - console.error(err); - // this.emit('error', err); - } + if (await this.#discoverNodes(startWith.options?.socket)) return; for (const { client } of this.#nodeByUrl.values()) { if (client === startWith) continue; - - try { - await this.#discoverNodes(client.options?.socket); - return; - } catch (err) { - console.error(err); - // this.emit('error', err); - } + + if (await this.#discoverNodes(client.options?.socket)) return; } throw new Error('None of the cluster nodes is available'); } - async #discoverNodes(socketOptions?: RedisSocketOptions): Promise { + async #discoverNodes(socketOptions?: RedisSocketOptions): Promise { const client = RedisClient.create({ socket: socketOptions }); @@ -73,8 +59,14 @@ export default class RedisClusterSlots { rootNodes: Array; @@ -17,7 +18,7 @@ export interface RedisClusterOptions { export type RedisClusterType = WithPlugins & RedisCluster; -export default class RedisCluster { +export default class RedisCluster extends EventEmitter { static #extractFirstKey(command: RedisCommand, originalArgs: Array, redisArgs: Array): string | undefined { if (command.FIRST_KEY_INDEX === undefined) { return undefined; @@ -83,8 +84,10 @@ export default class RedisCluster) => RedisMultiCommandType; constructor(options: RedisClusterOptions) { + super(); + this.#options = options; - this.#slots = new RedisClusterSlots(options); + this.#slots = new RedisClusterSlots(options, err => this.emit('error', err)); this.#Multi = RedisMultiCommand.extend(options); } diff --git a/lib/commander.ts b/lib/commander.ts index 51adc417ba9..e8ff91cc7bf 100644 --- a/lib/commander.ts +++ b/lib/commander.ts @@ -97,12 +97,12 @@ export function transformCommandArguments( export function encodeCommand(args: Array): string { const encoded = [ `*${args.length}`, - `$${Buffer.byteLength(args[0])}`, + `$${Buffer.byteLength(args[0]).toString()}`, args[0] ]; for (let i = 1; i < args.length; i++) { - encoded.push(`$${Buffer.byteLength(args[i])}`, args[i]); + encoded.push(`$${Buffer.byteLength(args[i]).toString()}`, args[i]); } return encoded.join('\r\n') + '\r\n'; diff --git a/lib/commands-queue.ts b/lib/commands-queue.ts index 1890e0a00a9..cae3fd6130e 100644 --- a/lib/commands-queue.ts +++ b/lib/commands-queue.ts @@ -12,6 +12,7 @@ export interface QueueCommandOptions { interface CommandWaitingToBeSent extends CommandWaitingForReply { encodedCommand: string; + byteLength: number; chainId?: symbol; abort?: { signal: any; // TODO: `AbortSignal` type is incorrect @@ -130,6 +131,7 @@ export default class RedisCommandsQueue { return new Promise((resolve, reject) => { const node = new LinkedList.Node({ encodedCommand, + byteLength: Buffer.byteLength(encodedCommand), chainId: options?.chainId, resolve, reject @@ -156,7 +158,7 @@ export default class RedisCommandsQueue { this.#waitingToBeSent.pushNode(node); } - this.#waitingToBeSentCommandsLength += encodedCommand.length; + this.#waitingToBeSentCommandsLength += node.value.byteLength; }); } @@ -230,8 +232,12 @@ export default class RedisCommandsQueue { } this.#pubSubState[inProgressKey] += channelsCounter; + + const encodedCommand = encodeCommand(commandArgs), + byteLength = Buffer.byteLength(encodedCommand); this.#waitingToBeSent.push({ - encodedCommand: encodeCommand(commandArgs), + encodedCommand, + byteLength, channelsCounter, resolve: () => { this.#pubSubState[inProgressKey] -= channelsCounter; @@ -243,6 +249,7 @@ export default class RedisCommandsQueue { reject(); } }); + this.#waitingToBeSentCommandsLength += byteLength; }); } @@ -268,7 +275,7 @@ export default class RedisCommandsQueue { lastCommandChainId: symbol | undefined; for (const command of this.#waitingToBeSent) { encoded.push(command.encodedCommand); - size += command.encodedCommand.length; + size += command.byteLength; if (size > recommendedSize) { lastCommandChainId = command.chainId; break; diff --git a/lib/commands/MIGRATE.ts b/lib/commands/MIGRATE.ts index 1d2fc075efe..14dbe741be2 100644 --- a/lib/commands/MIGRATE.ts +++ b/lib/commands/MIGRATE.ts @@ -19,7 +19,7 @@ export function transformArguments( isKeyString = typeof key === 'string'; if (isKeyString) { - args.push(key as string); + args.push(key); } else { args.push('""'); } diff --git a/lib/commands/generic-transformers.spec.ts b/lib/commands/generic-transformers.spec.ts index 5335255f910..9ac72bb1b25 100644 --- a/lib/commands/generic-transformers.spec.ts +++ b/lib/commands/generic-transformers.spec.ts @@ -1,5 +1,4 @@ import { strict as assert } from 'assert'; -import { isObject } from 'util'; import { transformReplyBoolean, transformReplyBooleanArray, diff --git a/package-lock.json b/package-lock.json index 3b7397b61e4..cb1132ddb21 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@types/mocha": "^9.0.0", - "@types/node": "^16.7.8", + "@types/node": "^16.7.10", "@types/sinon": "^10.0.2", "@types/which": "^2.0.1", "@types/yallist": "^4.0.1", @@ -642,9 +642,9 @@ } }, "node_modules/@octokit/graphql": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.7.0.tgz", - "integrity": "sha512-diY0qMPyQjfu4rDu3kDhJ9qIZadIm4IISO3RJSv9ajYUWJUCO0AykbgzLcg1xclxtXgzY583u3gAv66M6zz5SA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", + "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", "dev": true, "dependencies": { "@octokit/request": "^5.6.0", @@ -653,18 +653,18 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-9.7.0.tgz", - "integrity": "sha512-TUJ16DJU8mekne6+KVcMV5g6g/rJlrnIKn7aALG9QrNpnEipFc1xjoarh0PKaAWf2Hf+HwthRKYt+9mCm5RsRg==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-10.0.0.tgz", + "integrity": "sha512-k1iO2zKuEjjRS1EJb4FwSLk+iF6EGp+ZV0OMRViQoWhQ1fZTk9hg1xccZII5uyYoiqcbC73MRBmT45y1vp2PPg==", "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.15.1.tgz", - "integrity": "sha512-47r52KkhQDkmvUKZqXzA1lKvcyJEfYh3TKAIe5+EzMeyDM3d+/s5v11i2gTk8/n6No6DPi3k5Ind6wtDbo/AEg==", + "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==", "dev": true, "dependencies": { - "@octokit/types": "^6.24.0" + "@octokit/types": "^6.26.0" }, "peerDependencies": { "@octokit/core": ">=2" @@ -730,12 +730,12 @@ } }, "node_modules/@octokit/types": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.25.0.tgz", - "integrity": "sha512-bNvyQKfngvAd/08COlYIN54nRgxskmejgywodizQNyiKoXmWRAjKup2/LYwm+T9V0gsKH6tuld1gM0PzmOiB4Q==", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.26.0.tgz", + "integrity": "sha512-RDxZBAFMtqs1ZPnbUu1e7ohPNfoNhTiep4fErY7tZs995BeHu369Vsh5woMIaFbllRWEZBfvTCS4hvDnMPiHrA==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^9.5.0" + "@octokit/openapi-types": "^10.0.0" } }, "node_modules/@sindresorhus/is": { @@ -855,9 +855,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.7.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.8.tgz", - "integrity": "sha512-8upnoQU0OPzbIkm+ZMM0zCeFCkw2s3mS0IWdx0+AAaWqm4fkBb0UJp8Edl7FVKRamYbpJC/aVsHpKWBIbiC7Zg==", + "version": "16.7.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.10.tgz", + "integrity": "sha512-S63Dlv4zIPb8x6MMTgDq5WWRJQe56iBEY0O3SOFA9JrRienkOVDXSXBjjJw6HTNQYSE2JI6GMCR6LVbIMHJVvA==", "dev": true }, "node_modules/@types/parse-json": { @@ -1845,9 +1845,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.3.822", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.822.tgz", - "integrity": "sha512-k7jG5oYYHxF4jx6PcqwHX3JVME/OjzolqOZiIogi9xtsfsmTjTdie4x88OakYFPEa8euciTgCCzvVNwvmjHb1Q==", + "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==", "dev": true }, "node_modules/emoji-regex": { @@ -4773,9 +4773,9 @@ } }, "node_modules/shiki": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.8.tgz", - "integrity": "sha512-499zQUTjcNTVwwiaPrWldUTXIV3T9HZWxDwE82bY+9GE7P2uD6hpHUTXNbTof3iOG6WT+/062+OMbl0lDoG8WQ==", + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.10.tgz", + "integrity": "sha512-xeM7Oc6hY+6iW5O/T5hor8ul7mEprzyl5y4r5zthEHToQNw7MIhREMgU3r2gKDB0NaMLNrkcEQagudCdzE13Lg==", "dev": true, "dependencies": { "json5": "^2.2.0", @@ -6164,9 +6164,9 @@ } }, "@octokit/graphql": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.7.0.tgz", - "integrity": "sha512-diY0qMPyQjfu4rDu3kDhJ9qIZadIm4IISO3RJSv9ajYUWJUCO0AykbgzLcg1xclxtXgzY583u3gAv66M6zz5SA==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", + "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", "dev": true, "requires": { "@octokit/request": "^5.6.0", @@ -6175,18 +6175,18 @@ } }, "@octokit/openapi-types": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-9.7.0.tgz", - "integrity": "sha512-TUJ16DJU8mekne6+KVcMV5g6g/rJlrnIKn7aALG9QrNpnEipFc1xjoarh0PKaAWf2Hf+HwthRKYt+9mCm5RsRg==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-10.0.0.tgz", + "integrity": "sha512-k1iO2zKuEjjRS1EJb4FwSLk+iF6EGp+ZV0OMRViQoWhQ1fZTk9hg1xccZII5uyYoiqcbC73MRBmT45y1vp2PPg==", "dev": true }, "@octokit/plugin-paginate-rest": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.15.1.tgz", - "integrity": "sha512-47r52KkhQDkmvUKZqXzA1lKvcyJEfYh3TKAIe5+EzMeyDM3d+/s5v11i2gTk8/n6No6DPi3k5Ind6wtDbo/AEg==", + "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==", "dev": true, "requires": { - "@octokit/types": "^6.24.0" + "@octokit/types": "^6.26.0" } }, "@octokit/plugin-request-log": { @@ -6244,12 +6244,12 @@ } }, "@octokit/types": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.25.0.tgz", - "integrity": "sha512-bNvyQKfngvAd/08COlYIN54nRgxskmejgywodizQNyiKoXmWRAjKup2/LYwm+T9V0gsKH6tuld1gM0PzmOiB4Q==", + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.26.0.tgz", + "integrity": "sha512-RDxZBAFMtqs1ZPnbUu1e7ohPNfoNhTiep4fErY7tZs995BeHu369Vsh5woMIaFbllRWEZBfvTCS4hvDnMPiHrA==", "dev": true, "requires": { - "@octokit/openapi-types": "^9.5.0" + "@octokit/openapi-types": "^10.0.0" } }, "@sindresorhus/is": { @@ -6360,9 +6360,9 @@ "dev": true }, "@types/node": { - "version": "16.7.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.8.tgz", - "integrity": "sha512-8upnoQU0OPzbIkm+ZMM0zCeFCkw2s3mS0IWdx0+AAaWqm4fkBb0UJp8Edl7FVKRamYbpJC/aVsHpKWBIbiC7Zg==", + "version": "16.7.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.10.tgz", + "integrity": "sha512-S63Dlv4zIPb8x6MMTgDq5WWRJQe56iBEY0O3SOFA9JrRienkOVDXSXBjjJw6HTNQYSE2JI6GMCR6LVbIMHJVvA==", "dev": true }, "@types/parse-json": { @@ -7108,9 +7108,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.822", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.822.tgz", - "integrity": "sha512-k7jG5oYYHxF4jx6PcqwHX3JVME/OjzolqOZiIogi9xtsfsmTjTdie4x88OakYFPEa8euciTgCCzvVNwvmjHb1Q==", + "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==", "dev": true }, "emoji-regex": { @@ -9284,9 +9284,9 @@ } }, "shiki": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.8.tgz", - "integrity": "sha512-499zQUTjcNTVwwiaPrWldUTXIV3T9HZWxDwE82bY+9GE7P2uD6hpHUTXNbTof3iOG6WT+/062+OMbl0lDoG8WQ==", + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.10.tgz", + "integrity": "sha512-xeM7Oc6hY+6iW5O/T5hor8ul7mEprzyl5y4r5zthEHToQNw7MIhREMgU3r2gKDB0NaMLNrkcEQagudCdzE13Lg==", "dev": true, "requires": { "json5": "^2.2.0", diff --git a/package.json b/package.json index fd309d970f6..32cf674a4d2 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@types/mocha": "^9.0.0", - "@types/node": "^16.7.8", + "@types/node": "^16.7.10", "@types/sinon": "^10.0.2", "@types/which": "^2.0.1", "@types/yallist": "^4.0.1", From 18ad329ccc2950b5481109367594d72ecaeecf27 Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 6 Sep 2021 15:59:52 -0400 Subject: [PATCH 004/112] Release 4.0.0-rc.1 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index cb1132ddb21..ac623c60e6a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "redis", - "version": "4.0.0-rc.0", + "version": "4.0.0-rc.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "redis", - "version": "4.0.0-rc.0", + "version": "4.0.0-rc.1", "license": "MIT", "dependencies": { "cluster-key-slot": "1.1.0", diff --git a/package.json b/package.json index 32cf674a4d2..56a7ed38c65 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redis", - "version": "4.0.0-rc.0", + "version": "4.0.0-rc.1", "description": "A high performance Redis client.", "keywords": [ "database", From 1413a69a6b75253b606ffd211f7f119ec5337894 Mon Sep 17 00:00:00 2001 From: leibale Date: Thu, 9 Sep 2021 16:58:31 -0400 Subject: [PATCH 005/112] add cluster.duplicate, add some tests --- lib/client.ts | 2 +- lib/cluster.ts | 4 +++ lib/commands/GEOPOS.spec.ts | 50 +++++++++++++++++++++++++---- lib/commands/GEOSEARCHSTORE.spec.ts | 9 +++++- lib/commands/PUBSUB_NUMSUB.spec.ts | 2 +- 5 files changed, 58 insertions(+), 9 deletions(-) diff --git a/lib/client.ts b/lib/client.ts index ed06317c14c..139ec647fc3 100644 --- a/lib/client.ts +++ b/lib/client.ts @@ -184,7 +184,7 @@ export default class RedisClient this.#socket.write(encodedCommands) + encodedCommands => this.#socket.write(encodedCommands) ); } diff --git a/lib/cluster.ts b/lib/cluster.ts index 2c1b23465ee..3eeaed5009f 100644 --- a/lib/cluster.ts +++ b/lib/cluster.ts @@ -91,6 +91,10 @@ export default class RedisCluster { + return new (Object.getPrototypeOf(this).constructor)(this.#options); + } + async connect(): Promise { return this.#slots.connect(); } diff --git a/lib/commands/GEOPOS.spec.ts b/lib/commands/GEOPOS.spec.ts index 98cfa6aa2d3..e15abeff516 100644 --- a/lib/commands/GEOPOS.spec.ts +++ b/lib/commands/GEOPOS.spec.ts @@ -1,6 +1,6 @@ import { strict as assert } from 'assert'; import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; -import { transformArguments } from './GEOPOS'; +import { transformArguments, transformReply } from './GEOPOS'; describe('GEOPOS', () => { describe('transformArguments', () => { @@ -19,11 +19,49 @@ describe('GEOPOS', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.geoPos', async client => { - assert.deepEqual( - await client.geoPos('key', 'member'), - [null] - ); + describe('transformReply', () => { + it('null', () => { + assert.deepEqual( + transformReply([null]), + [null] + ); + }); + + it('with member', () => { + assert.deepEqual( + transformReply([['1', '2']]), + [{ + longitude: '1', + latitude: '2' + }] + ); + }); + }); + + describe('client.geoPos', () => { + itWithClient(TestRedisServers.OPEN, 'null', async client => { + assert.deepEqual( + await client.geoPos('key', 'member'), + [null] + ); + }); + + itWithClient(TestRedisServers.OPEN, 'with member', async client => { + const coordinates = { + longitude: '-122.06429868936538696', + latitude: '37.37749628831998194' + }; + + await client.geoAdd('key', { + member: 'member', + ...coordinates + }); + + assert.deepEqual( + await client.geoPos('key', 'member'), + [coordinates] + ); + }); }); itWithCluster(TestRedisClusters.OPEN, 'cluster.geoPos', async cluster => { diff --git a/lib/commands/GEOSEARCHSTORE.spec.ts b/lib/commands/GEOSEARCHSTORE.spec.ts index 1983537077c..ad33c62b78c 100644 --- a/lib/commands/GEOSEARCHSTORE.spec.ts +++ b/lib/commands/GEOSEARCHSTORE.spec.ts @@ -1,6 +1,6 @@ import { strict as assert } from 'assert'; import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster, describeHandleMinimumRedisVersion } from '../test-utils'; -import { transformArguments } from './GEOSEARCHSTORE'; +import { transformArguments, transformReply } from './GEOSEARCHSTORE'; describe('GEOSEARCHSTORE', () => { describeHandleMinimumRedisVersion([6, 2]); @@ -40,6 +40,13 @@ describe('GEOSEARCHSTORE', () => { }); }); + it('transformReply with empty array (https://github.com/redis/redis/issues/9261)', () => { + assert.throws( + () => (transformReply as any)([]), + TypeError + ); + }); + itWithClient(TestRedisServers.OPEN, 'client.geoSearchStore', async client => { await client.geoAdd('source', { longitude: 1, diff --git a/lib/commands/PUBSUB_NUMSUB.spec.ts b/lib/commands/PUBSUB_NUMSUB.spec.ts index 74065dbb48f..403732f8f9d 100644 --- a/lib/commands/PUBSUB_NUMSUB.spec.ts +++ b/lib/commands/PUBSUB_NUMSUB.spec.ts @@ -33,7 +33,7 @@ describe('PUBSUB NUMSUB', () => { ); }); - itWithCluster(TestRedisClusters.OPEN, 'cluster.pubSubNumPat', async cluster => { + itWithCluster(TestRedisClusters.OPEN, 'cluster.pubSubNumSub', async cluster => { assert.deepEqual( await cluster.pubSubNumSub(), Object.create(null) From 08837c864801558ad8020278ad75a3b14a2ed560 Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 13 Sep 2021 19:49:39 -0400 Subject: [PATCH 006/112] fix #1650 - add support for Buffer in some commands, add GET_BUFFER command --- lib/client.spec.ts | 7 ++ lib/client.ts | 94 ++++++++++------------- lib/cluster-slots.ts | 2 +- lib/cluster.ts | 29 +++---- lib/commander.spec.ts | 22 +++++- lib/commander.ts | 20 ++--- lib/commands-queue.ts | 80 +++++-------------- lib/commands/ACL_DELUSER.ts | 3 +- lib/commands/ACL_SETUSER.ts | 3 +- lib/commands/BITOP.ts | 3 +- lib/commands/BLPOP.ts | 3 +- lib/commands/BRPOP.ts | 3 +- lib/commands/BZPOPMAX.ts | 3 +- lib/commands/BZPOPMIN.ts | 3 +- lib/commands/DEL.ts | 3 +- lib/commands/EXISTS.ts | 3 +- lib/commands/GEOHASH.ts | 3 +- lib/commands/GEOPOS.ts | 3 +- lib/commands/GET.ts | 3 +- lib/commands/GET_BUFFER.spec.ts | 22 ++++++ lib/commands/GET_BUFFER.ts | 7 ++ lib/commands/HDEL.ts | 3 +- lib/commands/HMGET.ts | 3 +- lib/commands/LPUSH.ts | 3 +- lib/commands/LPUSHX.ts | 3 +- lib/commands/PFADD.ts | 3 +- lib/commands/PFCOUNT.ts | 3 +- lib/commands/PFMERGE.ts | 3 +- lib/commands/RPUSH.ts | 3 +- lib/commands/RPUSHX.ts | 3 +- lib/commands/SADD.ts | 3 +- lib/commands/SCRIPT_EXISTS.ts | 3 +- lib/commands/SDIFF.ts | 3 +- lib/commands/SDIFFSTORE.ts | 3 +- lib/commands/SET.spec.ts | 2 +- lib/commands/SET.ts | 4 +- lib/commands/SETEX.ts | 3 +- lib/commands/SINTER.ts | 3 +- lib/commands/SINTERSTORE.ts | 3 +- lib/commands/SREM.ts | 3 +- lib/commands/SUNION.ts | 3 +- lib/commands/SUNIONSTORE.ts | 3 +- lib/commands/TOUCH.ts | 3 +- lib/commands/UNLINK.ts | 3 +- lib/commands/WATCH.ts | 3 +- lib/commands/XACK.ts | 3 +- lib/commands/XDEL.ts | 3 +- lib/commands/ZDIFF.ts | 3 +- lib/commands/ZDIFFSTORE.ts | 3 +- lib/commands/ZDIFF_WITHSCORES.ts | 3 +- lib/commands/ZINTER.ts | 3 +- lib/commands/ZINTERSTORE.ts | 3 +- lib/commands/ZINTER_WITHSCORES.ts | 3 +- lib/commands/ZMSCORE.ts | 3 +- lib/commands/ZREM.ts | 3 +- lib/commands/ZUNION.ts | 3 +- lib/commands/ZUNIONSTORE.ts | 3 +- lib/commands/ZUNION_WITHSCORES.ts | 3 +- lib/commands/generic-transformers.ts | 12 ++- lib/commands/index.ts | 10 ++- lib/multi-command.spec.ts | 23 +++--- lib/multi-command.ts | 20 +++-- lib/socket.ts | 28 +++++-- lib/ts-declarations/cluster-key-slot.d.ts | 2 +- lib/ts-declarations/redis-parser.d.ts | 2 + 65 files changed, 300 insertions(+), 227 deletions(-) create mode 100644 lib/commands/GET_BUFFER.spec.ts create mode 100644 lib/commands/GET_BUFFER.ts diff --git a/lib/client.spec.ts b/lib/client.spec.ts index f73049d2286..9f18e184c88 100644 --- a/lib/client.spec.ts +++ b/lib/client.spec.ts @@ -195,6 +195,13 @@ describe('Client', () => { assert.equal(await client.sendCommand(['PING']), 'PONG'); }); + itWithClient(TestRedisServers.OPEN, 'bufferMode', async client => { + assert.deepEqual( + await client.sendCommand(['PING'], undefined, true), + Buffer.from('PONG') + ); + }); + describe('AbortController', () => { before(function () { if (!global.AbortController) { diff --git a/lib/client.ts b/lib/client.ts index 139ec647fc3..aaa982da1cc 100644 --- a/lib/client.ts +++ b/lib/client.ts @@ -1,6 +1,6 @@ import RedisSocket, { RedisSocketOptions } from './socket'; import RedisCommandsQueue, { PubSubListener, PubSubSubscribeCommands, PubSubUnsubscribeCommands, QueueCommandOptions } from './commands-queue'; -import COMMANDS from './commands'; +import COMMANDS, { TransformArgumentsReply } from './commands'; import { RedisCommand, RedisModules, RedisReply } from './commands'; import RedisMultiCommand, { MultiQueuedCommand, RedisMultiCommandType } from './multi-command'; import EventEmitter from 'events'; @@ -62,12 +62,10 @@ export default class RedisClient> { const { args: redisArgs, options } = transformCommandArguments(command, args); - const reply = command.transformReply( - await this.#sendCommand(redisArgs, options), - redisArgs.preserve + return command.transformReply( + await this.#sendCommand(redisArgs, options, command.BUFFER_MODE), + redisArgs.preserve, ); - - return reply; } static async #scriptsExecutor( @@ -77,12 +75,10 @@ export default class RedisClient { const { args: redisArgs, options } = transformCommandArguments(script, args); - const reply = script.transformReply( - await this.executeScript(script, redisArgs, options), + return script.transformReply( + await this.executeScript(script, redisArgs, options, script.BUFFER_MODE), redisArgs.preserve ); - - return reply; } static create(options?: RedisClientOptions): RedisClientType { @@ -182,10 +178,7 @@ export default class RedisClient this.#socket.write(encodedCommands) - ); + return new RedisCommandsQueue(this.#options?.commandsQueueMaxLength); } #legacyMode(): void { @@ -299,7 +292,7 @@ export default class RedisClient { return this.#socket.quit(() => { - const promise = this.#queue.addEncodedCommand(encodeCommand(['QUIT'])); + const promise = this.#queue.addCommand(['QUIT']); this.#tick(); return promise; }); @@ -307,46 +300,64 @@ export default class RedisClient(args: Array, options?: ClientCommandOptions): Promise { - return this.#sendCommand(args, options); + sendCommand(args: TransformArgumentsReply, options?: ClientCommandOptions, bufferMode?: boolean): Promise { + return this.#sendCommand(args, options, bufferMode); } // using `#sendCommand` cause `sendCommand` is overwritten in legacy mode - #sendCommand(args: Array, options?: ClientCommandOptions): Promise { - return this.sendEncodedCommand(encodeCommand(args), options); - } - - async sendEncodedCommand(encodedCommand: string, options?: ClientCommandOptions): Promise { + async #sendCommand(args: TransformArgumentsReply, options?: ClientCommandOptions, bufferMode?: boolean): Promise { if (!this.#socket.isOpen) { throw new ClientClosedError(); } if (options?.isolated) { return this.executeIsolated(isolatedClient => - isolatedClient.sendEncodedCommand(encodedCommand, { + isolatedClient.sendCommand(args, { ...options, isolated: false }) ); } - const promise = this.#queue.addEncodedCommand(encodedCommand, options); + const promise = this.#queue.addCommand(args, options, bufferMode); this.#tick(); return await promise; } + #tick(): void { + if (!this.#socket.isSocketExists) { + return; + } + + this.#socket.cork(); + + while (true) { + const args = this.#queue.getCommandToSend(); + if (args === undefined) break; + + let writeResult; + for (const toWrite of encodeCommand(args)) { + writeResult = this.#socket.write(toWrite); + } + + if (!writeResult) { + break; + } + } + } + executeIsolated(fn: (client: RedisClientType) => T | Promise): Promise { return this.#isolationPool.use(fn); } - async executeScript(script: RedisLuaScript, args: Array, options?: ClientCommandOptions): Promise> { + async executeScript(script: RedisLuaScript, args: TransformArgumentsReply, options?: ClientCommandOptions, bufferMode?: boolean): Promise> { try { return await this.#sendCommand([ 'EVALSHA', script.SHA1, script.NUMBER_OF_KEYS.toString(), ...args - ], options); + ], options, bufferMode); } catch (err: any) { if (!err?.message?.startsWith?.('NOSCRIPT')) { throw err; @@ -357,14 +368,14 @@ export default class RedisClient, chainId?: symbol): Promise> { const promise = Promise.all( - commands.map(({encodedCommand}) => { - return this.#queue.addEncodedCommand(encodedCommand, RedisClient.commandOptions({ + commands.map(({ args }) => { + return this.#queue.addCommand(args, RedisClient.commandOptions({ chainId })); }) @@ -438,31 +449,6 @@ export default class RedisClient this.#tick()); - this.#isTickQueued = true; - return; - } - - const isBuffering = this.#queue.executeChunk(chunkRecommendedSize); - if (isBuffering === true) { - this.#socket.once('drain', () => this.#tick()); - } else if (isBuffering === false) { - this.#tick(); - return; - } - - this.#isTickQueued = false; - } } extendWithDefaultCommands(RedisClient, RedisClient.commandsExecutor); diff --git a/lib/cluster-slots.ts b/lib/cluster-slots.ts index 5fae5b92342..a5155cc53db 100644 --- a/lib/cluster-slots.ts +++ b/lib/cluster-slots.ts @@ -172,7 +172,7 @@ export default class RedisClusterSlots { + getClient(firstKey?: string | Buffer, isReadonly?: boolean): RedisClientType { if (!firstKey) { return this.#getRandomClient(); } diff --git a/lib/cluster.ts b/lib/cluster.ts index 3eeaed5009f..4f1b27cb05f 100644 --- a/lib/cluster.ts +++ b/lib/cluster.ts @@ -1,4 +1,4 @@ -import { RedisCommand, RedisModules } from './commands'; +import { RedisCommand, RedisModules, TransformArgumentsReply } from './commands'; import RedisClient, { ClientCommandOptions, RedisClientType, WithPlugins } from './client'; import { RedisSocketOptions } from './socket'; import RedisClusterSlots, { ClusterNode } from './cluster-slots'; @@ -6,6 +6,7 @@ import { RedisLuaScript, RedisLuaScripts } from './lua-script'; import { extendWithModulesAndScripts, extendWithDefaultCommands, transformCommandArguments } from './commander'; import RedisMultiCommand, { MultiQueuedCommand, RedisMultiCommandType } from './multi-command'; import { EventEmitter } from 'events'; +import cluster from 'cluster'; export interface RedisClusterOptions { rootNodes: Array; @@ -19,7 +20,7 @@ export type RedisClusterType WithPlugins & RedisCluster; export default class RedisCluster extends EventEmitter { - static #extractFirstKey(command: RedisCommand, originalArgs: Array, redisArgs: Array): string | undefined { + static #extractFirstKey(command: RedisCommand, originalArgs: Array, redisArgs: TransformArgumentsReply): string | Buffer | undefined { if (command.FIRST_KEY_INDEX === undefined) { return undefined; } else if (typeof command.FIRST_KEY_INDEX === 'number') { @@ -41,7 +42,8 @@ export default class RedisCluster( - firstKey: string | undefined, + firstKey: string | Buffer | undefined, isReadonly: boolean | undefined, - args: Array, + args: TransformArgumentsReply, options?: ClientCommandOptions, + bufferMode?: boolean, redirections = 0 ): Promise> { const client = this.#slots.getClient(firstKey, isReadonly); try { - return await client.sendCommand(args, options); + return await client.sendCommand(args, options, bufferMode); } catch (err: any) { const shouldRetry = await this.#handleCommandError(err, client, redirections); if (shouldRetry === true) { - return this.sendCommand(firstKey, isReadonly, args, options, redirections + 1); + return this.sendCommand(firstKey, isReadonly, args, options, bufferMode, redirections + 1); } else if (shouldRetry) { - return shouldRetry.sendCommand(args, options); + return shouldRetry.sendCommand(args, options, bufferMode); } throw err; @@ -125,7 +128,7 @@ export default class RedisCluster, - redisArgs: Array, + redisArgs: TransformArgumentsReply, options?: ClientCommandOptions, redirections = 0 ): Promise> { @@ -135,13 +138,13 @@ export default class RedisCluster { - return client.sendEncodedCommand(encodedCommand, RedisClient.commandOptions({ + commands.map(({ args }) => { + return client.sendCommand(args, RedisClient.commandOptions({ chainId })); }) diff --git a/lib/commander.spec.ts b/lib/commander.spec.ts index a38330abada..b6ec1004613 100644 --- a/lib/commander.spec.ts +++ b/lib/commander.spec.ts @@ -2,27 +2,43 @@ import { strict as assert } from 'assert'; import { describe } from 'mocha'; import { encodeCommand } from './commander'; +function encodeCommandToString(...args: Parameters): string { + const arr = []; + for (const item of encodeCommand(...args)) { + arr.push(item.toString()); + } + + return arr.join(''); +} + describe('Commander', () => { describe('encodeCommand (see #1628)', () => { it('1 byte', () => { assert.equal( - encodeCommand(['a', 'z']), + encodeCommandToString(['a', 'z']), '*2\r\n$1\r\na\r\n$1\r\nz\r\n' ); }); it('2 bytes', () => { assert.equal( - encodeCommand(['א', 'ת']), + encodeCommandToString(['א', 'ת']), '*2\r\n$2\r\nא\r\n$2\r\nת\r\n' ); }); it('4 bytes', () => { assert.equal( - encodeCommand(['🐣', '🐤']), + encodeCommandToString(['🐣', '🐤']), '*2\r\n$4\r\n🐣\r\n$4\r\n🐤\r\n' ); }); + + it('with a buffer', () => { + assert.equal( + encodeCommandToString([Buffer.from('string')]), + '*1\r\n$6\r\nstring\r\n' + ); + }); }); }); diff --git a/lib/commander.ts b/lib/commander.ts index e8ff91cc7bf..c2b1918709a 100644 --- a/lib/commander.ts +++ b/lib/commander.ts @@ -2,6 +2,7 @@ import COMMANDS, { RedisCommand, RedisModules, TransformArgumentsReply } from './commands'; import { RedisLuaScript, RedisLuaScripts } from './lua-script'; import { CommandOptions, isCommandOptions } from './command-options'; +import { off } from 'process'; type Instantiable = new(...args: Array) => T; @@ -94,16 +95,15 @@ export function transformCommandArguments( }; } -export function encodeCommand(args: Array): string { - const encoded = [ - `*${args.length}`, - `$${Buffer.byteLength(args[0]).toString()}`, - args[0] - ]; +const DELIMITER = '\r\n'; - for (let i = 1; i < args.length; i++) { - encoded.push(`$${Buffer.byteLength(args[i]).toString()}`, args[i]); - } +export function* encodeCommand(args: TransformArgumentsReply): IterableIterator { + yield `*${args.length}${DELIMITER}`; - return encoded.join('\r\n') + '\r\n'; + for (const arg of args) { + const byteLength = typeof arg === 'string' ? Buffer.byteLength(arg): arg.length; + yield `$${byteLength.toString()}${DELIMITER}`; + yield arg; + yield DELIMITER; + } } diff --git a/lib/commands-queue.ts b/lib/commands-queue.ts index cae3fd6130e..27c83965529 100644 --- a/lib/commands-queue.ts +++ b/lib/commands-queue.ts @@ -2,17 +2,15 @@ import LinkedList from 'yallist'; import RedisParser from 'redis-parser'; import { AbortError } from './errors'; import { RedisReply } from './commands'; -import { encodeCommand } from './commander'; export interface QueueCommandOptions { asap?: boolean; - signal?: any; // TODO: `AbortSignal` type is incorrect chainId?: symbol; + signal?: any; // TODO: `AbortSignal` type is incorrect } interface CommandWaitingToBeSent extends CommandWaitingForReply { - encodedCommand: string; - byteLength: number; + args: Array; chainId?: symbol; abort?: { signal: any; // TODO: `AbortSignal` type is incorrect @@ -24,10 +22,9 @@ interface CommandWaitingForReply { resolve(reply?: any): void; reject(err: Error): void; channelsCounter?: number; + bufferMode?: boolean; } -export type CommandsQueueExecutor = (encodedCommands: string) => boolean | undefined; - export enum PubSubSubscribeCommands { SUBSCRIBE = 'SUBSCRIBE', PSUBSCRIBE = 'PSUBSCRIBE' @@ -57,16 +54,8 @@ export default class RedisCommandsQueue { readonly #maxLength: number | null | undefined; - readonly #executor: CommandsQueueExecutor; - readonly #waitingToBeSent = new LinkedList(); - #waitingToBeSentCommandsLength = 0; - - get waitingToBeSentCommandsLength() { - return this.#waitingToBeSentCommandsLength; - } - readonly #waitingForReply = new LinkedList(); readonly #pubSubState = { @@ -114,12 +103,11 @@ export default class RedisCommandsQueue { #chainInExecution: symbol | undefined; - constructor(maxLength: number | null | undefined, executor: CommandsQueueExecutor) { + constructor(maxLength: number | null | undefined) { this.#maxLength = maxLength; - this.#executor = executor; } - addEncodedCommand(encodedCommand: string, options?: QueueCommandOptions): 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) { @@ -130,11 +118,11 @@ export default class RedisCommandsQueue { return new Promise((resolve, reject) => { const node = new LinkedList.Node({ - encodedCommand, - byteLength: Buffer.byteLength(encodedCommand), + args, chainId: options?.chainId, + bufferMode, resolve, - reject + reject, }); if (options?.signal) { @@ -157,8 +145,6 @@ export default class RedisCommandsQueue { } else { this.#waitingToBeSent.pushNode(node); } - - this.#waitingToBeSentCommandsLength += node.value.byteLength; }); } @@ -233,11 +219,8 @@ export default class RedisCommandsQueue { this.#pubSubState[inProgressKey] += channelsCounter; - const encodedCommand = encodeCommand(commandArgs), - byteLength = Buffer.byteLength(encodedCommand); this.#waitingToBeSent.push({ - encodedCommand, - byteLength, + args: commandArgs, channelsCounter, resolve: () => { this.#pubSubState[inProgressKey] -= channelsCounter; @@ -249,7 +232,6 @@ export default class RedisCommandsQueue { reject(); } }); - this.#waitingToBeSentCommandsLength += byteLength; }); } @@ -267,47 +249,25 @@ export default class RedisCommandsQueue { ]); } - executeChunk(recommendedSize: number): boolean | undefined { - if (!this.#waitingToBeSent.length) return; - - const encoded: Array = []; - let size = 0, - lastCommandChainId: symbol | undefined; - for (const command of this.#waitingToBeSent) { - encoded.push(command.encodedCommand); - size += command.byteLength; - if (size > recommendedSize) { - lastCommandChainId = command.chainId; - break; - } - } - - if (!lastCommandChainId && encoded.length === this.#waitingToBeSent.length) { - lastCommandChainId = this.#waitingToBeSent.tail!.value.chainId; - } - - lastCommandChainId ??= this.#waitingToBeSent.tail?.value.chainId; - - this.#executor(encoded.join('')); - - for (let i = 0; i < encoded.length; i++) { - const waitingToBeSent = this.#waitingToBeSent.shift()!; - if (waitingToBeSent.abort) { - waitingToBeSent.abort.signal.removeEventListener('abort', waitingToBeSent.abort.listener); - } + getCommandToSend(): Array | undefined { + const toSend = this.#waitingToBeSent.shift(); + if (toSend) { this.#waitingForReply.push({ - resolve: waitingToBeSent.resolve, - reject: waitingToBeSent.reject, - channelsCounter: waitingToBeSent.channelsCounter + resolve: toSend.resolve, + reject: toSend.reject, + channelsCounter: toSend.channelsCounter, + bufferMode: toSend.bufferMode }); } - this.#chainInExecution = lastCommandChainId; - this.#waitingToBeSentCommandsLength -= size; + this.#chainInExecution = toSend?.chainId; + + return toSend?.args; } parseResponse(data: Buffer): void { + this.#parser.setReturnBuffers(!!this.#waitingForReply.head?.value.bufferMode); this.#parser.execute(data); } diff --git a/lib/commands/ACL_DELUSER.ts b/lib/commands/ACL_DELUSER.ts index 7fb4904be41..85a916c4379 100644 --- a/lib/commands/ACL_DELUSER.ts +++ b/lib/commands/ACL_DELUSER.ts @@ -1,6 +1,7 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; -export function transformArguments(username: string | Array): Array { +export function transformArguments(username: string | Array): TransformArgumentsReply { return pushVerdictArguments(['ACL', 'DELUSER'], username); } diff --git a/lib/commands/ACL_SETUSER.ts b/lib/commands/ACL_SETUSER.ts index b2829ca964f..e55a8942e02 100644 --- a/lib/commands/ACL_SETUSER.ts +++ b/lib/commands/ACL_SETUSER.ts @@ -1,6 +1,7 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyString } from './generic-transformers'; -export function transformArguments(username: string, rule: string | Array): Array { +export function transformArguments(username: string, rule: string | Array): TransformArgumentsReply { return pushVerdictArguments(['ACL', 'SETUSER', username], rule); } diff --git a/lib/commands/BITOP.ts b/lib/commands/BITOP.ts index fe7d339f5d1..bb965da6dfa 100644 --- a/lib/commands/BITOP.ts +++ b/lib/commands/BITOP.ts @@ -1,10 +1,11 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumber } 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): Array { +export function transformArguments(operation: BitOperations, destKey: string, key: string | Array): TransformArgumentsReply { return pushVerdictArguments(['BITOP', operation, destKey], key); } diff --git a/lib/commands/BLPOP.ts b/lib/commands/BLPOP.ts index 7c352951fb3..1061f5e113a 100644 --- a/lib/commands/BLPOP.ts +++ b/lib/commands/BLPOP.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(keys: string | Array, timeout: number): Array { +export function transformArguments(keys: string | Buffer | Array, timeout: number): TransformArgumentsReply { const args = pushVerdictArguments(['BLPOP'], keys); args.push(timeout.toString()); diff --git a/lib/commands/BRPOP.ts b/lib/commands/BRPOP.ts index a03c278309a..93ded4dbf1a 100644 --- a/lib/commands/BRPOP.ts +++ b/lib/commands/BRPOP.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string | Array, timeout: number): Array { +export function transformArguments(key: string | Array, timeout: number): TransformArgumentsReply { const args = pushVerdictArguments(['BRPOP'], key); args.push(timeout.toString()); diff --git a/lib/commands/BZPOPMAX.ts b/lib/commands/BZPOPMAX.ts index ccd84272a50..3db9ca42cbb 100644 --- a/lib/commands/BZPOPMAX.ts +++ b/lib/commands/BZPOPMAX.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumberInfinity, ZMember } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string | Array, timeout: number): Array { +export function transformArguments(key: string | Array, timeout: number): TransformArgumentsReply { const args = pushVerdictArguments(['BZPOPMAX'], key); args.push(timeout.toString()); diff --git a/lib/commands/BZPOPMIN.ts b/lib/commands/BZPOPMIN.ts index 0c299cdb9df..9106ae770da 100644 --- a/lib/commands/BZPOPMIN.ts +++ b/lib/commands/BZPOPMIN.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumberInfinity, ZMember } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string | Array, timeout: number): Array { +export function transformArguments(key: string | Array, timeout: number): TransformArgumentsReply { const args = pushVerdictArguments(['BZPOPMIN'], key); args.push(timeout.toString()); diff --git a/lib/commands/DEL.ts b/lib/commands/DEL.ts index 3d9a78212f8..f96b6988f1c 100644 --- a/lib/commands/DEL.ts +++ b/lib/commands/DEL.ts @@ -1,6 +1,7 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; -export function transformArguments(keys: string | Array): Array { +export function transformArguments(keys: string | Array): TransformArgumentsReply { return pushVerdictArguments(['DEL'], keys); } diff --git a/lib/commands/EXISTS.ts b/lib/commands/EXISTS.ts index 5a76ca833fb..00d10b9eebc 100644 --- a/lib/commands/EXISTS.ts +++ b/lib/commands/EXISTS.ts @@ -1,10 +1,11 @@ +import { TransformArgumentsReply } 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): Array { +export function transformArguments(keys: string | Array): TransformArgumentsReply { return pushVerdictArguments(['EXISTS'], keys); } diff --git a/lib/commands/GEOHASH.ts b/lib/commands/GEOHASH.ts index a46738955d3..a95ae443408 100644 --- a/lib/commands/GEOHASH.ts +++ b/lib/commands/GEOHASH.ts @@ -1,10 +1,11 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyStringArray } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; -export function transformArguments(key: string, member: string | Array): Array { +export function transformArguments(key: string, member: string | Array): TransformArgumentsReply { return pushVerdictArguments(['GEOHASH', key], member); } diff --git a/lib/commands/GEOPOS.ts b/lib/commands/GEOPOS.ts index 46b0a153ba9..893048cf6da 100644 --- a/lib/commands/GEOPOS.ts +++ b/lib/commands/GEOPOS.ts @@ -1,10 +1,11 @@ +import { TransformArgumentsReply } 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): Array { +export function transformArguments(key: string, member: string | Array): TransformArgumentsReply { return pushVerdictArguments(['GEOPOS', key], member); } diff --git a/lib/commands/GET.ts b/lib/commands/GET.ts index 714ad953d8e..6c6475a9d24 100644 --- a/lib/commands/GET.ts +++ b/lib/commands/GET.ts @@ -1,10 +1,11 @@ +import { TransformArgumentsReply } from '.'; import { transformReplyString } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; -export function transformArguments(key: string): Array { +export function transformArguments(key: string | Buffer): TransformArgumentsReply { return ['GET', key]; } diff --git a/lib/commands/GET_BUFFER.spec.ts b/lib/commands/GET_BUFFER.spec.ts new file mode 100644 index 00000000000..533eb808c49 --- /dev/null +++ b/lib/commands/GET_BUFFER.spec.ts @@ -0,0 +1,22 @@ +import { strict as assert } from 'assert'; +import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; + +describe('GET_BUFFER', () => { + itWithClient(TestRedisServers.OPEN, 'client.getBuffer', async client => { + const buffer = Buffer.from('string'); + await client.set('key', buffer); + assert.deepEqual( + buffer, + await client.getBuffer('key') + ); + }); + + itWithCluster(TestRedisClusters.OPEN, 'cluster.getBuffer', async cluster => { + const buffer = Buffer.from('string'); + await cluster.set('key', buffer); + assert.deepEqual( + buffer, + await cluster.getBuffer('key') + ); + }); +}); diff --git a/lib/commands/GET_BUFFER.ts b/lib/commands/GET_BUFFER.ts new file mode 100644 index 00000000000..3d6f454898b --- /dev/null +++ b/lib/commands/GET_BUFFER.ts @@ -0,0 +1,7 @@ +import { transformReplyBuffer } from './generic-transformers'; + +export { FIRST_KEY_INDEX, IS_READ_ONLY, transformArguments } from './GET'; + +export const BUFFER_MODE = true; + +export const transformReply = transformReplyBuffer; diff --git a/lib/commands/HDEL.ts b/lib/commands/HDEL.ts index ee961931449..4785b0e67f9 100644 --- a/lib/commands/HDEL.ts +++ b/lib/commands/HDEL.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, field: string | Array): Array { +export function transformArguments(key: string, field: string | Array): TransformArgumentsReply { return pushVerdictArguments(['HDEL', key], field); } diff --git a/lib/commands/HMGET.ts b/lib/commands/HMGET.ts index fc0f91d8224..9f26eeba640 100644 --- a/lib/commands/HMGET.ts +++ b/lib/commands/HMGET.ts @@ -1,10 +1,11 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyStringArray } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; -export function transformArguments(key: string, fields: string | Array): Array { +export function transformArguments(key: string, fields: string | Array): TransformArgumentsReply { return pushVerdictArguments(['HMGET', key], fields); } diff --git a/lib/commands/LPUSH.ts b/lib/commands/LPUSH.ts index 434ad619cb7..7416d4946ea 100644 --- a/lib/commands/LPUSH.ts +++ b/lib/commands/LPUSH.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, elements: string | Array): Array { +export function transformArguments(key: string, elements: string | Array): TransformArgumentsReply { return pushVerdictArguments(['LPUSH', key], elements);} export const transformReply = transformReplyNumber; diff --git a/lib/commands/LPUSHX.ts b/lib/commands/LPUSHX.ts index f1a989d9625..f89623ace3a 100644 --- a/lib/commands/LPUSHX.ts +++ b/lib/commands/LPUSHX.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, element: string | Array): Array { +export function transformArguments(key: string, element: string | Array): TransformArgumentsReply { return pushVerdictArguments(['LPUSHX', key], element); } diff --git a/lib/commands/PFADD.ts b/lib/commands/PFADD.ts index 3348a98852a..cc99bed7f65 100644 --- a/lib/commands/PFADD.ts +++ b/lib/commands/PFADD.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyBoolean } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, element: string | Array): Array { +export function transformArguments(key: string, element: string | Array): TransformArgumentsReply { return pushVerdictArguments(['PFADD', key], element); } diff --git a/lib/commands/PFCOUNT.ts b/lib/commands/PFCOUNT.ts index eac710a3543..52963697adf 100644 --- a/lib/commands/PFCOUNT.ts +++ b/lib/commands/PFCOUNT.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string | Array): Array { +export function transformArguments(key: string | Array): TransformArgumentsReply { return pushVerdictArguments(['PFCOUNT'], key); } diff --git a/lib/commands/PFMERGE.ts b/lib/commands/PFMERGE.ts index 73a4a2edb9a..c4ba11877f7 100644 --- a/lib/commands/PFMERGE.ts +++ b/lib/commands/PFMERGE.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyString } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(destination: string, source: string | Array): Array { +export function transformArguments(destination: string, source: string | Array): TransformArgumentsReply { return pushVerdictArguments(['PFMERGE', destination], source); } diff --git a/lib/commands/RPUSH.ts b/lib/commands/RPUSH.ts index 191d2704e09..665094f47a5 100644 --- a/lib/commands/RPUSH.ts +++ b/lib/commands/RPUSH.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, element: string | Array): Array { +export function transformArguments(key: string, element: string | Array): TransformArgumentsReply { return pushVerdictArguments(['RPUSH', key], element); } diff --git a/lib/commands/RPUSHX.ts b/lib/commands/RPUSHX.ts index a07615a58e0..fe1f969f3f6 100644 --- a/lib/commands/RPUSHX.ts +++ b/lib/commands/RPUSHX.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, element: string | Array): Array { +export function transformArguments(key: string, element: string | Array): TransformArgumentsReply { return pushVerdictArguments(['RPUSHX', key], element); } diff --git a/lib/commands/SADD.ts b/lib/commands/SADD.ts index a14ba1686c0..a432ccfef59 100644 --- a/lib/commands/SADD.ts +++ b/lib/commands/SADD.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, members: string | Array): Array { +export function transformArguments(key: string, members: string | Array): TransformArgumentsReply { return pushVerdictArguments(['SADD', key], members); } diff --git a/lib/commands/SCRIPT_EXISTS.ts b/lib/commands/SCRIPT_EXISTS.ts index b127a0b261b..47a7f456e9b 100644 --- a/lib/commands/SCRIPT_EXISTS.ts +++ b/lib/commands/SCRIPT_EXISTS.ts @@ -1,6 +1,7 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyBooleanArray } from './generic-transformers'; -export function transformArguments(sha1: string | Array): Array { +export function transformArguments(sha1: string | Array): TransformArgumentsReply { return pushVerdictArguments(['SCRIPT', 'EXISTS'], sha1); } diff --git a/lib/commands/SDIFF.ts b/lib/commands/SDIFF.ts index 496ed593370..4d5aaea1a06 100644 --- a/lib/commands/SDIFF.ts +++ b/lib/commands/SDIFF.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyStringArray } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(keys: string | Array): Array { +export function transformArguments(keys: string | Array): TransformArgumentsReply { return pushVerdictArguments(['SDIFF'], keys); } diff --git a/lib/commands/SDIFFSTORE.ts b/lib/commands/SDIFFSTORE.ts index 295433602fb..69883d4124c 100644 --- a/lib/commands/SDIFFSTORE.ts +++ b/lib/commands/SDIFFSTORE.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(destination: string, keys: string | Array): Array { +export function transformArguments(destination: string, keys: string | Array): TransformArgumentsReply { return pushVerdictArguments(['SDIFFSTORE', destination], keys); } diff --git a/lib/commands/SET.spec.ts b/lib/commands/SET.spec.ts index a587f6c3120..32d138f2920 100644 --- a/lib/commands/SET.spec.ts +++ b/lib/commands/SET.spec.ts @@ -106,7 +106,7 @@ describe('SET', () => { 'OK' ); }); - + itWithClient(TestRedisServers.OPEN, 'with GET on empty key', async client => { assert.equal( await client.set('key', 'value', { diff --git a/lib/commands/SET.ts b/lib/commands/SET.ts index 4d5919cde21..03853b3f7d6 100644 --- a/lib/commands/SET.ts +++ b/lib/commands/SET.ts @@ -1,3 +1,5 @@ +import { TransformArgumentsReply } from '.'; + export const FIRST_KEY_INDEX = 1; interface EX { @@ -38,7 +40,7 @@ interface SetCommonOptions { type SetOptions = SetTTL & SetGuards & (SetCommonOptions | {}); -export function transformArguments(key: string, value: string, options?: SetOptions): Array { +export function transformArguments(key: string | Buffer, value: string | Buffer, options?: SetOptions): TransformArgumentsReply { const args = ['SET', key, value]; if (!options) { diff --git a/lib/commands/SETEX.ts b/lib/commands/SETEX.ts index 57c32db6ffe..320278c9264 100644 --- a/lib/commands/SETEX.ts +++ b/lib/commands/SETEX.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { transformReplyString } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, seconds: number, value: string): Array { +export function transformArguments(key: string | Buffer, seconds: number, value: string): TransformArgumentsReply { return [ 'SETEX', key, diff --git a/lib/commands/SINTER.ts b/lib/commands/SINTER.ts index 104e81b9214..43869652370 100644 --- a/lib/commands/SINTER.ts +++ b/lib/commands/SINTER.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyStringArray } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(keys: string | Array): Array { +export function transformArguments(keys: string | Array): TransformArgumentsReply { return pushVerdictArguments(['SINTER'], keys); } diff --git a/lib/commands/SINTERSTORE.ts b/lib/commands/SINTERSTORE.ts index a7a4d4fd106..5ad1b11cbac 100644 --- a/lib/commands/SINTERSTORE.ts +++ b/lib/commands/SINTERSTORE.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyStringArray } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(destination: string, keys: string | Array): Array { +export function transformArguments(destination: string, keys: string | Array): TransformArgumentsReply { return pushVerdictArguments(['SINTERSTORE', destination], keys); } diff --git a/lib/commands/SREM.ts b/lib/commands/SREM.ts index d1021bb3a19..4ae33245d29 100644 --- a/lib/commands/SREM.ts +++ b/lib/commands/SREM.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, members: string | Array): Array { +export function transformArguments(key: string, members: string | Array): TransformArgumentsReply { return pushVerdictArguments(['SREM', key], members); } diff --git a/lib/commands/SUNION.ts b/lib/commands/SUNION.ts index 3f06138b1b6..705bff29927 100644 --- a/lib/commands/SUNION.ts +++ b/lib/commands/SUNION.ts @@ -1,10 +1,11 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyStringArray } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; -export function transformArguments(keys: string | Array): Array { +export function transformArguments(keys: string | Array): TransformArgumentsReply { return pushVerdictArguments(['SUNION'], keys); } diff --git a/lib/commands/SUNIONSTORE.ts b/lib/commands/SUNIONSTORE.ts index 7a1aab80117..af717f627df 100644 --- a/lib/commands/SUNIONSTORE.ts +++ b/lib/commands/SUNIONSTORE.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(destination: string, keys: string | Array): Array { +export function transformArguments(destination: string, keys: string | Array): TransformArgumentsReply { return pushVerdictArguments(['SUNIONSTORE', destination], keys); } diff --git a/lib/commands/TOUCH.ts b/lib/commands/TOUCH.ts index f2fb0548970..abff4160392 100644 --- a/lib/commands/TOUCH.ts +++ b/lib/commands/TOUCH.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string | Array): Array { +export function transformArguments(key: string | Array): TransformArgumentsReply { return pushVerdictArguments(['TOUCH'], key); } diff --git a/lib/commands/UNLINK.ts b/lib/commands/UNLINK.ts index 9dfe0ca48ea..4647a976e42 100644 --- a/lib/commands/UNLINK.ts +++ b/lib/commands/UNLINK.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string | Array): Array { +export function transformArguments(key: string | Array): TransformArgumentsReply { return pushVerdictArguments(['UNLINK'], key); } diff --git a/lib/commands/WATCH.ts b/lib/commands/WATCH.ts index 5e24ca37952..e644ab0f462 100644 --- a/lib/commands/WATCH.ts +++ b/lib/commands/WATCH.ts @@ -1,6 +1,7 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyString } from './generic-transformers'; -export function transformArguments(key: string | Array): Array { +export function transformArguments(key: string | Array): TransformArgumentsReply { return pushVerdictArguments(['WATCH'], key); } diff --git a/lib/commands/XACK.ts b/lib/commands/XACK.ts index 969f9b6a8b9..a6de28151eb 100644 --- a/lib/commands/XACK.ts +++ b/lib/commands/XACK.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, group: string, id: string | Array): Array { +export function transformArguments(key: string, group: string, id: string | Array): TransformArgumentsReply { return pushVerdictArguments(['XACK', key, group], id); } diff --git a/lib/commands/XDEL.ts b/lib/commands/XDEL.ts index 9d173271c28..083ea77ef0f 100644 --- a/lib/commands/XDEL.ts +++ b/lib/commands/XDEL.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, id: string | Array): Array { +export function transformArguments(key: string, id: string | Array): TransformArgumentsReply { return pushVerdictArguments(['XDEL', key], id); } diff --git a/lib/commands/ZDIFF.ts b/lib/commands/ZDIFF.ts index f557b597ec4..7154947fea7 100644 --- a/lib/commands/ZDIFF.ts +++ b/lib/commands/ZDIFF.ts @@ -1,10 +1,11 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArgument, transformReplyStringArray } from './generic-transformers'; export const FIRST_KEY_INDEX = 2; export const IS_READ_ONLY = true; -export function transformArguments(keys: Array | string): Array { +export function transformArguments(keys: Array | string): TransformArgumentsReply { return pushVerdictArgument(['ZDIFF'], keys); } diff --git a/lib/commands/ZDIFFSTORE.ts b/lib/commands/ZDIFFSTORE.ts index de409c0939a..f91d4c869ba 100644 --- a/lib/commands/ZDIFFSTORE.ts +++ b/lib/commands/ZDIFFSTORE.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArgument, transformReplyNumber } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(destination: string, keys: Array | string): Array { +export function transformArguments(destination: string, keys: Array | string): TransformArgumentsReply { return pushVerdictArgument(['ZDIFFSTORE', destination], keys); } diff --git a/lib/commands/ZDIFF_WITHSCORES.ts b/lib/commands/ZDIFF_WITHSCORES.ts index 26effab7189..84126853361 100644 --- a/lib/commands/ZDIFF_WITHSCORES.ts +++ b/lib/commands/ZDIFF_WITHSCORES.ts @@ -1,9 +1,10 @@ +import { TransformArgumentsReply } 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): Array { +export function transformArguments(...args: Parameters): TransformArgumentsReply { return [ ...transformZDiffArguments(...args), 'WITHSCORES' diff --git a/lib/commands/ZINTER.ts b/lib/commands/ZINTER.ts index 90a42eda0d3..91d7982a8e7 100644 --- a/lib/commands/ZINTER.ts +++ b/lib/commands/ZINTER.ts @@ -1,3 +1,4 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArgument, transformReplyStringArray } from './generic-transformers'; export const FIRST_KEY_INDEX = 2; @@ -9,7 +10,7 @@ interface ZInterOptions { AGGREGATE?: 'SUM' | 'MIN' | 'MAX'; } -export function transformArguments(keys: Array | string, options?: ZInterOptions): Array { +export function transformArguments(keys: Array | string, options?: ZInterOptions): TransformArgumentsReply { const args = pushVerdictArgument(['ZINTER'], keys); if (options?.WEIGHTS) { diff --git a/lib/commands/ZINTERSTORE.ts b/lib/commands/ZINTERSTORE.ts index a026916ce1f..6e79e423cb0 100644 --- a/lib/commands/ZINTERSTORE.ts +++ b/lib/commands/ZINTERSTORE.ts @@ -1,3 +1,4 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArgument, transformReplyNumber } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,7 +8,7 @@ interface ZInterStoreOptions { AGGREGATE?: 'SUM' | 'MIN' | 'MAX'; } -export function transformArguments(destination: string, keys: Array | string, options?: ZInterStoreOptions): Array { +export function transformArguments(destination: string, keys: Array | string, options?: ZInterStoreOptions): TransformArgumentsReply { const args = pushVerdictArgument(['ZINTERSTORE', destination], keys); if (options?.WEIGHTS) { diff --git a/lib/commands/ZINTER_WITHSCORES.ts b/lib/commands/ZINTER_WITHSCORES.ts index 0a82228fce9..f4287d1a684 100644 --- a/lib/commands/ZINTER_WITHSCORES.ts +++ b/lib/commands/ZINTER_WITHSCORES.ts @@ -1,9 +1,10 @@ +import { TransformArgumentsReply } 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): Array { +export function transformArguments(...args: Parameters): TransformArgumentsReply { return [ ...transformZInterArguments(...args), 'WITHSCORES' diff --git a/lib/commands/ZMSCORE.ts b/lib/commands/ZMSCORE.ts index 8a6f73c7836..373adac3cf0 100644 --- a/lib/commands/ZMSCORE.ts +++ b/lib/commands/ZMSCORE.ts @@ -1,10 +1,11 @@ +import { TransformArgumentsReply } 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): Array { +export function transformArguments(key: string, member: string | Array): TransformArgumentsReply { return pushVerdictArguments(['ZMSCORE', key], member); } diff --git a/lib/commands/ZREM.ts b/lib/commands/ZREM.ts index 089b6136afd..8419291f2fd 100644 --- a/lib/commands/ZREM.ts +++ b/lib/commands/ZREM.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, member: string | Array): Array { +export function transformArguments(key: string, member: string | Array): TransformArgumentsReply { return pushVerdictArguments(['ZREM', key], member); } diff --git a/lib/commands/ZUNION.ts b/lib/commands/ZUNION.ts index efdfccb1ff4..87158b8425a 100644 --- a/lib/commands/ZUNION.ts +++ b/lib/commands/ZUNION.ts @@ -1,3 +1,4 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArgument, transformReplyStringArray } from './generic-transformers'; export const FIRST_KEY_INDEX = 2; @@ -9,7 +10,7 @@ interface ZUnionOptions { AGGREGATE?: 'SUM' | 'MIN' | 'MAX'; } -export function transformArguments(keys: Array | string, options?: ZUnionOptions): Array { +export function transformArguments(keys: Array | string, options?: ZUnionOptions): TransformArgumentsReply { const args = pushVerdictArgument(['ZUNION'], keys); if (options?.WEIGHTS) { diff --git a/lib/commands/ZUNIONSTORE.ts b/lib/commands/ZUNIONSTORE.ts index c03f1203706..4ebbdbd8591 100644 --- a/lib/commands/ZUNIONSTORE.ts +++ b/lib/commands/ZUNIONSTORE.ts @@ -1,3 +1,4 @@ +import { TransformArgumentsReply } from '.'; import { pushVerdictArgument, transformReplyNumber } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,7 +8,7 @@ interface ZUnionOptions { AGGREGATE?: 'SUM' | 'MIN' | 'MAX'; } -export function transformArguments(destination: string, keys: Array | string, options?: ZUnionOptions): Array { +export function transformArguments(destination: string, keys: Array | string, options?: ZUnionOptions): TransformArgumentsReply { const args = pushVerdictArgument(['ZUNIONSTORE', destination], keys); if (options?.WEIGHTS) { diff --git a/lib/commands/ZUNION_WITHSCORES.ts b/lib/commands/ZUNION_WITHSCORES.ts index d0cef45cfb1..2215dad9749 100644 --- a/lib/commands/ZUNION_WITHSCORES.ts +++ b/lib/commands/ZUNION_WITHSCORES.ts @@ -1,9 +1,10 @@ +import { TransformArgumentsReply } 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): Array { +export function transformArguments(...args: Parameters): TransformArgumentsReply { return [ ...transformZUnionArguments(...args), 'WITHSCORES' diff --git a/lib/commands/generic-transformers.ts b/lib/commands/generic-transformers.ts index 8105bfe903f..496745cb1f1 100644 --- a/lib/commands/generic-transformers.ts +++ b/lib/commands/generic-transformers.ts @@ -20,6 +20,10 @@ export function transformReplyString(reply: string): string { return reply; } +export function transformReplyBuffer(reply: Buffer): Buffer { + return reply; +} + export function transformReplyStringNull(reply: string | null): string | null { return reply; } @@ -352,11 +356,11 @@ export function pushStringTuplesArguments(args: Array, tuples: StringTup return args; } -export function pushVerdictArguments(args: TransformArgumentsReply, value: string | Array): TransformArgumentsReply { - if (typeof value === 'string') { - args.push(value); - } else { +export function pushVerdictArguments(args: TransformArgumentsReply, value: string | Buffer | Array): TransformArgumentsReply { + if (Array.isArray(value)) { args.push(...value); + } else { + args.push(value); } return args; diff --git a/lib/commands/index.ts b/lib/commands/index.ts index cffb47c668a..dce28ac0937 100644 --- a/lib/commands/index.ts +++ b/lib/commands/index.ts @@ -61,6 +61,7 @@ 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'; @@ -370,6 +371,8 @@ export default { geoSearch: GEOSEARCH, GEOSEARCHSTORE, geoSearchStore: GEOSEARCHSTORE, + GET_BUFFER, + getBuffer: GET_BUFFER, GET, get: GET, GETBIT, @@ -733,15 +736,16 @@ export default { zUnionStore: ZUNIONSTORE }; -export type RedisReply = string | number | Array | null | undefined; +export type RedisReply = string | number | Buffer | Array | null | undefined; -export type TransformArgumentsReply = Array & { preserve?: unknown }; +export type TransformArgumentsReply = Array & { preserve?: unknown }; export interface RedisCommand { FIRST_KEY_INDEX?: number | ((...args: Array) => string); IS_READ_ONLY?: boolean; transformArguments(...args: Array): TransformArgumentsReply; - transformReply(reply: RedisReply, preserved: unknown): any; + BUFFER_MODE?: boolean; + transformReply(reply: RedisReply, preserved?: unknown): any; } export interface RedisCommands { diff --git a/lib/multi-command.spec.ts b/lib/multi-command.spec.ts index a78cc8b2e08..52ecfb94b1c 100644 --- a/lib/multi-command.spec.ts +++ b/lib/multi-command.spec.ts @@ -1,6 +1,5 @@ import { strict as assert } from 'assert'; import RedisMultiCommand from './multi-command'; -import { encodeCommand } from './commander'; import { WatchError } from './errors'; import { spy } from 'sinon'; import { SQUARE_SCRIPT } from './client.spec'; @@ -10,11 +9,11 @@ describe('Multi Command', () => { it('simple', async () => { const multi = RedisMultiCommand.create((queue, symbol) => { assert.deepEqual( - queue.map(({encodedCommand}) => encodedCommand), + queue.map(({ args }) => args), [ - encodeCommand(['MULTI']), - encodeCommand(['PING']), - encodeCommand(['EXEC']), + ['MULTI'], + ['PING'], + ['EXEC'], ] ); @@ -55,8 +54,8 @@ describe('Multi Command', () => { it('execAsPipeline', async () => { const multi = RedisMultiCommand.create(queue => { assert.deepEqual( - queue.map(({encodedCommand}) => encodedCommand), - [encodeCommand(['PING'])] + queue.map(({ args }) => args), + [['PING']] ); return Promise.resolve(['PONG']); @@ -75,8 +74,8 @@ describe('Multi Command', () => { it('simple', async () => { const multi = RedisMultiCommand.create(queue => { assert.deepEqual( - queue.map(({encodedCommand}) => encodedCommand), - [encodeCommand(['PING'])] + queue.map(({ args }) => args), + [['PING']] ); return Promise.resolve(['PONG']); @@ -111,10 +110,10 @@ describe('Multi Command', () => { assert.deepEqual( await new MultiWithScript(queue => { assert.deepEqual( - queue.map(({encodedCommand}) => encodedCommand), + queue.map(({ args }) => args), [ - encodeCommand(['EVAL', SQUARE_SCRIPT.SCRIPT, '0', '2']), - encodeCommand(['EVALSHA', SQUARE_SCRIPT.SHA1, '0', '3']), + ['EVAL', SQUARE_SCRIPT.SCRIPT, '0', '2'], + ['EVALSHA', SQUARE_SCRIPT.SHA1, '0', '3'], ] ); diff --git a/lib/multi-command.ts b/lib/multi-command.ts index c8a50765967..53f439d8f36 100644 --- a/lib/multi-command.ts +++ b/lib/multi-command.ts @@ -2,7 +2,7 @@ import COMMANDS, { TransformArgumentsReply } from './commands'; import { RedisCommand, RedisModules, RedisReply } from './commands'; import { RedisLuaScript, RedisLuaScripts } from './lua-script'; import { RedisClientOptions } from './client'; -import { extendWithModulesAndScripts, extendWithDefaultCommands, encodeCommand } from './commander'; +import { extendWithModulesAndScripts, extendWithDefaultCommands } from './commander'; import { WatchError } from './errors'; type RedisMultiCommandSignature = (...args: Parameters) => RedisMultiCommandType; @@ -24,7 +24,7 @@ type WithScripts = { export type RedisMultiCommandType = RedisMultiCommand & WithCommands & WithModules & WithScripts; export interface MultiQueuedCommand { - encodedCommand: string; + args: TransformArgumentsReply; preservedArguments?: unknown; transformReply?: RedisCommand['transformReply']; } @@ -62,7 +62,9 @@ export default class RedisMultiCommand): this => { this.#queue.push({ - encodedCommand: encodeCommand(args.flat() as Array) + args: args.flat() as Array }); return this; } @@ -153,7 +155,7 @@ export default class RedisMultiCommand); diff --git a/lib/socket.ts b/lib/socket.ts index 66cd28d91d5..23daee14c37 100644 --- a/lib/socket.ts +++ b/lib/socket.ts @@ -91,10 +91,8 @@ export default class RedisSocket extends EventEmitter { return this.#isOpen; } - get chunkRecommendedSize(): number { - if (!this.#socket) return 0; - - return this.#socket.writableHighWaterMark - this.#socket.writableLength; + get isSocketExists(): boolean { + return !!this.#socket; } constructor(initiator?: RedisSocketInitiator, options?: RedisSocketOptions) { @@ -214,12 +212,12 @@ export default class RedisSocket extends EventEmitter { .catch(err => this.emit('error', err)); } - write(encodedCommands: string): boolean { + write(toWrite: string | Buffer): boolean { if (!this.#socket) { throw new ClientClosedError(); } - return this.#socket.write(encodedCommands); + return this.#socket.write(toWrite); } async disconnect(ignoreIsOpen = false): Promise { @@ -251,4 +249,22 @@ export default class RedisSocket extends EventEmitter { throw err; } } + + #isCorked = false; + + cork(): void { + if (!this.#socket) { + return; + } + + if (!this.#isCorked) { + this.#socket.cork(); + this.#isCorked = true; + + queueMicrotask(() => { + this.#socket?.uncork(); + this.#isCorked = false; + }); + } + } } diff --git a/lib/ts-declarations/cluster-key-slot.d.ts b/lib/ts-declarations/cluster-key-slot.d.ts index 5774c50fbd4..60421de296b 100644 --- a/lib/ts-declarations/cluster-key-slot.d.ts +++ b/lib/ts-declarations/cluster-key-slot.d.ts @@ -1,3 +1,3 @@ declare module 'cluster-key-slot' { - export default function calculateSlot(key: string): number; + export default function calculateSlot(key: string | Buffer): number; } diff --git a/lib/ts-declarations/redis-parser.d.ts b/lib/ts-declarations/redis-parser.d.ts index 68659616b93..7ec129ed8cd 100644 --- a/lib/ts-declarations/redis-parser.d.ts +++ b/lib/ts-declarations/redis-parser.d.ts @@ -8,6 +8,8 @@ declare module 'redis-parser' { export default class RedisParser { constructor(callbacks: RedisParserCallbacks); + setReturnBuffers(returnBuffers?: boolean): void; + execute(buffer: Buffer): void; } } From 9fc08d449ce357a8fd2f00187e993670be310cff Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 13 Sep 2021 19:55:37 -0400 Subject: [PATCH 007/112] fix GET and GET_BUFFER return type --- lib/commands/GET.ts | 4 ++-- lib/commands/GET_BUFFER.ts | 4 ++-- lib/commands/generic-transformers.ts | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/commands/GET.ts b/lib/commands/GET.ts index 6c6475a9d24..541790e54e4 100644 --- a/lib/commands/GET.ts +++ b/lib/commands/GET.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { transformReplyString } from './generic-transformers'; +import { transformReplyStringNull } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -9,4 +9,4 @@ export function transformArguments(key: string | Buffer): TransformArgumentsRepl return ['GET', key]; } -export const transformReply = transformReplyString; +export const transformReply = transformReplyStringNull; diff --git a/lib/commands/GET_BUFFER.ts b/lib/commands/GET_BUFFER.ts index 3d6f454898b..9d281961130 100644 --- a/lib/commands/GET_BUFFER.ts +++ b/lib/commands/GET_BUFFER.ts @@ -1,7 +1,7 @@ -import { transformReplyBuffer } from './generic-transformers'; +import { transformReplyBufferNull } from './generic-transformers'; export { FIRST_KEY_INDEX, IS_READ_ONLY, transformArguments } from './GET'; export const BUFFER_MODE = true; -export const transformReply = transformReplyBuffer; +export const transformReply = transformReplyBufferNull; diff --git a/lib/commands/generic-transformers.ts b/lib/commands/generic-transformers.ts index 496745cb1f1..bbc12ee113e 100644 --- a/lib/commands/generic-transformers.ts +++ b/lib/commands/generic-transformers.ts @@ -20,10 +20,6 @@ export function transformReplyString(reply: string): string { return reply; } -export function transformReplyBuffer(reply: Buffer): Buffer { - return reply; -} - export function transformReplyStringNull(reply: string | null): string | null { return reply; } @@ -54,6 +50,10 @@ 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 { From b91897acdbc3c38c63013aaca0a6cc8bc240c162 Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 13 Sep 2021 20:05:29 -0400 Subject: [PATCH 008/112] update FAQ --- docs/FAQ.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/FAQ.md b/docs/FAQ.md index b5074e73025..cfdb2ecaf42 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -8,6 +8,6 @@ When a socket closed unexpectedly, all the commands that were already sent will ## How are commands batched? -Commands are pipelined using [`queueMicrotask`](https://nodejs.org/api/globals.html#globals_queuemicrotask_callback). Commands from the same "tick" will be sent in batches and respect the [`writableHighWaterMark`](https://nodejs.org/api/stream.html#stream_new_stream_writable_options). +Commands are pipelined using [`queueMicrotask`](https://nodejs.org/api/globals.html#globals_queuemicrotask_callback). If `socket.write()` returns `false`—meaning that ["all or part of the data was queued in user memory"](https://nodejs.org/api/net.html#net_socket_write_data_encoding_callback:~:text=all%20or%20part%20of%20the%20data%20was%20queued%20in%20user%20memory)—the commands will stack in memory until the [`drain`](https://nodejs.org/api/net.html#net_event_drain) event is fired. From 64f456767e489d2817ab58a5b86b6604d4eb339d Mon Sep 17 00:00:00 2001 From: Richard Samuelsson Date: Tue, 14 Sep 2021 04:08:11 +0200 Subject: [PATCH 009/112] Update invalid code example in README.md (#1654) * Update invalid code example in README.md * Update README.md Co-authored-by: Leibale Eidelman --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index db0fa71cc7f..bbcb7edc976 100644 --- a/README.md +++ b/README.md @@ -111,8 +111,7 @@ await client.set('another-key', 'another-value'); const [ setKeyReply, otherKeyValue ] = await client.multi() .set('key', 'value') .get('another-key') - .exec() -]); // ['OK', 'another-value'] + .exec(); // ['OK', 'another-value'] ``` You can also [watch](https://redis.io/topics/transactions#optimistic-locking-using-check-and-set) keys by calling `.watch()`. Your transaction will abort if any of the watched keys change. From 0f5a2784974589e8ef54603b6dacaf72d2cc6335 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 14 Sep 2021 11:09:31 -0400 Subject: [PATCH 010/112] fix #1652 --- lib/client.spec.ts | 3 +++ lib/commands-queue.ts | 17 +++++++---------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/client.spec.ts b/lib/client.spec.ts index 9f18e184c88..7f1a534352c 100644 --- a/lib/client.spec.ts +++ b/lib/client.spec.ts @@ -516,6 +516,9 @@ describe('Client', () => { assert.ok(channelListener1.calledOnce); assert.ok(channelListener2.calledTwice); assert.ok(patternListener.calledThrice); + + // should be able to send commands when unsubsribed from all channels (see #1652) + await assert.doesNotReject(subscriber.ping()); } finally { await subscriber.disconnect(); } diff --git a/lib/commands-queue.ts b/lib/commands-queue.ts index 27c83965529..ef87184193f 100644 --- a/lib/commands-queue.ts +++ b/lib/commands-queue.ts @@ -171,8 +171,9 @@ export default class RedisCommandsQueue { unsubscribe(command: PubSubUnsubscribeCommands, channels?: string | Array, listener?: PubSubListener): Promise { const listeners = command === PubSubUnsubscribeCommands.UNSUBSCRIBE ? this.#pubSubListeners.channels : this.#pubSubListeners.patterns; if (!channels) { + const size = listeners.size; listeners.clear(); - return this.#pushPubSubCommand(command); + return this.#pushPubSubCommand(command, size); } const channelsToUnsubscribe = []; @@ -199,22 +200,18 @@ export default class RedisCommandsQueue { return this.#pushPubSubCommand(command, channelsToUnsubscribe); } - #pushPubSubCommand(command: PubSubSubscribeCommands | PubSubUnsubscribeCommands, channels?: Array): Promise { + #pushPubSubCommand(command: PubSubSubscribeCommands | PubSubUnsubscribeCommands, channels: number | Array): Promise { return new Promise((resolve, reject) => { const isSubscribe = command === PubSubSubscribeCommands.SUBSCRIBE || command === PubSubSubscribeCommands.PSUBSCRIBE, inProgressKey = isSubscribe ? 'subscribing' : 'unsubscribing', commandArgs: Array = [command]; + let channelsCounter: number; - if (channels?.length) { + if (typeof channels === 'number') { // unsubscribe only + channelsCounter = channels; + } else { commandArgs.push(...channels); channelsCounter = channels.length; - } else { - // unsubscribe only - channelsCounter = ( - command[0] === 'P' ? - this.#pubSubListeners.patterns : - this.#pubSubListeners.channels - ).size; } this.#pubSubState[inProgressKey] += channelsCounter; From 0ab224504961212fe44cf3972c7a2902346e1627 Mon Sep 17 00:00:00 2001 From: leibale Date: Sat, 18 Sep 2021 05:52:54 -0400 Subject: [PATCH 011/112] ref #1653 - better types --- lib/client.ts | 164 ++++++++++++++-------------- lib/cluster.ts | 89 +++++++-------- lib/commands/GEOSEARCHSTORE.spec.ts | 2 +- lib/commands/GETEX.ts | 3 +- lib/commands/index.ts | 7 +- lib/lua-script.ts | 4 +- lib/multi-command.ts | 89 ++++++++------- lib/test-utils.ts | 8 +- 8 files changed, 176 insertions(+), 190 deletions(-) diff --git a/lib/client.ts b/lib/client.ts index aaa982da1cc..c9e9cecf924 100644 --- a/lib/client.ts +++ b/lib/client.ts @@ -13,7 +13,7 @@ import { encodeCommand, extendWithDefaultCommands, extendWithModulesAndScripts, import { Pool, Options as PoolOptions, createPool } from 'generic-pool'; import { ClientClosedError } from './errors'; -export interface RedisClientOptions { +export interface RedisClientOptions { socket?: RedisSocketOptions; modules?: M; scripts?: S; @@ -43,51 +43,25 @@ type WithScripts = { export type WithPlugins = WithCommands & WithModules & WithScripts; -export type RedisClientType = +export type RedisClientType = WithPlugins & RedisClient; 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 async commandsExecutor( - this: RedisClient, - command: RedisCommand, - args: Array - ): Promise> { - const { args: redisArgs, options } = transformCommandArguments(command, args); - - return command.transformReply( - await this.#sendCommand(redisArgs, options, command.BUFFER_MODE), - redisArgs.preserve, - ); - } - - static async #scriptsExecutor( - this: RedisClient, - script: RedisLuaScript, - args: Array - ): Promise { - const { args: redisArgs, options } = transformCommandArguments(script, args); - - return script.transformReply( - await this.executeScript(script, redisArgs, options, script.BUFFER_MODE), - redisArgs.preserve - ); - } - - static create(options?: RedisClientOptions): RedisClientType { + static create(options?: RedisClientOptions): RedisClientType { const Client = (extendWithModulesAndScripts({ BaseClass: RedisClient, modules: options?.modules, - modulesCommandsExecutor: RedisClient.commandsExecutor, + modulesCommandsExecutor: RedisClient.prototype.commandsExecutor, scripts: options?.scripts, - scriptsExecutor: RedisClient.#scriptsExecutor + scriptsExecutor: RedisClient.prototype.scriptsExecutor })); if (Client !== RedisClient) { @@ -104,7 +78,7 @@ export default class RedisClient = {}; #selectedDB = 0; - get options(): RedisClientOptions | null | undefined { + get options(): RedisClientOptions | undefined { return this.#options; } @@ -240,6 +214,72 @@ export default class RedisClient): Promise> { + const { args: redisArgs, options } = transformCommandArguments(command, args); + + return command.transformReply( + await this.#sendCommand(redisArgs, options, command.BUFFER_MODE), + redisArgs.preserve, + ); + } + + sendCommand(args: TransformArgumentsReply, 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 { + if (!this.#socket.isOpen) { + throw new ClientClosedError(); + } + + if (options?.isolated) { + return this.executeIsolated(isolatedClient => + isolatedClient.sendCommand(args, { + ...options, + isolated: false + }) + ); + } + + const promise = this.#queue.addCommand(args, options, bufferMode); + this.#tick(); + return await promise; + } + + async scriptsExecutor(script: RedisLuaScript, args: Array): Promise> { + const { args: redisArgs, options } = transformCommandArguments(script, args); + + return script.transformReply( + await this.executeScript(script, redisArgs, options, script.BUFFER_MODE), + redisArgs.preserve + ); + } + + async executeScript(script: RedisLuaScript, args: TransformArgumentsReply, options?: ClientCommandOptions, bufferMode?: boolean): Promise> { + try { + return await this.#sendCommand([ + 'EVALSHA', + script.SHA1, + script.NUMBER_OF_KEYS.toString(), + ...args + ], options, bufferMode); + } catch (err: any) { + if (!err?.message?.startsWith?.('NOSCRIPT')) { + throw err; + } + + return await this.#sendCommand([ + 'EVAL', + script.SCRIPT, + script.NUMBER_OF_KEYS.toString(), + ...args + ], options, bufferMode); + } + } + + + async SELECT(db: number): Promise; async SELECT(options: CommandOptions, db: number): Promise; async SELECT(options?: any, db?: any): Promise { @@ -300,30 +340,6 @@ export default class RedisClient(args: TransformArgumentsReply, 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 { - if (!this.#socket.isOpen) { - throw new ClientClosedError(); - } - - if (options?.isolated) { - return this.executeIsolated(isolatedClient => - isolatedClient.sendCommand(args, { - ...options, - isolated: false - }) - ); - } - - const promise = this.#queue.addCommand(args, options, bufferMode); - this.#tick(); - return await promise; - } - #tick(): void { if (!this.#socket.isSocketExists) { return; @@ -350,26 +366,11 @@ export default class RedisClient> { - try { - return await this.#sendCommand([ - 'EVALSHA', - script.SHA1, - script.NUMBER_OF_KEYS.toString(), - ...args - ], options, bufferMode); - } catch (err: any) { - if (!err?.message?.startsWith?.('NOSCRIPT')) { - throw err; - } - - return await this.#sendCommand([ - 'EVAL', - script.SCRIPT, - script.NUMBER_OF_KEYS.toString(), - ...args - ], options, bufferMode); - } + multi(): RedisMultiCommandType { + return new (this as any).Multi( + this.#multiExecutor.bind(this), + this.#options + ); } #multiExecutor(commands: Array, chainId?: symbol): Promise> { @@ -386,13 +387,6 @@ export default class RedisClient { - return new (this as any).Multi( - this.#multiExecutor.bind(this), - this.#options - ); - } - async* scanIterator(options?: ScanCommandOptions): AsyncIterable { let cursor = 0; do { @@ -451,5 +445,5 @@ export default class RedisClient { maxCommandRedirections?: number; } -export type RedisClusterType = - WithPlugins & RedisCluster; +export type RedisClusterType = + WithPlugins & RedisCluster; -export default class RedisCluster extends EventEmitter { +export default class RedisCluster extends EventEmitter { static #extractFirstKey(command: RedisCommand, originalArgs: Array, redisArgs: TransformArgumentsReply): string | Buffer | undefined { if (command.FIRST_KEY_INDEX === undefined) { return undefined; @@ -30,54 +30,13 @@ export default class RedisCluster - ): Promise> { - const { args: redisArgs, options } = transformCommandArguments(command, args); - - const reply = command.transformReply( - await this.sendCommand( - RedisCluster.#extractFirstKey(command, args, redisArgs), - command.IS_READ_ONLY, - redisArgs, - options, - command.BUFFER_MODE - ), - redisArgs.preserve - ); - - return reply; - } - - static async #scriptsExecutor( - this: RedisCluster, - script: RedisLuaScript, - args: Array - ): Promise { - const { args: redisArgs, options } = transformCommandArguments(script, args); - - const reply = script.transformReply( - await this.executeScript( - script, - args, - redisArgs, - options - ), - redisArgs.preserve - ); - - return reply; - } - - static create(options?: RedisClusterOptions): RedisClusterType { + static create(options?: RedisClusterOptions): RedisClusterType { return new (extendWithModulesAndScripts({ BaseClass: RedisCluster, modules: options?.modules, - modulesCommandsExecutor: RedisCluster.commandsExecutor, + modulesCommandsExecutor: RedisCluster.prototype.commandsExecutor, scripts: options?.scripts, - scriptsExecutor: RedisCluster.#scriptsExecutor + scriptsExecutor: RedisCluster.prototype.scriptsExecutor }))(options); } @@ -101,6 +60,23 @@ export default class RedisCluster): Promise> { + const { args: redisArgs, options } = transformCommandArguments(command, args); + + const reply = command.transformReply( + await this.sendCommand( + RedisCluster.#extractFirstKey(command, args, redisArgs), + command.IS_READ_ONLY, + redisArgs, + options, + command.BUFFER_MODE + ), + redisArgs.preserve + ); + + return reply; + } + async sendCommand( firstKey: string | Buffer | undefined, isReadonly: boolean | undefined, @@ -125,6 +101,22 @@ export default class RedisCluster): Promise> { + const { args: redisArgs, options } = transformCommandArguments(script, args); + + const reply = script.transformReply( + await this.executeScript( + script, + args, + redisArgs, + options + ), + redisArgs.preserve + ); + + return reply; + } + async executeScript( script: RedisLuaScript, originalArgs: Array, @@ -208,5 +200,4 @@ export default class RedisCluster { describe('transformArguments', () => { it('simple', () => { assert.deepEqual( - transformArguments('destination', 'source', 'member', { + transformArguments('destination', '/home/leibale/Workspace/node-redis/lib/commands/GEOSEARCHSTORE.spec.tssource', 'member', { radius: 1, unit: 'm' }, { diff --git a/lib/commands/GETEX.ts b/lib/commands/GETEX.ts index ca1465b7ee5..214dae5c7ab 100644 --- a/lib/commands/GETEX.ts +++ b/lib/commands/GETEX.ts @@ -1,3 +1,4 @@ +import { TransformArgumentsReply } from '.'; import { transformEXAT, transformPXAT, transformReplyStringNull } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -14,7 +15,7 @@ type GetExModes = { PERSIST: true; }; -export function transformArguments(key: string, mode: GetExModes) { +export function transformArguments(key: string, mode: GetExModes): TransformArgumentsReply { const args = ['GETEX', key]; if ('EX' in mode) { diff --git a/lib/commands/index.ts b/lib/commands/index.ts index dce28ac0937..6e5310b811a 100644 --- a/lib/commands/index.ts +++ b/lib/commands/index.ts @@ -753,7 +753,10 @@ export interface RedisCommands { } export interface RedisModule { - [key: string]: RedisCommand; + [command: string]: RedisCommand; } -export type RedisModules = Record; +export interface RedisModules { + [module: string]: RedisModule; +} +// export type RedisModules = Record; diff --git a/lib/lua-script.ts b/lib/lua-script.ts index 183c42f219c..be16f9b9133 100644 --- a/lib/lua-script.ts +++ b/lib/lua-script.ts @@ -13,10 +13,10 @@ export interface SHA1 { export type RedisLuaScript = RedisLuaScriptConfig & SHA1; export interface RedisLuaScripts { - [key: string]: RedisLuaScript; + [script: string]: RedisLuaScript; } -export function defineScript(script: S): S & SHA1 { +export function defineScript(script: RedisLuaScriptConfig): typeof script & SHA1 { return { ...script, SHA1: scriptSha1(script.SCRIPT) diff --git a/lib/multi-command.ts b/lib/multi-command.ts index 53f439d8f36..a329a5dbf19 100644 --- a/lib/multi-command.ts +++ b/lib/multi-command.ts @@ -21,7 +21,8 @@ type WithScripts = { [P in keyof S]: RedisMultiCommandSignature }; -export type RedisMultiCommandType = RedisMultiCommand & WithCommands & WithModules & WithScripts; +export type RedisMultiCommandType = + RedisMultiCommand & WithCommands & WithModules & WithScripts; export interface MultiQueuedCommand { args: TransformArgumentsReply; @@ -31,60 +32,20 @@ export interface MultiQueuedCommand { export type RedisMultiExecutor = (queue: Array, chainId?: symbol) => Promise>; -export default class RedisMultiCommand { - static commandsExecutor(this: RedisMultiCommand, command: RedisCommand, args: Array): RedisMultiCommand { - return this.addCommand( - command.transformArguments(...args), - command.transformReply - ); - } - - static #scriptsExecutor( - this: RedisMultiCommand, - script: RedisLuaScript, - args: Array - ): RedisMultiCommand { - const transformedArguments: TransformArgumentsReply = []; - if (this.#scriptsInUse.has(script.SHA1)) { - transformedArguments.push( - 'EVALSHA', - script.SHA1 - ); - } else { - this.#scriptsInUse.add(script.SHA1); - transformedArguments.push( - 'EVAL', - script.SCRIPT - ); - } - - transformedArguments.push(script.NUMBER_OF_KEYS.toString()); - - const scriptArguments = script.transformArguments(...args); - transformedArguments.push(...scriptArguments); - if (scriptArguments.preserve) { - transformedArguments.preserve = scriptArguments.preserve; - } - - return this.addCommand( - transformedArguments, - script.transformReply - ); - } - +export default class RedisMultiCommand { static extend( clientOptions?: RedisClientOptions ): new (...args: ConstructorParameters) => RedisMultiCommandType { return extendWithModulesAndScripts({ BaseClass: RedisMultiCommand, modules: clientOptions?.modules, - modulesCommandsExecutor: RedisMultiCommand.commandsExecutor, + modulesCommandsExecutor: RedisMultiCommand.prototype.commandsExecutor, scripts: clientOptions?.scripts, - scriptsExecutor: RedisMultiCommand.#scriptsExecutor + scriptsExecutor: RedisMultiCommand.prototype.scriptsExecutor }); } - static create( + static create( executor: RedisMultiExecutor, clientOptions?: RedisClientOptions ): RedisMultiCommandType { @@ -153,6 +114,42 @@ export default class RedisMultiCommand): void => (this as any).addCommand(name, args); } + commandsExecutor(command: RedisCommand, args: Array): this { + return this.addCommand( + command.transformArguments(...args), + command.transformReply + ); + } + + scriptsExecutor(script: RedisLuaScript, args: Array): this { + const transformedArguments: TransformArgumentsReply = []; + if (this.#scriptsInUse.has(script.SHA1)) { + transformedArguments.push( + 'EVALSHA', + script.SHA1 + ); + } else { + this.#scriptsInUse.add(script.SHA1); + transformedArguments.push( + 'EVAL', + script.SCRIPT + ); + } + + transformedArguments.push(script.NUMBER_OF_KEYS.toString()); + + const scriptArguments = script.transformArguments(...args); + transformedArguments.push(...scriptArguments); + if (scriptArguments.preserve) { + transformedArguments.preserve = scriptArguments.preserve; + } + + return this.addCommand( + transformedArguments, + script.transformReply + ); + } + addCommand(args: TransformArgumentsReply, transformReply?: RedisCommand['transformReply']): this { this.#queue.push({ args, @@ -205,4 +202,4 @@ export default class RedisMultiCommand): Promise { const SLOTS = 16384; interface SpawnRedisClusterNodeResult extends SpawnRedisServerResult { - client: RedisClientType + client: RedisClientType } async function spawnRedisClusterNode( @@ -281,7 +281,7 @@ export function describeHandleMinimumRedisVersion(minimumVersion: PartialRedisVe export function itWithClient( type: TestRedisServers, title: string, - fn: (client: RedisClientType) => Promise, + fn: (client: RedisClientType) => Promise, options?: RedisTestOptions ): void { it(title, async function () { @@ -306,7 +306,7 @@ export function itWithClient( export function itWithCluster( type: TestRedisClusters, title: string, - fn: (cluster: RedisClusterType) => Promise, + fn: (cluster: RedisClusterType) => Promise, options?: RedisTestOptions ): void { it(title, async function () { @@ -328,7 +328,7 @@ export function itWithCluster( }); } -export function itWithDedicatedCluster(title: string, fn: (cluster: RedisClusterType) => Promise): void { +export function itWithDedicatedCluster(title: string, fn: (cluster: RedisClusterType) => Promise): void { it(title, async function () { this.timeout(10000); From 54124793ad1b633d39d372bdff487c9888c017a7 Mon Sep 17 00:00:00 2001 From: leibale Date: Sat, 18 Sep 2021 05:58:08 -0400 Subject: [PATCH 012/112] better types --- lib/commands/SETBIT.ts | 3 ++- lib/commands/index.ts | 4 ++-- lib/test-utils.ts | 4 +--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/commands/SETBIT.ts b/lib/commands/SETBIT.ts index 0cd41d1b975..33b2ff1a838 100644 --- a/lib/commands/SETBIT.ts +++ b/lib/commands/SETBIT.ts @@ -1,8 +1,9 @@ +import { TransformArgumentsReply } from '.'; import { BitValue, transformReplyBit } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, offset: number, value: BitValue) { +export function transformArguments(key: string, offset: number, value: BitValue): TransformArgumentsReply { return ['SETBIT', key, offset.toString(), value.toString()]; } diff --git a/lib/commands/index.ts b/lib/commands/index.ts index 6e5310b811a..2c1a02d224f 100644 --- a/lib/commands/index.ts +++ b/lib/commands/index.ts @@ -743,9 +743,9 @@ export type TransformArgumentsReply = Array & { preserve?: unkn export interface RedisCommand { FIRST_KEY_INDEX?: number | ((...args: Array) => string); IS_READ_ONLY?: boolean; - transformArguments(...args: Array): TransformArgumentsReply; + transformArguments(this: void, zpte...args: Array): TransformArgumentsReply; BUFFER_MODE?: boolean; - transformReply(reply: RedisReply, preserved?: unknown): any; + transformReply(this: void, reply: RedisReply, preserved?: unknown): any; } export interface RedisCommands { diff --git a/lib/test-utils.ts b/lib/test-utils.ts index f68857d61e6..84685923693 100644 --- a/lib/test-utils.ts +++ b/lib/test-utils.ts @@ -1,7 +1,5 @@ import { strict as assert } from 'assert'; import RedisClient, { RedisClientType } from './client'; -import { RedisModules } from './commands'; -import { RedisLuaScripts } from './lua-script'; import { execSync, spawn } from 'child_process'; import { once } from 'events'; import { RedisSocketOptions } from './socket'; @@ -370,4 +368,4 @@ export async function waitTillBeenCalled(spy: SinonSpy): Promise { await promiseTimeout(1); } while (spy.callCount === calls) -} \ No newline at end of file +} From 10b9c59e0ffe2f2bfdd926080bf4c92a516cedd4 Mon Sep 17 00:00:00 2001 From: leibale Date: Sat, 18 Sep 2021 06:06:17 -0400 Subject: [PATCH 013/112] fix 54124793ad1b633d39d372bdff487c9888c017a7 --- lib/commands/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/commands/index.ts b/lib/commands/index.ts index 2c1a02d224f..93220630980 100644 --- a/lib/commands/index.ts +++ b/lib/commands/index.ts @@ -743,7 +743,7 @@ export type TransformArgumentsReply = Array & { preserve?: unkn export interface RedisCommand { FIRST_KEY_INDEX?: number | ((...args: Array) => string); IS_READ_ONLY?: boolean; - transformArguments(this: void, zpte...args: Array): TransformArgumentsReply; + transformArguments(this: void, ...args: Array): TransformArgumentsReply; BUFFER_MODE?: boolean; transformReply(this: void, reply: RedisReply, preserved?: unknown): any; } From 3cd31e37c2e9f6c763324b66ac71b3d55702e29e Mon Sep 17 00:00:00 2001 From: Leibale Eidelman Date: Sat, 18 Sep 2021 13:55:45 -0400 Subject: [PATCH 014/112] Update GEOSEARCHSTORE.spec.ts --- lib/commands/GEOSEARCHSTORE.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/commands/GEOSEARCHSTORE.spec.ts b/lib/commands/GEOSEARCHSTORE.spec.ts index b39e94fc40c..ad33c62b78c 100644 --- a/lib/commands/GEOSEARCHSTORE.spec.ts +++ b/lib/commands/GEOSEARCHSTORE.spec.ts @@ -8,7 +8,7 @@ describe('GEOSEARCHSTORE', () => { describe('transformArguments', () => { it('simple', () => { assert.deepEqual( - transformArguments('destination', '/home/leibale/Workspace/node-redis/lib/commands/GEOSEARCHSTORE.spec.tssource', 'member', { + transformArguments('destination', 'source', 'member', { radius: 1, unit: 'm' }, { From 3a169d5e35b73b4c35f4df37781737d405699030 Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 20 Sep 2021 18:59:42 -0400 Subject: [PATCH 015/112] fix #1660 - add support for client.HSET('key', 'field', 'value') --- lib/commands/HSET.spec.ts | 9 ++++++++- lib/commands/HSET.ts | 13 +++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/lib/commands/HSET.spec.ts b/lib/commands/HSET.spec.ts index af7bcb6eb20..601e7f967e1 100644 --- a/lib/commands/HSET.spec.ts +++ b/lib/commands/HSET.spec.ts @@ -4,6 +4,13 @@ import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from describe('HSET', () => { describe('transformArguments', () => { + it('field, value', () => { + assert.deepEqual( + transformArguments('key', 'field', 'value'), + ['HSET', 'key', 'field', 'value'] + ); + }); + it('Map', () => { assert.deepEqual( transformArguments('key', new Map([['field', 'value']])), @@ -30,7 +37,7 @@ describe('HSET', () => { itWithClient(TestRedisServers.OPEN, 'client.hSet', async client => { assert.equal( - await client.hSet('key', { field: 'value' }), + await client.hSet('key', 'field', 'value'), 1 ); }); diff --git a/lib/commands/HSET.ts b/lib/commands/HSET.ts index 3edaa64b4e8..cbd46061ad8 100644 --- a/lib/commands/HSET.ts +++ b/lib/commands/HSET.ts @@ -1,3 +1,4 @@ +import { TransformArgumentsReply } from '.'; import { transformReplyString } from './generic-transformers'; type HSETObject = Record; @@ -8,10 +9,18 @@ type HSETTuples = Array<[string, string]> | Array; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, value: HSETObject | HSETMap | HSETTuples): Array { +type GenericArguments = [key: string]; + +type SingleFieldArguments = [...generic: GenericArguments, field: string, value: string]; + +type MultipleFieldsArguments = [...generic: GenericArguments, value: HSETObject | HSETMap | HSETTuples]; + +export function transformArguments(...[ key, value, fieldValue ]: SingleFieldArguments | MultipleFieldsArguments): TransformArgumentsReply { const args = ['HSET', key]; - if (value instanceof Map) { + if (typeof value === 'string') { + args.push(value, fieldValue!); + } else if (value instanceof Map) { pushMap(args, value); } else if (Array.isArray(value)) { pushTuples(args, value); From d79bc55df6666c94cc44812aa861a6b208d56336 Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 20 Sep 2021 19:35:13 -0400 Subject: [PATCH 016/112] upgrade dependencies, update README --- README.md | 186 +++++----- package-lock.json | 856 ++++++++++++++++++++++++---------------------- package.json | 10 +- 3 files changed, 541 insertions(+), 511 deletions(-) diff --git a/README.md b/README.md index bbcb7edc976..2c465ae69fa 100644 --- a/README.md +++ b/README.md @@ -35,17 +35,17 @@ npm install redis@next ### Basic Example ```typescript -import { createClient } from 'redis'; +import { createClient } from "redis"; (async () => { - const client = createClient(); + const client = createClient(); - client.on('error', (err) => console.log('Redis Client Error', err)); + client.on("error", (err) => console.log("Redis Client Error", err)); - await client.connect(); + await client.connect(); - await client.set('key', 'value'); - const value = await client.get('key'); + await client.set("key", "value"); + const value = await client.get("key"); })(); ``` @@ -53,9 +53,9 @@ The above code connects to localhost on port 6379. To connect to a different hos ```typescript createClient({ - socket: { - url: 'redis://alice:foobared@awesome.redis.server:6380' - } + socket: { + url: "redis://alice:foobared@awesome.redis.server:6380", + }, }); ``` @@ -67,28 +67,28 @@ There is built-in support for all of the [out-of-the-box Redis commands](https:/ ```typescript // raw Redis commands -await client.HSET('key', 'field', 'value'); -await client.HGETALL('key'); +await client.HSET("key", "field", "value"); +await client.HGETALL("key"); // friendly JavaScript commands -await client.hSet('key', 'field', 'value'); -await client.hGetAll('key'); +await client.hSet("key", "field", "value"); +await client.hGetAll("key"); ``` Modifiers to commands are specified using a JavaScript object: ```typescript -await client.set('key', 'value', { - EX: 10, - NX: true +await client.set("key", "value", { + EX: 10, + NX: true, }); ``` Replies will be transformed into useful data structures: ```typescript -await client.hGetAll('key'); // { field1: 'value1', field2: 'value2' } -await client.hVals('key'); // ['value1', 'value2'] +await client.hGetAll("key"); // { field1: 'value1', field2: 'value2' } +await client.hVals("key"); // ['value1', 'value2'] ``` ### Unsupported Redis Commands @@ -96,9 +96,9 @@ await client.hVals('key'); // ['value1', 'value2'] If you want to run commands and/or use arguments that Node Redis doesn't know about (yet!) use `.sendCommand()`: ```typescript -await client.sendCommand(['SET', 'key', 'value', 'NX']); // 'OK' +await client.sendCommand(["SET", "key", "value", "NX"]); // 'OK' -await client.sendCommand(['HGETALL', 'key']); // ['key1', 'field1', 'key2', 'field2'] +await client.sendCommand(["HGETALL", "key"]); // ['key1', 'field1', 'key2', 'field2'] ``` ### Transactions (Multi/Exec) @@ -106,12 +106,13 @@ await client.sendCommand(['HGETALL', 'key']); // ['key1', 'field1', 'key2', 'fie Start a [transaction](https://redis.io/topics/transactions) by calling `.multi()`, then chaining your commands. When you're done, call `.exec()` and you'll get an array back with your results: ```typescript -await client.set('another-key', 'another-value'); +await client.set("another-key", "another-value"); -const [ setKeyReply, otherKeyValue ] = await client.multi() - .set('key', 'value') - .get('another-key') - .exec(); // ['OK', 'another-value'] +const [setKeyReply, otherKeyValue] = await client + .multi() + .set("key", "value") + .get("another-key") + .exec(); // ['OK', 'another-value'] ``` You can also [watch](https://redis.io/topics/transactions#optimistic-locking-using-check-and-set) keys by calling `.watch()`. Your transaction will abort if any of the watched keys change. @@ -125,14 +126,11 @@ Any command can be run on a new connection by specifying the `isolated` option. This pattern works especially well for blocking commands—such as `BLPOP` and `BLMOVE`: ```typescript -import { commandOptions } from 'redis'; +import { commandOptions } from "redis"; -const blPopPromise = client.blPop( - commandOptions({ isolated: true }), - 'key' -); +const blPopPromise = client.blPop(commandOptions({ isolated: true }), "key"); -await client.lPush('key', ['1', '2']); +await client.lPush("key", ["1", "2"]); await blPopPromise; // '2' ``` @@ -152,23 +150,23 @@ await subscriber.connect(); Once you have one, simply subscribe and unsubscribe as needed: ```typescript -await subscriber.subscribe('channel', message => { - console.log(message); // 'message' +await subscriber.subscribe("channel", (message) => { + console.log(message); // 'message' }); -await subscriber.pSubscribe('channe*', (message, channel) => { - console.log(message, channel); // 'message', 'channel' +await subscriber.pSubscribe("channe*", (message, channel) => { + console.log(message, channel); // 'message', 'channel' }); -await subscriber.unsubscribe('channel'); +await subscriber.unsubscribe("channel"); -await subscriber.pUnsubscribe('channe*'); +await subscriber.pUnsubscribe("channe*"); ``` Publish a message on a channel: ```typescript -await publisher.publish('channel', 'message'); +await publisher.publish("channel", "message"); ``` ### Scan Iterator @@ -177,26 +175,29 @@ await publisher.publish('channel', 'message'); ```typescript for await (const key of client.scanIterator()) { - // use the key! - await client.get(key); + // use the key! + await client.get(key); } ``` 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: ```typescript client.scanIterator({ - TYPE: 'string', // `SCAN` only - MATCH: 'patter*', - COUNT: 100 + TYPE: "string", // `SCAN` only + MATCH: "patter*", + COUNT: 100, }); ``` @@ -205,30 +206,29 @@ 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, defineScript } from "redis"; (async () => { - const client = createClient({ - scripts: { - add: defineScript({ - NUMBER_OF_KEYS: 1, - SCRIPT: - 'local val = redis.pcall("GET", KEYS[1]);' + - 'return val + ARGV[1];', - transformArguments(key: string, toAdd: number): Array { - return [key, number.toString()]; - }, - transformReply(reply: number): number { - return reply; - } - }) - } - }); - - await client.connect(); - - await client.set('key', '1'); - await client.add('key', 2); // 3 + const client = createClient({ + scripts: { + add: defineScript({ + NUMBER_OF_KEYS: 1, + SCRIPT: + 'local val = redis.pcall("GET", KEYS[1]);' + "return val + ARGV[1];", + transformArguments(key: string, toAdd: number): Array { + return [key, number.toString()]; + }, + transformReply(reply: number): number { + return reply; + }, + }), + }, + }); + + await client.connect(); + + await client.set("key", "1"); + await client.add("key", 2); // 3 })(); ``` @@ -237,25 +237,28 @@ import { createClient, defineScript } from 'redis'; Connecting to a cluster is a bit different. Create the client by specifying some (or all) of the nodes in your cluster and then use it like a non-clustered client: ```typescript -import { createCluster } from 'redis'; +import { createCluster } from "redis"; (async () => { - const cluster = createCluster({ - rootNodes: [{ - host: '10.0.0.1', - port: 30001 - }, { - host: '10.0.0.2', - port: 30002 - }] - }); - - cluster.on('error', (err) => console.log('Redis Cluster Error', err)); - - await cluster.connect(); - - await cluster.set('key', 'value'); - const value = await cluster.get('key'); + const cluster = createCluster({ + rootNodes: [ + { + host: "10.0.0.1", + port: 30001, + }, + { + host: "10.0.0.2", + port: 30002, + }, + ], + }); + + cluster.on("error", (err) => console.log("Redis Cluster Error", err)); + + await cluster.connect(); + + await cluster.set("key", "value"); + const value = await cluster.get("key"); })(); ``` @@ -264,16 +267,16 @@ import { createCluster } from 'redis'; Node Redis will automatically pipeline requests that are made during the same "tick". ```typescript -client.set('Tm9kZSBSZWRpcw==', 'users:1'); -client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw=='); +client.set("Tm9kZSBSZWRpcw==", "users:1"); +client.sAdd("users:1:tokens", "Tm9kZSBSZWRpcw=="); ``` Of course, if you don't do something with your Promises you're certain to get [unhandled Promise exceptions](https://nodejs.org/api/process.html#process_event_unhandledrejection). To take advantage of auto-pipelining and handle your Promises, use `Promise.all()`. ```typescript await Promise.all([ - client.set('Tm9kZSBSZWRpcw==', 'users:1'), - client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw==') + client.set("Tm9kZSBSZWRpcw==", "users:1"), + client.sAdd("users:1:tokens", "Tm9kZSBSZWRpcw=="), ]); ``` @@ -283,8 +286,9 @@ If you'd like to contribute, check out the [contributing guide](CONTRIBUTING.md) Thank you to all the people who already contributed to Node Redis! - - + + + ## License This repository is licensed under the "MIT" license. See [LICENSE](LICENSE). diff --git a/package-lock.json b/package-lock.json index ac623c60e6a..9986a955bf6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@types/mocha": "^9.0.0", - "@types/node": "^16.7.10", + "@types/node": "^16.9.4", "@types/sinon": "^10.0.2", "@types/which": "^2.0.1", "@types/yallist": "^4.0.1", @@ -25,12 +25,12 @@ "nyc": "^15.1.0", "release-it": "^14.11.5", "sinon": "^11.1.2", - "source-map-support": "^0.5.19", + "source-map-support": "^0.5.20", "ts-node": "^10.2.1", - "typedoc": "^0.21.9", + "typedoc": "^0.22.4", "typedoc-github-wiki-theme": "^0.5.1", - "typedoc-plugin-markdown": "^3.10.4", - "typescript": "^4.4.2", + "typedoc-plugin-markdown": "^3.11.0", + "typescript": "^4.4.3", "which": "^2.0.2" }, "engines": { @@ -59,20 +59,20 @@ } }, "node_modules/@babel/core": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", - "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", + "version": "7.15.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", + "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.0", - "@babel/helper-module-transforms": "^7.15.0", - "@babel/helpers": "^7.14.8", - "@babel/parser": "^7.15.0", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0", + "@babel/generator": "^7.15.4", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.5", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -89,12 +89,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", - "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", + "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", "dev": true, "dependencies": { - "@babel/types": "^7.15.0", + "@babel/types": "^7.15.4", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -103,9 +103,9 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", - "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", "dev": true, "dependencies": { "@babel/compat-data": "^7.15.0", @@ -121,141 +121,141 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", "dev": true, "dependencies": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", - "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", "dev": true, "dependencies": { - "@babel/types": "^7.15.0" + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", - "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", + "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==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.15.0", - "@babel/helper-simple-access": "^7.14.8", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.9", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", - "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.15.0", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", - "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", "dev": true, "dependencies": { - "@babel/types": "^7.14.8" + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", "dev": true, "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", - "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -271,14 +271,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz", - "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", "dev": true, "dependencies": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" @@ -370,9 +370,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", - "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==", + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz", + "integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -382,32 +382,32 @@ } }, "node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", - "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.15.0", - "@babel/types": "^7.15.0", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -416,9 +416,9 @@ } }, "node_modules/@babel/types": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", - "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.14.9", @@ -607,9 +607,9 @@ } }, "node_modules/@octokit/auth-token": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz", - "integrity": "sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", + "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", "dev": true, "dependencies": { "@octokit/types": "^6.0.3" @@ -653,18 +653,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": "10.2.2", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-10.2.2.tgz", + "integrity": "sha512-EVcXQ+ZrC04cg17AMg1ofocWMxHDn17cB66ZHgYc0eUwjFtxS0oBzkyw2VqIrHBwVgtfoYrq1WMQfQmMjUwthw==", "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.16.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.16.3.tgz", + "integrity": "sha512-kdc65UEsqze/9fCISq6BxLzeB9qf0vKvKojIfzgwf4tEF+Wy6c9dXnPFE6vgpoDFB1Z5Jek5WFVU6vL1w22+Iw==", "dev": true, "dependencies": { - "@octokit/types": "^6.26.0" + "@octokit/types": "^6.28.1" }, "peerDependencies": { "@octokit/core": ">=2" @@ -730,18 +730,18 @@ } }, "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.28.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.28.1.tgz", + "integrity": "sha512-XlxDoQLFO5JnFZgKVQTYTvXRsQFfr/GwDUU108NJ9R5yFPkA2qXhTJjYuul3vE4eLXP40FA2nysOu2zd6boE+w==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^10.0.0" + "@octokit/openapi-types": "^10.2.2" } }, "node_modules/@sindresorhus/is": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.1.tgz", - "integrity": "sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", + "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==", "dev": true, "engines": { "node": ">=10" @@ -840,9 +840,9 @@ "dev": true }, "node_modules/@types/keyv": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.2.tgz", - "integrity": "sha512-/FvAK2p4jQOaJ6CGDHJTqZcUtbZe820qIeTg7o0Shg7drB4JHeL+V/dhSaly7NXx6u8eSee+r7coT+yuJEvDLg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", + "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", "dev": true, "dependencies": { "@types/node": "*" @@ -855,9 +855,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.9.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.4.tgz", + "integrity": "sha512-KDazLNYAGIuJugdbULwFZULF9qQ13yNWEBFnfVpqlpgAAo6H/qnM9RjBgh0A0kmHf3XxAKLdN5mTIng9iUvVLA==", "dev": true }, "node_modules/@types/parse-json": { @@ -903,9 +903,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", - "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -915,9 +915,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.1.1.tgz", - "integrity": "sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, "engines": { "node": ">=0.4.0" @@ -1032,9 +1032,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==", "dev": true, "engines": { "node": ">=8" @@ -1175,16 +1175,16 @@ } }, "node_modules/boxen": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz", - "integrity": "sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "dev": true, "dependencies": { "ansi-align": "^3.0.0", "camelcase": "^6.2.0", "chalk": "^4.1.0", "cli-boxes": "^2.2.1", - "string-width": "^4.2.0", + "string-width": "^4.2.2", "type-fest": "^0.20.2", "widest-line": "^3.1.0", "wrap-ansi": "^7.0.0" @@ -1249,14 +1249,14 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.16.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.8.tgz", - "integrity": "sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz", + "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", "dev": true, "dependencies": { - "caniuse-lite": "^1.0.30001251", + "caniuse-lite": "^1.0.30001254", "colorette": "^1.3.0", - "electron-to-chromium": "^1.3.811", + "electron-to-chromium": "^1.3.830", "escalade": "^3.1.1", "node-releases": "^1.1.75" }, @@ -1390,9 +1390,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001252", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001252.tgz", - "integrity": "sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw==", + "version": "1.0.30001258", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001258.tgz", + "integrity": "sha512-RBByOG6xWXUp0CR2/WU2amXz3stjKpSl5J1xU49F1n2OxD//uBZO4wCKUiG+QMGf7CHGfDDcqoKriomoGVxTeA==", "dev": true, "funding": { "type": "opencollective", @@ -1570,9 +1570,9 @@ "dev": true }, "node_modules/colorette": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz", - "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", "dev": true }, "node_modules/combined-stream": { @@ -1845,9 +1845,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.844", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.844.tgz", + "integrity": "sha512-7ES6GQVsbgsUA49/apqub51I9ij8E3QwGqq/IRvO6OPCly3how/YUSg1GPslRWq+BteT2h94iAIQdJbuVVH4Pg==", "dev": true }, "node_modules/emoji-regex": { @@ -1977,9 +1977,9 @@ } }, "node_modules/fastq": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", - "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -3068,6 +3068,12 @@ "node": ">=6" } }, + "node_modules/jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, "node_modules/just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -3214,9 +3220,9 @@ "dev": true }, "node_modules/marked": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.2.tgz", - "integrity": "sha512-TMJQQ79Z0e3rJYazY0tIoMsFzteUGw9fB3FD+gzuIT3zLuG9L9ckIvUfF51apdJkcqc208jJN2KbtPbOvXtbjA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.4.tgz", + "integrity": "sha512-jBo8AOayNaEcvBhNobg6/BLhdsK3NvnKWJg33MAAPbvTWiG4QBn9gpW1+7RssrKu4K1dKlN+0goVQwV41xEfOA==", "dev": true, "bin": { "marked": "bin/marked" @@ -3419,10 +3425,13 @@ } }, "node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.3.tgz", + "integrity": "sha512-BXSmNTLLDHT0UjQDg5E23x+0n/hPDjySqc0ELE4NpCa2wE5qmmaEWFRP/+v8pfuocchR9l5vFLbSB7CPE2ahvQ==", "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, "engines": { "node": "4.x || >=6.0.0" } @@ -3440,9 +3449,9 @@ } }, "node_modules/node-releases": { - "version": "1.1.75", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", - "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==", + "version": "1.1.76", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz", + "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==", "dev": true }, "node_modules/normalize-path": { @@ -4201,15 +4210,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", @@ -4773,12 +4773,12 @@ } }, "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": { - "json5": "^2.2.0", + "jsonc-parser": "^3.0.0", "onigasm": "^2.2.5", "vscode-textmate": "5.2.0" } @@ -4798,9 +4798,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.4", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.4.tgz", + "integrity": "sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q==", "dev": true }, "node_modules/sinon": { @@ -4852,9 +4852,9 @@ } }, "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", "dev": true, "dependencies": { "buffer-from": "^1.0.0", @@ -5073,6 +5073,12 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, "node_modules/ts-node": { "version": "10.2.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz", @@ -5160,19 +5166,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.4", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.4.tgz", + "integrity": "sha512-M/a8NnPxq3/iZNNVjzFCK5gu4m//HTJIPbSS0JQVbkHJPP9wyepR12agylWTSqeVZe0xsbidVtO26+PP7iD/jw==", "dev": true, "dependencies": { "glob": "^7.1.7", - "handlebars": "^4.7.7", "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" @@ -5184,15 +5187,6 @@ "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", @@ -5204,21 +5198,21 @@ } }, "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.0", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.11.0.tgz", + "integrity": "sha512-zewcbzOlMV9nbhLsJhKBpoRW4J32LgbfdqwYfEfzzeE+wGOaOfsM6g7QH+ZKj8n+knH4sLCtk6XMN1TI/a1UuQ==", "dev": true, "dependencies": { "handlebars": "^4.7.7" }, "peerDependencies": { - "typedoc": ">=0.21.2" + "typedoc": ">=0.22.0" } }, "node_modules/typescript": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.2.tgz", - "integrity": "sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", + "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -5229,9 +5223,9 @@ } }, "node_modules/uglify-js": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.1.tgz", - "integrity": "sha512-JhS3hmcVaXlp/xSo3PKY5R0JqKs5M3IV+exdLHW99qKvKivPO4Z8qbej6mte17SOPqAOVMjt/XGgWacnFSzM3g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz", + "integrity": "sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==", "dev": true, "optional": true, "bin": { @@ -5381,6 +5375,22 @@ "defaults": "^1.0.3" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5712,20 +5722,20 @@ "dev": true }, "@babel/core": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", - "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", + "version": "7.15.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", + "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", "dev": true, "requires": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.0", - "@babel/helper-module-transforms": "^7.15.0", - "@babel/helpers": "^7.14.8", - "@babel/parser": "^7.15.0", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0", + "@babel/generator": "^7.15.4", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.5", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -5735,20 +5745,20 @@ } }, "@babel/generator": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", - "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", + "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", "dev": true, "requires": { - "@babel/types": "^7.15.0", + "@babel/types": "^7.15.4", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-compilation-targets": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", - "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", "dev": true, "requires": { "@babel/compat-data": "^7.15.0", @@ -5758,111 +5768,111 @@ } }, "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", - "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", "dev": true, "requires": { - "@babel/types": "^7.15.0" + "@babel/types": "^7.15.4" } }, "@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-module-transforms": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", - "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", + "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==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.15.0", - "@babel/helper-simple-access": "^7.14.8", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.9", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" } }, "@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-replace-supers": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", - "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.15.0", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/helper-simple-access": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", - "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", "dev": true, "requires": { - "@babel/types": "^7.14.8" + "@babel/types": "^7.15.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", "dev": true, "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.15.4" } }, "@babel/helper-validator-identifier": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", - "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", "dev": true }, "@babel/helper-validator-option": { @@ -5872,14 +5882,14 @@ "dev": true }, "@babel/helpers": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz", - "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", "dev": true, "requires": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/highlight": { @@ -5952,43 +5962,43 @@ } }, "@babel/parser": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz", - "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==", + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz", + "integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==", "dev": true }, "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", "dev": true, "requires": { "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" } }, "@babel/traverse": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", - "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", "dev": true, "requires": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.0", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.15.0", - "@babel/types": "^7.15.0", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", - "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.14.9", @@ -6129,9 +6139,9 @@ } }, "@octokit/auth-token": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz", - "integrity": "sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", + "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", "dev": true, "requires": { "@octokit/types": "^6.0.3" @@ -6175,18 +6185,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": "10.2.2", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-10.2.2.tgz", + "integrity": "sha512-EVcXQ+ZrC04cg17AMg1ofocWMxHDn17cB66ZHgYc0eUwjFtxS0oBzkyw2VqIrHBwVgtfoYrq1WMQfQmMjUwthw==", "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.16.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.16.3.tgz", + "integrity": "sha512-kdc65UEsqze/9fCISq6BxLzeB9qf0vKvKojIfzgwf4tEF+Wy6c9dXnPFE6vgpoDFB1Z5Jek5WFVU6vL1w22+Iw==", "dev": true, "requires": { - "@octokit/types": "^6.26.0" + "@octokit/types": "^6.28.1" } }, "@octokit/plugin-request-log": { @@ -6244,18 +6254,18 @@ } }, "@octokit/types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.26.0.tgz", - "integrity": "sha512-RDxZBAFMtqs1ZPnbUu1e7ohPNfoNhTiep4fErY7tZs995BeHu369Vsh5woMIaFbllRWEZBfvTCS4hvDnMPiHrA==", + "version": "6.28.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.28.1.tgz", + "integrity": "sha512-XlxDoQLFO5JnFZgKVQTYTvXRsQFfr/GwDUU108NJ9R5yFPkA2qXhTJjYuul3vE4eLXP40FA2nysOu2zd6boE+w==", "dev": true, "requires": { - "@octokit/openapi-types": "^10.0.0" + "@octokit/openapi-types": "^10.2.2" } }, "@sindresorhus/is": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.1.tgz", - "integrity": "sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", + "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==", "dev": true }, "@sinonjs/commons": { @@ -6345,9 +6355,9 @@ "dev": true }, "@types/keyv": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.2.tgz", - "integrity": "sha512-/FvAK2p4jQOaJ6CGDHJTqZcUtbZe820qIeTg7o0Shg7drB4JHeL+V/dhSaly7NXx6u8eSee+r7coT+yuJEvDLg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", + "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", "dev": true, "requires": { "@types/node": "*" @@ -6360,9 +6370,9 @@ "dev": true }, "@types/node": { - "version": "16.7.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.10.tgz", - "integrity": "sha512-S63Dlv4zIPb8x6MMTgDq5WWRJQe56iBEY0O3SOFA9JrRienkOVDXSXBjjJw6HTNQYSE2JI6GMCR6LVbIMHJVvA==", + "version": "16.9.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.4.tgz", + "integrity": "sha512-KDazLNYAGIuJugdbULwFZULF9qQ13yNWEBFnfVpqlpgAAo6H/qnM9RjBgh0A0kmHf3XxAKLdN5mTIng9iUvVLA==", "dev": true }, "@types/parse-json": { @@ -6408,15 +6418,15 @@ "dev": true }, "acorn": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", - "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", "dev": true }, "acorn-walk": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.1.1.tgz", - "integrity": "sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true }, "aggregate-error": { @@ -6502,9 +6512,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==", "dev": true }, "ansi-styles": { @@ -6610,16 +6620,16 @@ } }, "boxen": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz", - "integrity": "sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "dev": true, "requires": { "ansi-align": "^3.0.0", "camelcase": "^6.2.0", "chalk": "^4.1.0", "cli-boxes": "^2.2.1", - "string-width": "^4.2.0", + "string-width": "^4.2.2", "type-fest": "^0.20.2", "widest-line": "^3.1.0", "wrap-ansi": "^7.0.0" @@ -6665,14 +6675,14 @@ "dev": true }, "browserslist": { - "version": "4.16.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.8.tgz", - "integrity": "sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz", + "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001251", + "caniuse-lite": "^1.0.30001254", "colorette": "^1.3.0", - "electron-to-chromium": "^1.3.811", + "electron-to-chromium": "^1.3.830", "escalade": "^3.1.1", "node-releases": "^1.1.75" } @@ -6760,9 +6770,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001252", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001252.tgz", - "integrity": "sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw==", + "version": "1.0.30001258", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001258.tgz", + "integrity": "sha512-RBByOG6xWXUp0CR2/WU2amXz3stjKpSl5J1xU49F1n2OxD//uBZO4wCKUiG+QMGf7CHGfDDcqoKriomoGVxTeA==", "dev": true }, "chalk": { @@ -6894,9 +6904,9 @@ "dev": true }, "colorette": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz", - "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", "dev": true }, "combined-stream": { @@ -7108,9 +7118,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.844", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.844.tgz", + "integrity": "sha512-7ES6GQVsbgsUA49/apqub51I9ij8E3QwGqq/IRvO6OPCly3how/YUSg1GPslRWq+BteT2h94iAIQdJbuVVH4Pg==", "dev": true }, "emoji-regex": { @@ -7209,9 +7219,9 @@ } }, "fastq": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", - "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -7988,6 +7998,12 @@ "minimist": "^1.2.5" } }, + "jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, "just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -8106,9 +8122,9 @@ "dev": true }, "marked": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.2.tgz", - "integrity": "sha512-TMJQQ79Z0e3rJYazY0tIoMsFzteUGw9fB3FD+gzuIT3zLuG9L9ckIvUfF51apdJkcqc208jJN2KbtPbOvXtbjA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.4.tgz", + "integrity": "sha512-jBo8AOayNaEcvBhNobg6/BLhdsK3NvnKWJg33MAAPbvTWiG4QBn9gpW1+7RssrKu4K1dKlN+0goVQwV41xEfOA==", "dev": true }, "merge-stream": { @@ -8263,10 +8279,13 @@ } }, "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "dev": true + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.3.tgz", + "integrity": "sha512-BXSmNTLLDHT0UjQDg5E23x+0n/hPDjySqc0ELE4NpCa2wE5qmmaEWFRP/+v8pfuocchR9l5vFLbSB7CPE2ahvQ==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } }, "node-preload": { "version": "0.2.1", @@ -8278,9 +8297,9 @@ } }, "node-releases": { - "version": "1.1.75", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", - "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==", + "version": "1.1.76", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz", + "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==", "dev": true }, "normalize-path": { @@ -8865,12 +8884,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", @@ -9284,12 +9297,12 @@ } }, "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": { - "json5": "^2.2.0", + "jsonc-parser": "^3.0.0", "onigasm": "^2.2.5", "vscode-textmate": "5.2.0" } @@ -9306,9 +9319,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.4", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.4.tgz", + "integrity": "sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q==", "dev": true }, "sinon": { @@ -9349,9 +9362,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -9509,6 +9522,12 @@ "is-number": "^7.0.0" } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, "ts-node": { "version": "10.2.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz", @@ -9565,27 +9584,18 @@ } }, "typedoc": { - "version": "0.21.9", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.21.9.tgz", - "integrity": "sha512-VRo7aII4bnYaBBM1lhw4bQFmUcDQV8m8tqgjtc7oXl87jc1Slbhfw2X5MccfcR2YnEClHDWgsiQGgNB8KJXocA==", + "version": "0.22.4", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.4.tgz", + "integrity": "sha512-M/a8NnPxq3/iZNNVjzFCK5gu4m//HTJIPbSS0JQVbkHJPP9wyepR12agylWTSqeVZe0xsbidVtO26+PP7iD/jw==", "dev": true, "requires": { "glob": "^7.1.7", - "handlebars": "^4.7.7", "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" } }, - "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", @@ -9594,24 +9604,24 @@ "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.0", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.11.0.tgz", + "integrity": "sha512-zewcbzOlMV9nbhLsJhKBpoRW4J32LgbfdqwYfEfzzeE+wGOaOfsM6g7QH+ZKj8n+knH4sLCtk6XMN1TI/a1UuQ==", "dev": true, "requires": { "handlebars": "^4.7.7" } }, "typescript": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.2.tgz", - "integrity": "sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", + "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", "dev": true }, "uglify-js": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.1.tgz", - "integrity": "sha512-JhS3hmcVaXlp/xSo3PKY5R0JqKs5M3IV+exdLHW99qKvKivPO4Z8qbej6mte17SOPqAOVMjt/XGgWacnFSzM3g==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz", + "integrity": "sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==", "dev": true, "optional": true }, @@ -9729,6 +9739,22 @@ "defaults": "^1.0.3" } }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 56a7ed38c65..fc107833fc6 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@types/mocha": "^9.0.0", - "@types/node": "^16.7.10", + "@types/node": "^16.9.4", "@types/sinon": "^10.0.2", "@types/which": "^2.0.1", "@types/yallist": "^4.0.1", @@ -43,12 +43,12 @@ "nyc": "^15.1.0", "release-it": "^14.11.5", "sinon": "^11.1.2", - "source-map-support": "^0.5.19", + "source-map-support": "^0.5.20", "ts-node": "^10.2.1", - "typedoc": "^0.21.9", + "typedoc": "^0.22.4", "typedoc-github-wiki-theme": "^0.5.1", - "typedoc-plugin-markdown": "^3.10.4", - "typescript": "^4.4.2", + "typedoc-plugin-markdown": "^3.11.0", + "typescript": "^4.4.3", "which": "^2.0.2" }, "engines": { From 1819b9c1c4a6ae48fd0597e6fa451c242b707e05 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 21 Sep 2021 15:30:25 -0400 Subject: [PATCH 017/112] fix #1659 - add support for db-number in client options url --- docs/client-configuration.md | 39 ++++++++++---------- lib/client.spec.ts | 63 ++++++++++++++++++++++++++------ lib/client.ts | 69 +++++++++++++++++++++++++++++++++--- lib/socket.ts | 20 +---------- lib/test-utils.ts | 18 ++++++---- 5 files changed, 149 insertions(+), 60 deletions(-) diff --git a/docs/client-configuration.md b/docs/client-configuration.md index 4b93340ad8f..0c4c0c1ca8f 100644 --- a/docs/client-configuration.md +++ b/docs/client-configuration.md @@ -1,24 +1,25 @@ # `createClient` configuration -| Property | Default | Description | -|--------------------------|------------------------------------------|------------------------------------------------------------------------------------------------------------------------------| -| socket | | Object defining socket connection properties | -| socket.url | | `[redis[s]:]//[[username][:password]@][host][:port]` | -| socket.host | `'localhost'` | Hostname to connect to | -| socket.port | `6379` | Port to connect to | -| socket.username | | ACL username ([see ACL guide](https://redis.io/topics/acl)) | -| socket.password | | ACL password or the old "--requirepass" password | -| socket.connectTimeout | `5000` | The timeout for connecting to the Redis Server (in milliseconds) | -| socket.noDelay | `true` | Enable/disable the use of [`Nagle's algorithm`](https://nodejs.org/api/net.html#net_socket_setnodelay_nodelay) | -| socket.keepAlive | `5000` | Enable/disable the [`keep-alive`](https://nodejs.org/api/net.html#net_socket_setkeepalive_enable_initialdelay) functionality | -| socket.tls | | Set to `true` to enable [TLS Configuration](https://nodejs.org/api/tls.html#tls_tls_connect_options_callback) | -| socket.reconnectStrategy | `retries => Math.min(retries * 50, 500)` | A function containing the [Reconnect Strategy](#reconnect-strategy) logic | -| modules | | Object defining which [Redis Modules](https://redis.io/modules) to include (TODO - document) | -| scripts | | Object defining Lua scripts to use with this client. See [Lua Scripts](../README.md#lua-scripts) | -| commandsQueueMaxLength | | Maximum length of the client's internal command queue | -| readonly | `false` | Connect in [`READONLY`](https://redis.io/commands/readonly) mode | -| legacyMode | `false` | Maintain some backwards compatibility (see the [Migration Guide](v3-to-v4.md)) | -| isolationPoolOptions | | See the [Isolated Execution Guide](./isolated-execution.md) | +| Property | Default | Description | +|--------------------------|------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| url | | `redis[s]://[[username][:password]@][host][:port][/db-number]` (see [`redis`](https://www.iana.org/assignments/uri-schemes/prov/redis) and [`rediss`](https://www.iana.org/assignments/uri-schemes/prov/rediss) IANA registration for more details) | +| socket | | Object defining socket connection properties | +| socket.host | `'localhost'` | Hostname to connect to | +| socket.port | `6379` | Port to connect to | +| socket.connectTimeout | `5000` | The timeout for connecting to the Redis Server (in milliseconds) | +| socket.noDelay | `true` | Enable/disable the use of [`Nagle's algorithm`](https://nodejs.org/api/net.html#net_socket_setnodelay_nodelay) | +| socket.keepAlive | `5000` | Enable/disable the [`keep-alive`](https://nodejs.org/api/net.html#net_socket_setkeepalive_enable_initialdelay) functionality | +| socket.tls | | Set to `true` to enable [TLS Configuration](https://nodejs.org/api/tls.html#tls_tls_connect_options_callback) | +| socket.reconnectStrategy | `retries => Math.min(retries * 50, 500)` | A function containing the [Reconnect Strategy](#reconnect-strategy) logic | +| username | | ACL username ([see ACL guide](https://redis.io/topics/acl)) | +| password | | ACL password or the old "--requirepass" password | +| database | | Database number to connect to (see [`SELECT`](https://redis.io/commands/select) command) | +| modules | | Object defining which [Redis Modules](https://redis.io/modules) to include (TODO - document) | +| scripts | | Object defining Lua Scripts to use with this client (see [Lua Scripts](../README.md#lua-scripts)) | +| commandsQueueMaxLength | | Maximum length of the client's internal command queue | +| readonly | `false` | Connect in [`READONLY`](https://redis.io/commands/readonly) mode | +| legacyMode | `false` | Maintain some backwards compatibility (see the [Migration Guide](v3-to-v4.md)) | +| isolationPoolOptions | | See the [Isolated Execution Guide](./isolated-execution.md) | ## Reconnect Strategy diff --git a/lib/client.spec.ts b/lib/client.spec.ts index 7f1a534352c..06f8d2bb102 100644 --- a/lib/client.spec.ts +++ b/lib/client.spec.ts @@ -18,6 +18,53 @@ export const SQUARE_SCRIPT = defineScript({ }); describe('Client', () => { + describe('parseURL', () => { + it('redis://user:secret@localhost:6379/0', () => { + assert.deepEqual( + RedisClient.parseURL('redis://user:secret@localhost:6379/0'), + { + socket: { + host: 'localhost', + port: 6379 + }, + username: 'user', + password: 'secret', + database: 0 + } + ); + }); + + it('rediss://user:secret@localhost:6379/0', () => { + assert.deepEqual( + RedisClient.parseURL('rediss://user:secret@localhost:6379/0'), + { + socket: { + host: 'localhost', + port: 6379, + tls: true + }, + username: 'user', + password: 'secret', + database: 0 + } + ); + }); + + it('Invalid protocol', () => { + assert.throws( + () => RedisClient.parseURL('redi://user:secret@localhost:6379/0'), + TypeError + ); + }); + + it('Invalid pathname', () => { + assert.throws( + () => RedisClient.parseURL('redis://user:secret@localhost:6379/NaN'), + TypeError + ); + }); + }); + describe('authentication', () => { itWithClient(TestRedisServers.PASSWORD, 'Client should be authenticated', async client => { assert.equal( @@ -28,10 +75,8 @@ describe('Client', () => { it('should not retry connecting if failed due to wrong auth', async () => { const client = RedisClient.create({ - socket: { - ...TEST_REDIS_SERVERS[TestRedisServers.PASSWORD], - password: 'wrongpassword' - } + ...TEST_REDIS_SERVERS[TestRedisServers.PASSWORD], + password: 'wrongpassword' }); await assert.rejects( @@ -49,7 +94,7 @@ describe('Client', () => { describe('legacyMode', () => { const client = RedisClient.create({ - socket: TEST_REDIS_SERVERS[TestRedisServers.OPEN], + ...TEST_REDIS_SERVERS[TestRedisServers.OPEN], scripts: { square: SQUARE_SCRIPT }, @@ -173,9 +218,7 @@ describe('Client', () => { describe('events', () => { it('connect, ready, end', async () => { - const client = RedisClient.create({ - socket: TEST_REDIS_SERVERS[TestRedisServers.OPEN] - }); + const client = RedisClient.create(TEST_REDIS_SERVERS[TestRedisServers.OPEN]); await Promise.all([ client.connect(), @@ -550,9 +593,7 @@ describe('Client', () => { }); it('client.quit', async () => { - const client = RedisClient.create({ - socket: TEST_REDIS_SERVERS[TestRedisServers.OPEN] - }); + const client = RedisClient.create(TEST_REDIS_SERVERS[TestRedisServers.OPEN]); await client.connect(); diff --git a/lib/client.ts b/lib/client.ts index c9e9cecf924..93afee1ff1a 100644 --- a/lib/client.ts +++ b/lib/client.ts @@ -1,4 +1,4 @@ -import RedisSocket, { RedisSocketOptions } from './socket'; +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'; @@ -12,9 +12,14 @@ import { HScanTuple } from './commands/HSCAN'; import { encodeCommand, extendWithDefaultCommands, extendWithModulesAndScripts, transformCommandArguments } from './commander'; import { Pool, Options as PoolOptions, createPool } from 'generic-pool'; import { ClientClosedError } from './errors'; +import { URL } from 'url'; export interface RedisClientOptions { + url?: string; socket?: RedisSocketOptions; + username?: string; + password?: string; + database?: number; modules?: M; scripts?: S; commandsQueueMaxLength?: number; @@ -71,6 +76,45 @@ export default class RedisClient { + // https://www.iana.org/assignments/uri-schemes/prov/redis + const { hostname, port, protocol, username, password, pathname } = new URL(url), + parsed: RedisClientOptions<{}, {}> = { + socket: { + host: hostname + } + }; + + if (protocol === 'rediss:') { + (parsed.socket as RedisTlsSocketOptions).tls = true; + } else if (protocol !== 'redis:') { + throw new TypeError('Invalid protocol'); + } + + if (port) { + (parsed.socket as RedisNetSocketOptions).port = Number(port); + } + + if (username) { + parsed.username = username; + } + + if (password) { + parsed.password = password; + } + + if (pathname.length > 1) { + const database = Number(pathname.substring(1)); + if (isNaN(database)) { + throw new TypeError('Invalid pathname'); + } + + parsed.database = database; + } + + return parsed; + } + readonly #options?: RedisClientOptions; readonly #socket: RedisSocket; readonly #queue: RedisCommandsQueue; @@ -96,7 +140,7 @@ export default class RedisClient) { super(); - this.#options = options; + this.#options = this.#initiateOptions(options); this.#socket = this.#initiateSocket(); this.#queue = this.#initiateQueue(); this.#isolationPool = createPool({ @@ -110,6 +154,23 @@ export default class RedisClient): RedisClientOptions | undefined { + if (options?.url) { + const parsed = RedisClient.parseURL(options.url); + if (options.socket) { + parsed.socket = Object.assign(options.socket, parsed.socket); + } + + Object.assign(options, parsed); + } + + if (options?.database) { + this.#selectedDB = options.database; + } + + return options; + } + #initiateSocket(): RedisSocket { const socketInitiator = async (): Promise => { const v4Commands = this.#options?.legacyMode ? this.#v4 : this, @@ -123,8 +184,8 @@ export default class RedisClient { connectEvent: string; @@ -44,14 +38,6 @@ export default class RedisSocket extends EventEmitter { static #initiateOptions(options?: RedisSocketOptions): RedisSocketOptions { options ??= {}; if (!RedisSocket.#isUnixSocket(options)) { - if (RedisSocket.#isUrlSocket(options)) { - const url = new URL(options.url); - (options as RedisNetSocketOptions).port = Number(url.port); - (options as RedisNetSocketOptions).host = url.hostname; - options.username = url.username; - options.password = url.password; - } - (options as RedisNetSocketOptions).port ??= 6379; (options as RedisNetSocketOptions).host ??= '127.0.0.1'; } @@ -67,10 +53,6 @@ export default class RedisSocket extends EventEmitter { return Math.min(retries * 50, 500); } - static #isUrlSocket(options: RedisSocketOptions): options is RedisUrlSocketOptions { - return Object.prototype.hasOwnProperty.call(options, 'url'); - } - static #isUnixSocket(options: RedisSocketOptions): options is RedisUnixSocketOptions { return Object.prototype.hasOwnProperty.call(options, 'path'); } diff --git a/lib/test-utils.ts b/lib/test-utils.ts index 84685923693..713a1a3434a 100644 --- a/lib/test-utils.ts +++ b/lib/test-utils.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import RedisClient, { RedisClientType } from './client'; +import RedisClient, { RedisClientOptions, RedisClientType } from './client'; import { execSync, spawn } from 'child_process'; import { once } from 'events'; import { RedisSocketOptions } from './socket'; @@ -9,6 +9,8 @@ import RedisCluster, { 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'; type RedisVersion = [major: number, minor: number, patch: number]; @@ -52,7 +54,7 @@ export enum TestRedisServers { PASSWORD } -export const TEST_REDIS_SERVERS: Record = {}; +export const TEST_REDIS_SERVERS: Record> = {}; export enum TestRedisClusters { OPEN @@ -226,13 +228,17 @@ export async function spawnGlobalRedisCluster(type: TestRedisClusters | null, nu async function spawnOpenServer(): Promise { TEST_REDIS_SERVERS[TestRedisServers.OPEN] = { - port: await spawnGlobalRedisServer() + socket: { + port: await spawnGlobalRedisServer() + } }; } async function spawnPasswordServer(): Promise { TEST_REDIS_SERVERS[TestRedisServers.PASSWORD] = { - port: await spawnGlobalRedisServer(['--requirepass', 'password']), + socket: { + port: await spawnGlobalRedisServer(['--requirepass', 'password']), + }, password: 'password' }; @@ -285,9 +291,7 @@ export function itWithClient( it(title, async function () { if (handleMinimumRedisVersion(this, options?.minimumRedisVersion)) return; - const client = RedisClient.create({ - socket: TEST_REDIS_SERVERS[type] - }); + const client = RedisClient.create(TEST_REDIS_SERVERS[type]); await client.connect(); From ad151cd10d2fb839888583fd8c12c45d2ac3b2f2 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 21 Sep 2021 18:45:17 -0400 Subject: [PATCH 018/112] fix README, remove unused import, downgrade typedoc & typedoc-plugin-markdown --- README.md | 92 ++++++++------- lib/socket.ts | 1 - package-lock.json | 288 ++++++++++++++++++++++++++-------------------- package.json | 10 +- 4 files changed, 212 insertions(+), 179 deletions(-) diff --git a/README.md b/README.md index 2c465ae69fa..0ac104a2c21 100644 --- a/README.md +++ b/README.md @@ -35,27 +35,25 @@ npm install redis@next ### Basic Example ```typescript -import { createClient } from "redis"; +import { createClient } from 'redis'; (async () => { const client = createClient(); - client.on("error", (err) => console.log("Redis Client Error", err)); + client.on('error', (err) => console.log('Redis Client Error', err)); await client.connect(); - await client.set("key", "value"); - const value = await client.get("key"); + await client.set('key', 'value'); + const value = await client.get('key'); })(); ``` -The above code connects to localhost on port 6379. To connect to a different host or port, use a connection string in the format `[redis[s]:]//[[username][:password]@][host][:port]`: +The above code connects to localhost on port 6379. To connect to a different host or port, use a connection string in the format `redis[s]://[[username][:password]@][host][:port][/db-number]`: ```typescript createClient({ - socket: { - url: "redis://alice:foobared@awesome.redis.server:6380", - }, + url: 'redis://alice:foobared@awesome.redis.server:6380', }); ``` @@ -67,18 +65,18 @@ There is built-in support for all of the [out-of-the-box Redis commands](https:/ ```typescript // raw Redis commands -await client.HSET("key", "field", "value"); -await client.HGETALL("key"); +await client.HSET('key', 'field', 'value'); +await client.HGETALL('key'); // friendly JavaScript commands -await client.hSet("key", "field", "value"); -await client.hGetAll("key"); +await client.hSet('key', 'field', 'value'); +await client.hGetAll('key'); ``` Modifiers to commands are specified using a JavaScript object: ```typescript -await client.set("key", "value", { +await client.set('key', 'value', { EX: 10, NX: true, }); @@ -87,8 +85,8 @@ await client.set("key", "value", { Replies will be transformed into useful data structures: ```typescript -await client.hGetAll("key"); // { field1: 'value1', field2: 'value2' } -await client.hVals("key"); // ['value1', 'value2'] +await client.hGetAll('key'); // { field1: 'value1', field2: 'value2' } +await client.hVals('key'); // ['value1', 'value2'] ``` ### Unsupported Redis Commands @@ -96,9 +94,9 @@ await client.hVals("key"); // ['value1', 'value2'] If you want to run commands and/or use arguments that Node Redis doesn't know about (yet!) use `.sendCommand()`: ```typescript -await client.sendCommand(["SET", "key", "value", "NX"]); // 'OK' +await client.sendCommand(['SET', 'key', 'value', 'NX']); // 'OK' -await client.sendCommand(["HGETALL", "key"]); // ['key1', 'field1', 'key2', 'field2'] +await client.sendCommand(['HGETALL', 'key']); // ['key1', 'field1', 'key2', 'field2'] ``` ### Transactions (Multi/Exec) @@ -106,12 +104,12 @@ await client.sendCommand(["HGETALL", "key"]); // ['key1', 'field1', 'key2', 'fie Start a [transaction](https://redis.io/topics/transactions) by calling `.multi()`, then chaining your commands. When you're done, call `.exec()` and you'll get an array back with your results: ```typescript -await client.set("another-key", "another-value"); +await client.set('another-key', 'another-value'); const [setKeyReply, otherKeyValue] = await client .multi() - .set("key", "value") - .get("another-key") + .set('key', 'value') + .get('another-key') .exec(); // ['OK', 'another-value'] ``` @@ -126,11 +124,11 @@ Any command can be run on a new connection by specifying the `isolated` option. This pattern works especially well for blocking commands—such as `BLPOP` and `BLMOVE`: ```typescript -import { commandOptions } from "redis"; +import { commandOptions } from 'redis'; -const blPopPromise = client.blPop(commandOptions({ isolated: true }), "key"); +const blPopPromise = client.blPop(commandOptions({ isolated: true }), 'key'); -await client.lPush("key", ["1", "2"]); +await client.lPush('key', ['1', '2']); await blPopPromise; // '2' ``` @@ -150,23 +148,23 @@ await subscriber.connect(); Once you have one, simply subscribe and unsubscribe as needed: ```typescript -await subscriber.subscribe("channel", (message) => { +await subscriber.subscribe('channel', (message) => { console.log(message); // 'message' }); -await subscriber.pSubscribe("channe*", (message, channel) => { +await subscriber.pSubscribe('channe*', (message, channel) => { console.log(message, channel); // 'message', 'channel' }); -await subscriber.unsubscribe("channel"); +await subscriber.unsubscribe('channel'); -await subscriber.pUnsubscribe("channe*"); +await subscriber.pUnsubscribe('channe*'); ``` Publish a message on a channel: ```typescript -await publisher.publish("channel", "message"); +await publisher.publish('channel', 'message'); ``` ### Scan Iterator @@ -183,11 +181,11 @@ 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 member of client.hScanIterator('hash')) { } -for await (const { field, value } of client.sScanIterator("set")) { +for await (const { field, value } of client.sScanIterator('set')) { } -for await (const { member, score } of client.zScanIterator("sorted-set")) { +for await (const { member, score } of client.zScanIterator('sorted-set')) { } ``` @@ -195,8 +193,8 @@ You can override the default options by providing a configuration object: ```typescript client.scanIterator({ - TYPE: "string", // `SCAN` only - MATCH: "patter*", + TYPE: 'string', // `SCAN` only + MATCH: 'patter*', COUNT: 100, }); ``` @@ -206,7 +204,7 @@ 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, defineScript } from 'redis'; (async () => { const client = createClient({ @@ -214,7 +212,7 @@ import { createClient, defineScript } from "redis"; add: defineScript({ NUMBER_OF_KEYS: 1, SCRIPT: - 'local val = redis.pcall("GET", KEYS[1]);' + "return val + ARGV[1];", + "local val = redis.pcall('GET', KEYS[1]);' + 'return val + ARGV[1];", transformArguments(key: string, toAdd: number): Array { return [key, number.toString()]; }, @@ -227,8 +225,8 @@ import { createClient, defineScript } from "redis"; await client.connect(); - await client.set("key", "1"); - await client.add("key", 2); // 3 + await client.set('key', '1'); + await client.add('key', 2); // 3 })(); ``` @@ -237,28 +235,28 @@ import { createClient, defineScript } from "redis"; Connecting to a cluster is a bit different. Create the client by specifying some (or all) of the nodes in your cluster and then use it like a non-clustered client: ```typescript -import { createCluster } from "redis"; +import { createCluster } from 'redis'; (async () => { const cluster = createCluster({ rootNodes: [ { - host: "10.0.0.1", + host: '10.0.0.1', port: 30001, }, { - host: "10.0.0.2", + host: '10.0.0.2', port: 30002, }, ], }); - cluster.on("error", (err) => console.log("Redis Cluster Error", err)); + cluster.on('error', (err) => console.log('Redis Cluster Error', err)); await cluster.connect(); - await cluster.set("key", "value"); - const value = await cluster.get("key"); + await cluster.set('key', 'value'); + const value = await cluster.get('key'); })(); ``` @@ -267,16 +265,16 @@ import { createCluster } from "redis"; Node Redis will automatically pipeline requests that are made during the same "tick". ```typescript -client.set("Tm9kZSBSZWRpcw==", "users:1"); -client.sAdd("users:1:tokens", "Tm9kZSBSZWRpcw=="); +client.set('Tm9kZSBSZWRpcw==', 'users:1'); +client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw=='); ``` Of course, if you don't do something with your Promises you're certain to get [unhandled Promise exceptions](https://nodejs.org/api/process.html#process_event_unhandledrejection). To take advantage of auto-pipelining and handle your Promises, use `Promise.all()`. ```typescript await Promise.all([ - client.set("Tm9kZSBSZWRpcw==", "users:1"), - client.sAdd("users:1:tokens", "Tm9kZSBSZWRpcw=="), + client.set('Tm9kZSBSZWRpcw==', 'users:1'), + client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw=='), ]); ``` diff --git a/lib/socket.ts b/lib/socket.ts index 35673501876..8bc94c5ba07 100644 --- a/lib/socket.ts +++ b/lib/socket.ts @@ -1,7 +1,6 @@ import EventEmitter from 'events'; import net from 'net'; import tls from 'tls'; -import { URL } from 'url'; import { ConnectionTimeoutError, ClientClosedError } from './errors'; import { promiseTimeout } from './utils'; diff --git a/package-lock.json b/package-lock.json index 9986a955bf6..8d37f49d73b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,19 +17,19 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@types/mocha": "^9.0.0", - "@types/node": "^16.9.4", - "@types/sinon": "^10.0.2", + "@types/node": "^16.9.6", + "@types/sinon": "^10.0.3", "@types/which": "^2.0.1", "@types/yallist": "^4.0.1", "mocha": "^9.1.1", "nyc": "^15.1.0", - "release-it": "^14.11.5", + "release-it": "^14.11.6", "sinon": "^11.1.2", "source-map-support": "^0.5.20", "ts-node": "^10.2.1", - "typedoc": "^0.22.4", + "typedoc": "0.21.9", "typedoc-github-wiki-theme": "^0.5.1", - "typedoc-plugin-markdown": "^3.11.0", + "typedoc-plugin-markdown": "3.10.4", "typescript": "^4.4.3", "which": "^2.0.2" }, @@ -680,12 +680,12 @@ } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.7.0.tgz", - "integrity": "sha512-G7sgccWRYQMwcHJXkDY/sDxbXeKiZkFQqUtzBCwmrzCNj2GQf3VygQ4T/BFL2crLVpIbenkE/c0ErhYOte2MPw==", + "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==", "dev": true, "dependencies": { - "@octokit/types": "^6.24.0", + "@octokit/types": "^6.28.1", "deprecation": "^2.3.1" }, "peerDependencies": { @@ -718,15 +718,15 @@ } }, "node_modules/@octokit/rest": { - "version": "18.9.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.9.0.tgz", - "integrity": "sha512-VrmrE8gjpuOoDAGjrQq2j9ZhOE6LxaqxaQg0yMrrEnnQZy2ZcAnr5qbVfKsMF0up/48PRV/VFS/2GSMhA7nTdA==", + "version": "18.10.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.10.0.tgz", + "integrity": "sha512-esHR5OKy38bccL/sajHqZudZCvmv4yjovMJzyXlphaUo7xykmtOdILGJ3aAm0mFHmMLmPFmDMJXf39cAjNJsrw==", "dev": true, "dependencies": { - "@octokit/core": "^3.5.0", - "@octokit/plugin-paginate-rest": "^2.6.2", - "@octokit/plugin-request-log": "^1.0.2", - "@octokit/plugin-rest-endpoint-methods": "5.7.0" + "@octokit/core": "^3.5.1", + "@octokit/plugin-paginate-rest": "^2.16.0", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^5.9.0" } }, "node_modules/@octokit/types": { @@ -855,9 +855,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.9.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.4.tgz", - "integrity": "sha512-KDazLNYAGIuJugdbULwFZULF9qQ13yNWEBFnfVpqlpgAAo6H/qnM9RjBgh0A0kmHf3XxAKLdN5mTIng9iUvVLA==", + "version": "16.9.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.6.tgz", + "integrity": "sha512-YHUZhBOMTM3mjFkXVcK+WwAcYmyhe1wL4lfqNtzI0b3qAy7yuSetnM7QJazgE5PFmgVTNGiLOgRFfJMqW7XpSQ==", "dev": true }, "node_modules/@types/parse-json": { @@ -876,9 +876,9 @@ } }, "node_modules/@types/sinon": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.2.tgz", - "integrity": "sha512-BHn8Bpkapj8Wdfxvh2jWIUoaYB/9/XhsL0oOvBfRagJtKlSl9NWPcFOz2lRukI9szwGxFtYZCTejJSqsGDbdmw==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.3.tgz", + "integrity": "sha512-XUaFuUOQ3A/r6gS1qCU/USMleascaqGeQpGR1AZ5JdRtBPlzijRzKsik1TuGzvdtPA0mdq42JqaJmJ+Afg1LJg==", "dev": true, "dependencies": { "@sinonjs/fake-timers": "^7.1.0" @@ -1108,12 +1108,12 @@ } }, "node_modules/async-retry": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.1.tgz", - "integrity": "sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", "dev": true, "dependencies": { - "retry": "0.12.0" + "retry": "0.13.1" } }, "node_modules/asynckit": { @@ -1390,9 +1390,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001258", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001258.tgz", - "integrity": "sha512-RBByOG6xWXUp0CR2/WU2amXz3stjKpSl5J1xU49F1n2OxD//uBZO4wCKUiG+QMGf7CHGfDDcqoKriomoGVxTeA==", + "version": "1.0.30001259", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001259.tgz", + "integrity": "sha512-V7mQTFhjITxuk9zBpI6nYsiTXhcPe05l+364nZjK7MFK/E7ibvYBSAXr4YcA6oPR8j3ZLM/LN+lUqUVAQEUZFg==", "dev": true, "funding": { "type": "opencollective", @@ -1626,9 +1626,9 @@ } }, "node_modules/cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", "dev": true, "dependencies": { "@types/parse-json": "^4.0.0", @@ -1845,9 +1845,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.3.844", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.844.tgz", - "integrity": "sha512-7ES6GQVsbgsUA49/apqub51I9ij8E3QwGqq/IRvO6OPCly3how/YUSg1GPslRWq+BteT2h94iAIQdJbuVVH4Pg==", + "version": "1.3.846", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.846.tgz", + "integrity": "sha512-2jtSwgyiRzybHRxrc2nKI+39wH3AwQgn+sogQ+q814gv8hIFwrcZbV07Ea9f8AmK0ufPVZUvvAG1uZJ+obV4Jw==", "dev": true }, "node_modules/emoji-regex": { @@ -2217,9 +2217,9 @@ } }, "node_modules/git-url-parse": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.5.0.tgz", - "integrity": "sha512-TZYSMDeM37r71Lqg1mbnMlOqlHd7BSij9qN7XwTkRqSAYFMihGLGhfHwgqQob3GUhEneKnV4nskN9rbQw2KGxA==", + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.6.0.tgz", + "integrity": "sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g==", "dev": true, "dependencies": { "git-up": "^4.0.0" @@ -2615,9 +2615,9 @@ } }, "node_modules/inquirer": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.2.tgz", - "integrity": "sha512-DHLKJwLPNgkfwNmsuEUKSejJFbkv0FMO9SMiQbjI3n5NQuCrSIBqP66ggqyz2a6t2qEolKrMjhQ3+W/xXgUQ+Q==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.5.tgz", + "integrity": "sha512-G6/9xUqmt/r+UvufSyrPpt84NYwhKZ9jLsgMbQzlx804XErNupor8WQdBnBRrXmBfTPpuwf1sV+ss2ovjgdXIg==", "dev": true, "dependencies": { "ansi-escapes": "^4.2.1", @@ -2628,7 +2628,7 @@ "figures": "^3.0.0", "lodash": "^4.17.21", "mute-stream": "0.0.8", - "ora": "^5.3.0", + "ora": "^5.4.1", "run-async": "^2.4.0", "rxjs": "^7.2.0", "string-width": "^4.1.0", @@ -3425,9 +3425,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.3.tgz", - "integrity": "sha512-BXSmNTLLDHT0UjQDg5E23x+0n/hPDjySqc0ELE4NpCa2wE5qmmaEWFRP/+v8pfuocchR9l5vFLbSB7CPE2ahvQ==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-aD1fO+xtLiSCc9vuD+sYMxpIuQyhHscGSkBEo2o5LTV/3bTEAYvdUii29n8LlO5uLCmWdGP7uVUVXFo5SRdkLA==", "dev": true, "dependencies": { "whatwg-url": "^5.0.0" @@ -4210,6 +4210,15 @@ "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", @@ -4424,25 +4433,25 @@ } }, "node_modules/release-it": { - "version": "14.11.5", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.11.5.tgz", - "integrity": "sha512-9BaPdq7ZKOwtzz3p1mRhg/tOH/cT/y2tUnPYzUwQiVdj42JaGI1Vo2l3WbgK8ICsbFyrhc0tri1+iqI8OvkI1A==", + "version": "14.11.6", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.11.6.tgz", + "integrity": "sha512-6BNcuzFZHThBUBJ/xYw/bxZ+58CAwrwf1zgmjq2Ibl3nlDZbjphHG6iqxkJu7mZ8TIWs6NjloEAhqpjeXoN//Q==", "dev": true, "dependencies": { "@iarna/toml": "2.2.5", - "@octokit/rest": "18.9.0", - "async-retry": "1.3.1", + "@octokit/rest": "18.10.0", + "async-retry": "1.3.3", "chalk": "4.1.2", - "cosmiconfig": "7.0.0", + "cosmiconfig": "7.0.1", "debug": "4.3.2", "deprecated-obj": "2.0.0", "execa": "5.1.1", "form-data": "4.0.0", - "git-url-parse": "11.5.0", + "git-url-parse": "11.6.0", "globby": "11.0.4", "got": "11.8.2", "import-cwd": "3.0.0", - "inquirer": "8.1.2", + "inquirer": "8.1.5", "is-ci": "3.0.0", "lodash": "4.17.21", "mime-types": "2.1.32", @@ -4612,9 +4621,9 @@ } }, "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, "engines": { "node": ">= 4" @@ -5166,16 +5175,19 @@ } }, "node_modules/typedoc": { - "version": "0.22.4", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.4.tgz", - "integrity": "sha512-M/a8NnPxq3/iZNNVjzFCK5gu4m//HTJIPbSS0JQVbkHJPP9wyepR12agylWTSqeVZe0xsbidVtO26+PP7iD/jw==", + "version": "0.21.9", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.21.9.tgz", + "integrity": "sha512-VRo7aII4bnYaBBM1lhw4bQFmUcDQV8m8tqgjtc7oXl87jc1Slbhfw2X5MccfcR2YnEClHDWgsiQGgNB8KJXocA==", "dev": true, "dependencies": { "glob": "^7.1.7", + "handlebars": "^4.7.7", "lunr": "^2.3.9", - "marked": "^3.0.4", - "minimatch": "^3.0.4", - "shiki": "^0.9.11" + "marked": "^3.0.2", + "minimatch": "^3.0.0", + "progress": "^2.0.3", + "shiki": "^0.9.8", + "typedoc-default-themes": "^0.12.10" }, "bin": { "typedoc": "bin/typedoc" @@ -5187,6 +5199,15 @@ "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", @@ -5198,15 +5219,15 @@ } }, "node_modules/typedoc-plugin-markdown": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.11.0.tgz", - "integrity": "sha512-zewcbzOlMV9nbhLsJhKBpoRW4J32LgbfdqwYfEfzzeE+wGOaOfsM6g7QH+ZKj8n+knH4sLCtk6XMN1TI/a1UuQ==", + "version": "3.10.4", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.10.4.tgz", + "integrity": "sha512-if9w7S9fXLg73AYi/EoRSEhTOZlg3I8mIP8YEmvzSE33VrNXC9/hA0nVcLEwFVJeQY7ay6z67I6kW0KIv7LjeA==", "dev": true, "dependencies": { "handlebars": "^4.7.7" }, "peerDependencies": { - "typedoc": ">=0.22.0" + "typedoc": ">=0.21.2" } }, "node_modules/typescript": { @@ -6207,12 +6228,12 @@ "requires": {} }, "@octokit/plugin-rest-endpoint-methods": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.7.0.tgz", - "integrity": "sha512-G7sgccWRYQMwcHJXkDY/sDxbXeKiZkFQqUtzBCwmrzCNj2GQf3VygQ4T/BFL2crLVpIbenkE/c0ErhYOte2MPw==", + "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==", "dev": true, "requires": { - "@octokit/types": "^6.24.0", + "@octokit/types": "^6.28.1", "deprecation": "^2.3.1" } }, @@ -6242,15 +6263,15 @@ } }, "@octokit/rest": { - "version": "18.9.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.9.0.tgz", - "integrity": "sha512-VrmrE8gjpuOoDAGjrQq2j9ZhOE6LxaqxaQg0yMrrEnnQZy2ZcAnr5qbVfKsMF0up/48PRV/VFS/2GSMhA7nTdA==", + "version": "18.10.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.10.0.tgz", + "integrity": "sha512-esHR5OKy38bccL/sajHqZudZCvmv4yjovMJzyXlphaUo7xykmtOdILGJ3aAm0mFHmMLmPFmDMJXf39cAjNJsrw==", "dev": true, "requires": { - "@octokit/core": "^3.5.0", - "@octokit/plugin-paginate-rest": "^2.6.2", - "@octokit/plugin-request-log": "^1.0.2", - "@octokit/plugin-rest-endpoint-methods": "5.7.0" + "@octokit/core": "^3.5.1", + "@octokit/plugin-paginate-rest": "^2.16.0", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^5.9.0" } }, "@octokit/types": { @@ -6370,9 +6391,9 @@ "dev": true }, "@types/node": { - "version": "16.9.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.4.tgz", - "integrity": "sha512-KDazLNYAGIuJugdbULwFZULF9qQ13yNWEBFnfVpqlpgAAo6H/qnM9RjBgh0A0kmHf3XxAKLdN5mTIng9iUvVLA==", + "version": "16.9.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.6.tgz", + "integrity": "sha512-YHUZhBOMTM3mjFkXVcK+WwAcYmyhe1wL4lfqNtzI0b3qAy7yuSetnM7QJazgE5PFmgVTNGiLOgRFfJMqW7XpSQ==", "dev": true }, "@types/parse-json": { @@ -6391,9 +6412,9 @@ } }, "@types/sinon": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.2.tgz", - "integrity": "sha512-BHn8Bpkapj8Wdfxvh2jWIUoaYB/9/XhsL0oOvBfRagJtKlSl9NWPcFOz2lRukI9szwGxFtYZCTejJSqsGDbdmw==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.3.tgz", + "integrity": "sha512-XUaFuUOQ3A/r6gS1qCU/USMleascaqGeQpGR1AZ5JdRtBPlzijRzKsik1TuGzvdtPA0mdq42JqaJmJ+Afg1LJg==", "dev": true, "requires": { "@sinonjs/fake-timers": "^7.1.0" @@ -6570,12 +6591,12 @@ "dev": true }, "async-retry": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.1.tgz", - "integrity": "sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", "dev": true, "requires": { - "retry": "0.12.0" + "retry": "0.13.1" } }, "asynckit": { @@ -6770,9 +6791,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001258", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001258.tgz", - "integrity": "sha512-RBByOG6xWXUp0CR2/WU2amXz3stjKpSl5J1xU49F1n2OxD//uBZO4wCKUiG+QMGf7CHGfDDcqoKriomoGVxTeA==", + "version": "1.0.30001259", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001259.tgz", + "integrity": "sha512-V7mQTFhjITxuk9zBpI6nYsiTXhcPe05l+364nZjK7MFK/E7ibvYBSAXr4YcA6oPR8j3ZLM/LN+lUqUVAQEUZFg==", "dev": true }, "chalk": { @@ -6954,9 +6975,9 @@ } }, "cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", "dev": true, "requires": { "@types/parse-json": "^4.0.0", @@ -7118,9 +7139,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.844", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.844.tgz", - "integrity": "sha512-7ES6GQVsbgsUA49/apqub51I9ij8E3QwGqq/IRvO6OPCly3how/YUSg1GPslRWq+BteT2h94iAIQdJbuVVH4Pg==", + "version": "1.3.846", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.846.tgz", + "integrity": "sha512-2jtSwgyiRzybHRxrc2nKI+39wH3AwQgn+sogQ+q814gv8hIFwrcZbV07Ea9f8AmK0ufPVZUvvAG1uZJ+obV4Jw==", "dev": true }, "emoji-regex": { @@ -7383,9 +7404,9 @@ } }, "git-url-parse": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.5.0.tgz", - "integrity": "sha512-TZYSMDeM37r71Lqg1mbnMlOqlHd7BSij9qN7XwTkRqSAYFMihGLGhfHwgqQob3GUhEneKnV4nskN9rbQw2KGxA==", + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.6.0.tgz", + "integrity": "sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g==", "dev": true, "requires": { "git-up": "^4.0.0" @@ -7664,9 +7685,9 @@ "dev": true }, "inquirer": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.2.tgz", - "integrity": "sha512-DHLKJwLPNgkfwNmsuEUKSejJFbkv0FMO9SMiQbjI3n5NQuCrSIBqP66ggqyz2a6t2qEolKrMjhQ3+W/xXgUQ+Q==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.5.tgz", + "integrity": "sha512-G6/9xUqmt/r+UvufSyrPpt84NYwhKZ9jLsgMbQzlx804XErNupor8WQdBnBRrXmBfTPpuwf1sV+ss2ovjgdXIg==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", @@ -7677,7 +7698,7 @@ "figures": "^3.0.0", "lodash": "^4.17.21", "mute-stream": "0.0.8", - "ora": "^5.3.0", + "ora": "^5.4.1", "run-async": "^2.4.0", "rxjs": "^7.2.0", "string-width": "^4.1.0", @@ -8279,9 +8300,9 @@ } }, "node-fetch": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.3.tgz", - "integrity": "sha512-BXSmNTLLDHT0UjQDg5E23x+0n/hPDjySqc0ELE4NpCa2wE5qmmaEWFRP/+v8pfuocchR9l5vFLbSB7CPE2ahvQ==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-aD1fO+xtLiSCc9vuD+sYMxpIuQyhHscGSkBEo2o5LTV/3bTEAYvdUii29n8LlO5uLCmWdGP7uVUVXFo5SRdkLA==", "dev": true, "requires": { "whatwg-url": "^5.0.0" @@ -8884,6 +8905,12 @@ "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", @@ -9038,25 +9065,25 @@ } }, "release-it": { - "version": "14.11.5", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.11.5.tgz", - "integrity": "sha512-9BaPdq7ZKOwtzz3p1mRhg/tOH/cT/y2tUnPYzUwQiVdj42JaGI1Vo2l3WbgK8ICsbFyrhc0tri1+iqI8OvkI1A==", + "version": "14.11.6", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.11.6.tgz", + "integrity": "sha512-6BNcuzFZHThBUBJ/xYw/bxZ+58CAwrwf1zgmjq2Ibl3nlDZbjphHG6iqxkJu7mZ8TIWs6NjloEAhqpjeXoN//Q==", "dev": true, "requires": { "@iarna/toml": "2.2.5", - "@octokit/rest": "18.9.0", - "async-retry": "1.3.1", + "@octokit/rest": "18.10.0", + "async-retry": "1.3.3", "chalk": "4.1.2", - "cosmiconfig": "7.0.0", + "cosmiconfig": "7.0.1", "debug": "4.3.2", "deprecated-obj": "2.0.0", "execa": "5.1.1", "form-data": "4.0.0", - "git-url-parse": "11.5.0", + "git-url-parse": "11.6.0", "globby": "11.0.4", "got": "11.8.2", "import-cwd": "3.0.0", - "inquirer": "8.1.2", + "inquirer": "8.1.5", "is-ci": "3.0.0", "lodash": "4.17.21", "mime-types": "2.1.32", @@ -9184,9 +9211,9 @@ } }, "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true }, "reusify": { @@ -9584,18 +9611,27 @@ } }, "typedoc": { - "version": "0.22.4", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.4.tgz", - "integrity": "sha512-M/a8NnPxq3/iZNNVjzFCK5gu4m//HTJIPbSS0JQVbkHJPP9wyepR12agylWTSqeVZe0xsbidVtO26+PP7iD/jw==", + "version": "0.21.9", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.21.9.tgz", + "integrity": "sha512-VRo7aII4bnYaBBM1lhw4bQFmUcDQV8m8tqgjtc7oXl87jc1Slbhfw2X5MccfcR2YnEClHDWgsiQGgNB8KJXocA==", "dev": true, "requires": { "glob": "^7.1.7", + "handlebars": "^4.7.7", "lunr": "^2.3.9", - "marked": "^3.0.4", - "minimatch": "^3.0.4", - "shiki": "^0.9.11" + "marked": "^3.0.2", + "minimatch": "^3.0.0", + "progress": "^2.0.3", + "shiki": "^0.9.8", + "typedoc-default-themes": "^0.12.10" } }, + "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", @@ -9604,9 +9640,9 @@ "requires": {} }, "typedoc-plugin-markdown": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.11.0.tgz", - "integrity": "sha512-zewcbzOlMV9nbhLsJhKBpoRW4J32LgbfdqwYfEfzzeE+wGOaOfsM6g7QH+ZKj8n+knH4sLCtk6XMN1TI/a1UuQ==", + "version": "3.10.4", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.10.4.tgz", + "integrity": "sha512-if9w7S9fXLg73AYi/EoRSEhTOZlg3I8mIP8YEmvzSE33VrNXC9/hA0nVcLEwFVJeQY7ay6z67I6kW0KIv7LjeA==", "dev": true, "requires": { "handlebars": "^4.7.7" diff --git a/package.json b/package.json index fc107833fc6..ec77a93bb55 100644 --- a/package.json +++ b/package.json @@ -35,19 +35,19 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@types/mocha": "^9.0.0", - "@types/node": "^16.9.4", - "@types/sinon": "^10.0.2", + "@types/node": "^16.9.6", + "@types/sinon": "^10.0.3", "@types/which": "^2.0.1", "@types/yallist": "^4.0.1", "mocha": "^9.1.1", "nyc": "^15.1.0", - "release-it": "^14.11.5", + "release-it": "^14.11.6", "sinon": "^11.1.2", "source-map-support": "^0.5.20", "ts-node": "^10.2.1", - "typedoc": "^0.22.4", + "typedoc": "0.21.9", "typedoc-github-wiki-theme": "^0.5.1", - "typedoc-plugin-markdown": "^3.11.0", + "typedoc-plugin-markdown": "3.10.4", "typescript": "^4.4.3", "which": "^2.0.2" }, From 1c13a6575f1f68e6779c32bcbacf91db40058ec8 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 21 Sep 2021 18:49:21 -0400 Subject: [PATCH 019/112] update client-configurations.md --- docs/client-configuration.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/client-configuration.md b/docs/client-configuration.md index 0c4c0c1ca8f..11fdb0a6819 100644 --- a/docs/client-configuration.md +++ b/docs/client-configuration.md @@ -6,6 +6,7 @@ | socket | | Object defining socket connection properties | | socket.host | `'localhost'` | Hostname to connect to | | socket.port | `6379` | Port to connect to | +| socket.path | | UNIX Socket to connect to | | socket.connectTimeout | `5000` | The timeout for connecting to the Redis Server (in milliseconds) | | socket.noDelay | `true` | Enable/disable the use of [`Nagle's algorithm`](https://nodejs.org/api/net.html#net_socket_setnodelay_nodelay) | | socket.keepAlive | `5000` | Enable/disable the [`keep-alive`](https://nodejs.org/api/net.html#net_socket_setkeepalive_enable_initialdelay) functionality | From 9237a4e68aef4aae5af291cbb966a46d6715682f Mon Sep 17 00:00:00 2001 From: leibale Date: Thu, 23 Sep 2021 11:06:30 -0400 Subject: [PATCH 020/112] fix README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0ac104a2c21..c5f0ea1a1c9 100644 --- a/README.md +++ b/README.md @@ -287,6 +287,7 @@ Thank you to all the people who already contributed to Node Redis! + ## License This repository is licensed under the "MIT" license. See [LICENSE](LICENSE). From 42dcf802b14ff5b1aeda3c87eba9dd3426107b31 Mon Sep 17 00:00:00 2001 From: leibale Date: Thu, 23 Sep 2021 16:17:00 -0400 Subject: [PATCH 021/112] add CLUSTER_SLOTS, add some tests --- lib/client.spec.ts | 29 ++++++++++++ lib/commands/CLUSTER_SLOTS.spec.ts | 76 ++++++++++++++++++++++++++++++ lib/commands/CLUSTER_SLOTS.ts | 41 ++++++++++++++++ lib/commands/index.ts | 3 ++ 4 files changed, 149 insertions(+) create mode 100644 lib/commands/CLUSTER_SLOTS.spec.ts create mode 100644 lib/commands/CLUSTER_SLOTS.ts diff --git a/lib/client.spec.ts b/lib/client.spec.ts index 06f8d2bb102..9f600c79185 100644 --- a/lib/client.spec.ts +++ b/lib/client.spec.ts @@ -5,6 +5,7 @@ import RedisClient from './client'; import { AbortError, ClientClosedError, ConnectionTimeoutError, WatchError } from './errors'; import { defineScript } from './lua-script'; import { spy } from 'sinon'; +import { RedisNetSocketOptions } from './socket'; export const SQUARE_SCRIPT = defineScript({ NUMBER_OF_KEYS: 0, @@ -63,6 +64,34 @@ describe('Client', () => { TypeError ); }); + + it('redis://localhost', () => { + assert.deepEqual( + RedisClient.parseURL('redis://localhost'), + { + socket: { + host: 'localhost', + } + } + ); + }); + + it('createClient with url', async () => { + const client = RedisClient.create({ + url: `redis://localhost:${(TEST_REDIS_SERVERS[TestRedisServers.OPEN].socket as RedisNetSocketOptions)!.port!.toString()}/1` + }); + + await client.connect(); + + try { + assert.equal( + (await client.clientInfo()).db, + 1 + ); + } finally { + await client.disconnect(); + } + }); }); describe('authentication', () => { diff --git a/lib/commands/CLUSTER_SLOTS.spec.ts b/lib/commands/CLUSTER_SLOTS.spec.ts new file mode 100644 index 00000000000..ec6773bcdd4 --- /dev/null +++ b/lib/commands/CLUSTER_SLOTS.spec.ts @@ -0,0 +1,76 @@ +import { strict as assert } from 'assert'; +import { transformArguments, transformReply } from './CLUSTER_SLOTS'; + +describe('CLUSTER SLOTS', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments(), + ['CLUSTER', 'SLOTS'] + ); + }); + + it('transformReply', () => { + assert.deepEqual( + transformReply([ + [ + 0, + 5460, + ['127.0.0.1', 30001, '09dbe9720cda62f7865eabc5fd8857c5d2678366'], + ['127.0.0.1', 30004, '821d8ca00d7ccf931ed3ffc7e3db0599d2271abf'] + ], + [ + 5461, + 10922, + ['127.0.0.1', 30002, 'c9d93d9f2c0c524ff34cc11838c2003d8c29e013'], + ['127.0.0.1', 30005, 'faadb3eb99009de4ab72ad6b6ed87634c7ee410f'] + ], + [ + 10923, + 16383, + ['127.0.0.1', 30003, '044ec91f325b7595e76dbcb18cc688b6a5b434a1'], + ['127.0.0.1', 30006, '58e6e48d41228013e5d9c1c37c5060693925e97e'] + ] + ]), + [{ + from: 0, + to: 5460, + master: { + ip: '127.0.0.1', + port: 30001, + id: '09dbe9720cda62f7865eabc5fd8857c5d2678366' + }, + replicas: [{ + ip: '127.0.0.1', + port: 30004, + id: '821d8ca00d7ccf931ed3ffc7e3db0599d2271abf' + }] + }, { + from: 5461, + to: 10922, + master: { + ip: '127.0.0.1', + port: 30002, + id: 'c9d93d9f2c0c524ff34cc11838c2003d8c29e013' + }, + replicas: [{ + ip: '127.0.0.1', + port: 30005, + id: 'faadb3eb99009de4ab72ad6b6ed87634c7ee410f' + }] + }, { + from: 10923, + to: 16383, + master: { + ip: '127.0.0.1', + port: 30003, + id: '044ec91f325b7595e76dbcb18cc688b6a5b434a1' + }, + replicas: [{ + ip: '127.0.0.1', + port: 30006, + id: '58e6e48d41228013e5d9c1c37c5060693925e97e' + }] + }] + ) + }); +}); diff --git a/lib/commands/CLUSTER_SLOTS.ts b/lib/commands/CLUSTER_SLOTS.ts new file mode 100644 index 00000000000..b4672e731ac --- /dev/null +++ b/lib/commands/CLUSTER_SLOTS.ts @@ -0,0 +1,41 @@ +import { TransformArgumentsReply } from '.'; + +export function transformArguments(): TransformArgumentsReply { + return ['CLUSTER', 'SLOTS']; +} + +type ClusterSlotsRawNode = [ip: string, port: number, id: string]; + +type ClusterSlotsRawReply = Array<[from: number, to: number, master: ClusterSlotsRawNode, ...replicas: Array]>; + +type ClusterSlotsNode = { + ip: string; + port: number; + id: string; +}; + +export type ClusterSlotsReply = Array<{ + from: number; + to: number; + master: ClusterSlotsNode; + replicas: Array; +}>; + +export function transformReply(reply: ClusterSlotsRawReply): ClusterSlotsReply { + return reply.map(([from, to, master, ...replicas]) => { + return { + from, + to, + master: transformNode(master), + replicas: replicas.map(transformNode) + }; + }); +} + +function transformNode([ip, port, id]: ClusterSlotsRawNode): ClusterSlotsNode { + return { + ip, + port, + id + }; +} diff --git a/lib/commands/index.ts b/lib/commands/index.ts index 93220630980..89581090e58 100644 --- a/lib/commands/index.ts +++ b/lib/commands/index.ts @@ -34,6 +34,7 @@ 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'; @@ -317,6 +318,8 @@ export default { clusterReset: CLUSTER_RESET, CLUSTER_SETSLOT, clusterSetSlot: CLUSTER_SETSLOT, + CLUSTER_SLOTS, + clusterSlots: CLUSTER_SLOTS, CONFIG_GET, configGet: CONFIG_GET, CONFIG_RESETASTAT, From 7d286e7ebe38c9a2f1f3161581f09410494bb041 Mon Sep 17 00:00:00 2001 From: leibale Date: Thu, 23 Sep 2021 16:33:47 -0400 Subject: [PATCH 022/112] fix "createClient with url" test with redis 5 --- lib/client.spec.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/client.spec.ts b/lib/client.spec.ts index 9f600c79185..2cf6ea4964e 100644 --- a/lib/client.spec.ts +++ b/lib/client.spec.ts @@ -85,13 +85,13 @@ describe('Client', () => { try { assert.equal( - (await client.clientInfo()).db, - 1 + await client.ping(), + 'PONG' ); } finally { await client.disconnect(); } - }); + }) }); describe('authentication', () => { From 06ee6af14a010e5ff9172c87fa694505d100a63b Mon Sep 17 00:00:00 2001 From: leibale Date: Thu, 23 Sep 2021 16:35:55 -0400 Subject: [PATCH 023/112] remove unused imports --- lib/cluster.ts | 1 - lib/commander.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/lib/cluster.ts b/lib/cluster.ts index 97e87d3d88e..4be0e268207 100644 --- a/lib/cluster.ts +++ b/lib/cluster.ts @@ -6,7 +6,6 @@ import { RedisLuaScript, RedisLuaScripts } from './lua-script'; import { extendWithModulesAndScripts, extendWithDefaultCommands, transformCommandArguments } from './commander'; import RedisMultiCommand, { MultiQueuedCommand, RedisMultiCommandType } from './multi-command'; import { EventEmitter } from 'events'; -import cluster from 'cluster'; export interface RedisClusterOptions { rootNodes: Array; diff --git a/lib/commander.ts b/lib/commander.ts index c2b1918709a..78823516448 100644 --- a/lib/commander.ts +++ b/lib/commander.ts @@ -2,7 +2,6 @@ import COMMANDS, { RedisCommand, RedisModules, TransformArgumentsReply } from './commands'; import { RedisLuaScript, RedisLuaScripts } from './lua-script'; import { CommandOptions, isCommandOptions } from './command-options'; -import { off } from 'process'; type Instantiable = new(...args: Array) => T; From 01df65157a095c81afc02a54a5f98dbfab057737 Mon Sep 17 00:00:00 2001 From: leibale Date: Thu, 23 Sep 2021 16:36:27 -0400 Subject: [PATCH 024/112] Release 4.0.0-rc.2 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 36d4818943c..9fcd62b5996 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "redis", - "version": "4.0.0-rc.1", + "version": "4.0.0-rc.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "redis", - "version": "4.0.0-rc.1", + "version": "4.0.0-rc.2", "license": "MIT", "dependencies": { "cluster-key-slot": "1.1.0", diff --git a/package.json b/package.json index ec77a93bb55..b2ceadbdd16 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redis", - "version": "4.0.0-rc.1", + "version": "4.0.0-rc.2", "description": "A high performance Redis client.", "keywords": [ "database", From 9a1beedda7ef2d07599e061d6f542fa9a2e1e965 Mon Sep 17 00:00:00 2001 From: leibale Date: Thu, 23 Sep 2021 16:52:34 -0400 Subject: [PATCH 025/112] add missing semicolon --- lib/commands/BITFIELD.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/commands/BITFIELD.ts b/lib/commands/BITFIELD.ts index 445c26e28a3..90adb969814 100644 --- a/lib/commands/BITFIELD.ts +++ b/lib/commands/BITFIELD.ts @@ -66,7 +66,7 @@ export function transformArguments(key: string, operations: BitFieldOperations): options.type, options.offset.toString(), options.increment.toString() - ) + ); break; case 'OVERFLOW': From c19d200b91c3c32fde7bf75c859daf9b416a5540 Mon Sep 17 00:00:00 2001 From: leibale Date: Wed, 29 Sep 2021 17:58:16 -0400 Subject: [PATCH 026/112] replace empty "transformReply" functions with typescript "declare" --- benchmark/package-lock.json | 215 ++++------ lib/client.ts | 20 +- lib/cluster.ts | 22 +- lib/commander.ts | 10 +- lib/commands/ACL_CAT.ts | 4 +- lib/commands/ACL_DELUSER.ts | 4 +- lib/commands/ACL_GENPASS.ts | 4 +- lib/commands/ACL_LIST.ts | 4 +- lib/commands/ACL_LOAD.ts | 4 +- lib/commands/ACL_LOG_RESET.ts | 4 +- lib/commands/ACL_SAVE.ts | 4 +- lib/commands/ACL_SETUSER.ts | 4 +- lib/commands/ACL_USERS.ts | 4 +- lib/commands/ACL_WHOAMI.ts | 4 +- lib/commands/APPEND.ts | 4 +- lib/commands/ASKING.ts | 4 +- lib/commands/AUTH.ts | 4 +- lib/commands/BGREWRITEAOF.ts | 4 +- lib/commands/BGSAVE.ts | 4 +- lib/commands/BITCOUNT.ts | 4 +- lib/commands/BITFIELD.ts | 4 +- lib/commands/BITOP.ts | 4 +- lib/commands/BITPOS.ts | 4 +- lib/commands/BLMOVE.ts | 3 +- lib/commands/BRPOPLPUSH.ts | 4 +- lib/commands/CLIENT_ID.ts | 4 +- lib/commands/CLUSTER_ADDSLOTS.ts | 4 +- lib/commands/CLUSTER_FLUSHSLOTS.ts | 4 +- lib/commands/CLUSTER_GETKEYSINSLOT.ts | 4 +- lib/commands/CLUSTER_MEET.ts | 4 +- lib/commands/CLUSTER_RESET.ts | 4 +- lib/commands/CLUSTER_SETSLOT.ts | 4 +- lib/commands/CONFIG_RESETSTAT.ts | 4 +- lib/commands/CONFIG_REWRITE.ts | 4 +- lib/commands/CONFIG_SET.ts | 4 +- lib/commands/DBSIZE.ts | 4 +- lib/commands/DECR.ts | 4 +- lib/commands/DECRBY.ts | 4 +- lib/commands/DEL.ts | 4 +- lib/commands/DISCARD.ts | 4 +- lib/commands/DUMP.ts | 4 +- lib/commands/ECHO.ts | 4 +- lib/commands/FAILOVER.ts | 4 +- lib/commands/FLUSHALL.ts | 4 +- lib/commands/FLUSHDB.ts | 3 +- lib/commands/GEOADD.ts | 4 +- lib/commands/GEOHASH.ts | 4 +- lib/commands/GEOSEARCH.ts | 4 +- lib/commands/GET.ts | 3 +- lib/commands/GETBIT.ts | 4 +- lib/commands/GETDEL.ts | 4 +- lib/commands/GETEX.ts | 4 +- lib/commands/GETRANGE.ts | 4 +- lib/commands/GETSET.ts | 4 +- lib/commands/GET_BUFFER.ts | 4 +- lib/commands/HDEL.ts | 4 +- lib/commands/HINCRBY.ts | 4 +- lib/commands/HINCRBYFLOAT.ts | 4 +- lib/commands/HKEYS.ts | 4 +- lib/commands/HLEN.ts | 4 +- lib/commands/HMGET.ts | 4 +- lib/commands/HRANDFIELD.ts | 4 +- lib/commands/HRANDFIELD_COUNT.ts | 3 +- lib/commands/HSET.ts | 3 +- lib/commands/HSTRLEN.ts | 4 +- lib/commands/HVALS.ts | 4 +- lib/commands/INCR.ts | 4 +- lib/commands/INCRBY.ts | 4 +- lib/commands/INCRBYFLOAT.ts | 4 +- lib/commands/INFO.ts | 4 +- lib/commands/LINDEX.ts | 4 +- lib/commands/LINSERT.ts | 4 +- lib/commands/LLEN.ts | 4 +- lib/commands/LMOVE.ts | 4 +- lib/commands/LOLWUT.ts | 4 +- lib/commands/LPOP.ts | 4 +- lib/commands/LPOP_COUNT.ts | 4 +- lib/commands/LPOS.ts | 4 +- lib/commands/LPOS_COUNT.ts | 3 +- lib/commands/LPUSH.ts | 4 +- lib/commands/LPUSHX.ts | 4 +- lib/commands/LRANGE.ts | 4 +- lib/commands/LREM.ts | 4 +- lib/commands/LSET.ts | 4 +- lib/commands/LTRIM.ts | 4 +- lib/commands/MEMORY_DOCTOR.ts | 4 +- lib/commands/MEMORY_MALLOC-STATS.ts | 4 +- lib/commands/MEMORY_PURGE.ts | 4 +- lib/commands/MEMORY_USAGE.ts | 4 +- lib/commands/MGET.ts | 4 +- lib/commands/MIGRATE.ts | 3 +- lib/commands/MODULE_LIST.ts | 4 +- lib/commands/MODULE_LOAD.ts | 4 +- lib/commands/MODULE_UNLOAD.ts | 4 +- lib/commands/MSET.ts | 4 +- lib/commands/PFCOUNT.ts | 4 +- lib/commands/PFMERGE.ts | 4 +- lib/commands/PING.ts | 4 +- lib/commands/PSETEX.ts | 4 +- lib/commands/PTTL.ts | 4 +- lib/commands/PUBLISH.ts | 4 +- lib/commands/PUBSUB_CHANNELS.ts | 4 +- lib/commands/PUBSUB_NUMPAT.ts | 4 +- lib/commands/READONLY.ts | 4 +- lib/commands/READWRITE.ts | 4 +- lib/commands/RENAME.ts | 4 +- lib/commands/REPLICAOF.ts | 4 +- lib/commands/RESTORE-ASKING.ts | 4 +- lib/commands/RPOP.ts | 4 +- lib/commands/RPOPLPUSH.ts | 4 +- lib/commands/RPOP_COUNT.ts | 4 +- lib/commands/RPUSH.ts | 4 +- lib/commands/RPUSHX.ts | 4 +- lib/commands/SADD.ts | 4 +- lib/commands/SAVE.ts | 4 +- lib/commands/SCARD.ts | 4 +- lib/commands/SCRIPT_DEBUG.ts | 4 +- lib/commands/SCRIPT_FLUSH.ts | 4 +- lib/commands/SCRIPT_KILL.ts | 4 +- lib/commands/SCRIPT_LOAD.ts | 4 +- lib/commands/SDIFF.ts | 4 +- lib/commands/SDIFFSTORE.ts | 4 +- lib/commands/SETBIT.ts | 4 +- lib/commands/SETEX.ts | 3 +- lib/commands/SETRANGE.ts | 4 +- lib/commands/SHUTDOWN.ts | 4 +- lib/commands/SINTER.ts | 4 +- lib/commands/SINTERSTORE.ts | 4 +- lib/commands/SMEMBERS.ts | 4 +- lib/commands/SPOP.ts | 4 +- lib/commands/SRANDMEMBER.ts | 4 +- lib/commands/SRANDMEMBER_COUNT.ts | 3 +- lib/commands/SREM.ts | 4 +- lib/commands/STRLEN.ts | 4 +- lib/commands/SUNION.ts | 4 +- lib/commands/SUNIONSTORE.ts | 4 +- lib/commands/SWAPDB.ts | 4 +- lib/commands/TOUCH.ts | 4 +- lib/commands/TTL.ts | 4 +- lib/commands/TYPE.ts | 4 +- lib/commands/UNLINK.ts | 4 +- lib/commands/UNWATCH.ts | 4 +- lib/commands/WAIT.ts | 4 +- lib/commands/WATCH.ts | 4 +- lib/commands/XACK.ts | 4 +- lib/commands/XADD.ts | 5 +- lib/commands/XCLAIM_JUSTID.ts | 3 +- lib/commands/XDEL.ts | 4 +- lib/commands/XGROUP_CREATE.ts | 4 +- lib/commands/XGROUP_DELCONSUMER.ts | 4 +- lib/commands/XGROUP_SETID.ts | 4 +- lib/commands/XLEN.ts | 4 +- lib/commands/XTRIM.ts | 4 +- lib/commands/ZCARD.ts | 4 +- lib/commands/ZCOUNT.ts | 4 +- lib/commands/ZDIFF.ts | 4 +- lib/commands/ZDIFFSTORE.ts | 4 +- lib/commands/ZINTER.ts | 4 +- lib/commands/ZINTERSTORE.ts | 4 +- lib/commands/ZLEXCOUNT.ts | 4 +- lib/commands/ZRANDMEMBER.ts | 4 +- lib/commands/ZRANDMEMBER_COUNT.ts | 3 +- lib/commands/ZRANGE.ts | 4 +- lib/commands/ZRANK.ts | 4 +- lib/commands/ZREM.ts | 4 +- lib/commands/ZREMRANGEBYLEX.ts | 4 +- lib/commands/ZREMRANGEBYRANK.ts | 4 +- lib/commands/ZREMRANGEBYSCORE.ts | 4 +- lib/commands/ZREVRANK.ts | 4 +- lib/commands/ZUNION.ts | 4 +- lib/commands/ZUNIONSTORE.ts | 4 +- lib/commands/generic-transformers.ts | 46 --- lib/commands/index.ts | 4 +- package-lock.json | 548 ++++++++------------------ 174 files changed, 472 insertions(+), 1051 deletions(-) diff --git a/benchmark/package-lock.json b/benchmark/package-lock.json index a16a420f8cb..767d6870184 100644 --- a/benchmark/package-lock.json +++ b/benchmark/package-lock.json @@ -4,9 +4,9 @@ "requires": true, "packages": { "": { + "name": "benchmark", "license": "ISC", "dependencies": { - "@probe.gl/bench": "^3.4.0", "benny": "^3.6.15", "v3": "npm:redis@3.1.2", "v4": "file:../" @@ -14,30 +14,31 @@ }, "..": { "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", "@types/mocha": "^9.0.0", - "@types/node": "^16.4.5", - "@types/sinon": "^10.0.2", + "@types/node": "^16.9.6", + "@types/sinon": "^10.0.3", "@types/which": "^2.0.1", "@types/yallist": "^4.0.1", - "mocha": "^9.0.3", + "mocha": "^9.1.1", "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", + "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", - "typescript": "^4.3.5", + "typedoc-plugin-markdown": "3.10.4", + "typescript": "^4.4.3", "which": "^2.0.2" }, "engines": { @@ -81,34 +82,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 +97,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 +196,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 +228,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 +339,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 +349,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 +373,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 +386,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 +412,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 +529,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 +538,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 +613,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 +639,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 +717,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 +739,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 +749,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 +769,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": { @@ -892,22 +812,23 @@ "requires": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@types/mocha": "^9.0.0", - "@types/node": "^16.4.5", - "@types/sinon": "^10.0.2", + "@types/node": "^16.9.6", + "@types/sinon": "^10.0.3", "@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.1", "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", + "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", - "typescript": "^4.3.5", + "typedoc-plugin-markdown": "3.10.4", + "typescript": "^4.4.3", "which": "^2.0.2", "yallist": "4.0.0" } diff --git a/lib/client.ts b/lib/client.ts index 93afee1ff1a..98169bc302e 100644 --- a/lib/client.ts +++ b/lib/client.ts @@ -1,6 +1,6 @@ import RedisSocket, { RedisSocketOptions, RedisNetSocketOptions, RedisTlsSocketOptions } from './socket'; import RedisCommandsQueue, { PubSubListener, PubSubSubscribeCommands, PubSubUnsubscribeCommands, QueueCommandOptions } from './commands-queue'; -import COMMANDS, { TransformArgumentsReply } from './commands'; +import COMMANDS, { RedisCommandReply, TransformArgumentsReply } from './commands'; import { RedisCommand, RedisModules, RedisReply } from './commands'; import RedisMultiCommand, { MultiQueuedCommand, RedisMultiCommandType } from './multi-command'; import EventEmitter from 'events'; @@ -9,7 +9,7 @@ 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 { encodeCommand, extendWithDefaultCommands, extendWithModulesAndScripts, transformCommandArguments, transformCommandReply } from './commander'; import { Pool, Options as PoolOptions, createPool } from 'generic-pool'; import { ClientClosedError } from './errors'; import { URL } from 'url'; @@ -29,7 +29,7 @@ export interface RedisClientOptions { } export type RedisCommandSignature = - (...args: Parameters | [options: CommandOptions, ...rest: Parameters]) => Promise>; + (...args: Parameters | [options: CommandOptions, ...rest: Parameters]) => Promise>; type WithCommands = { [P in keyof typeof COMMANDS]: RedisCommandSignature<(typeof COMMANDS)[P]>; @@ -275,12 +275,13 @@ export default class RedisClient): 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 ); } @@ -308,16 +309,17 @@ export default class RedisClient): Promise> { + async scriptsExecutor(script: RedisLuaScript, 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: RedisLuaScript, args: TransformArgumentsReply, options?: ClientCommandOptions, bufferMode?: boolean): Promise> { try { return await this.#sendCommand([ 'EVALSHA', diff --git a/lib/cluster.ts b/lib/cluster.ts index 4be0e268207..87dcec17b71 100644 --- a/lib/cluster.ts +++ b/lib/cluster.ts @@ -1,9 +1,9 @@ -import { RedisCommand, RedisModules, TransformArgumentsReply } from './commands'; +import { RedisCommand, RedisCommandReply, RedisModules, TransformArgumentsReply } from './commands'; import RedisClient, { ClientCommandOptions, RedisClientType, WithPlugins } from './client'; import { RedisSocketOptions } from './socket'; import RedisClusterSlots, { ClusterNode } from './cluster-slots'; import { RedisLuaScript, RedisLuaScripts } from './lua-script'; -import { extendWithModulesAndScripts, extendWithDefaultCommands, transformCommandArguments } from './commander'; +import { extendWithModulesAndScripts, extendWithDefaultCommands, transformCommandArguments, transformCommandReply } from './commander'; import RedisMultiCommand, { MultiQueuedCommand, RedisMultiCommandType } from './multi-command'; import { EventEmitter } from 'events'; @@ -59,10 +59,11 @@ export default class RedisCluster): 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), command.IS_READ_ONLY, @@ -72,8 +73,6 @@ export default class RedisCluster( @@ -83,7 +82,7 @@ export default class RedisCluster> { + ): Promise> { const client = this.#slots.getClient(firstKey, isReadonly); try { @@ -100,10 +99,11 @@ export default class RedisCluster): Promise> { + async scriptsExecutor(script: RedisLuaScript, args: Array): Promise> { const { args: redisArgs, options } = transformCommandArguments(script, args); - const reply = script.transformReply( + return transformCommandReply( + script, await this.executeScript( script, args, @@ -112,8 +112,6 @@ export default class RedisCluster> { + ): Promise> { const client = this.#slots.getClient( RedisCluster.#extractFirstKey(script, originalArgs, redisArgs), script.IS_READ_ONLY diff --git a/lib/commander.ts b/lib/commander.ts index 78823516448..4e542bde74a 100644 --- a/lib/commander.ts +++ b/lib/commander.ts @@ -1,5 +1,5 @@ -import COMMANDS, { RedisCommand, RedisModules, TransformArgumentsReply } from './commands'; +import COMMANDS, { RedisCommand, RedisCommandReply, RedisModules, RedisReply, TransformArgumentsReply } from './commands'; import { RedisLuaScript, RedisLuaScripts } from './lua-script'; import { CommandOptions, isCommandOptions } from './command-options'; @@ -106,3 +106,11 @@ export function* encodeCommand(args: TransformArgumentsReply): IterableIterator< yield DELIMITER; } } + +export function transformCommandReply(command: RedisCommand, rawReply: RedisReply, 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..e83e4d7d0ab 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 { pushVerdictArguments } from './generic-transformers'; export function transformArguments(username: string | Array): TransformArgumentsReply { 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..a590376ab84 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 { pushVerdictArguments } from './generic-transformers'; export function transformArguments(username: string, rule: string | Array): TransformArgumentsReply { 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..1a750f811ca 100644 --- a/lib/commands/BITOP.ts +++ b/lib/commands/BITOP.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 2; @@ -9,4 +9,4 @@ export function transformArguments(operation: BitOperations, destKey: string, ke 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/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/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_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_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/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.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..b815258df1b 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 { pushVerdictArguments } from './generic-transformers'; export function transformArguments(keys: string | Array): TransformArgumentsReply { 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.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/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): return pushVerdictArguments(['GEOHASH', key], member); } -export const transformReply = transformReplyStringArray; +export declare function transformReply(): Array; 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/GET.ts b/lib/commands/GET.ts index 541790e54e4..dbd303d1c65 100644 --- a/lib/commands/GET.ts +++ b/lib/commands/GET.ts @@ -1,5 +1,4 @@ import { TransformArgumentsReply } from '.'; -import { transformReplyStringNull } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -9,4 +8,4 @@ export function transformArguments(key: string | Buffer): TransformArgumentsRepl 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..2c6a4f243f6 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 { transformEXAT, transformPXAT } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -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..75130c87239 100644 --- a/lib/commands/HDEL.ts +++ b/lib/commands/HDEL.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,4 +7,4 @@ export function transformArguments(key: string, field: string | Array): return pushVerdictArguments(['HDEL', key], field); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; 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..420102d2b27 100644 --- a/lib/commands/HMGET.ts +++ b/lib/commands/HMGET.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyStringArray } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -9,4 +9,4 @@ export function transformArguments(key: string, fields: string | Array): 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.ts b/lib/commands/HSET.ts index cbd46061ad8..1aecd50c0d0 100644 --- a/lib/commands/HSET.ts +++ b/lib/commands/HSET.ts @@ -1,5 +1,4 @@ import { TransformArgumentsReply } from '.'; -import { transformReplyString } from './generic-transformers'; type HSETObject = Record; @@ -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/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.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..349affb5e09 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 { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, elements: string | Array): TransformArgumentsReply { 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..23b8bd9b91b 100644 --- a/lib/commands/LPUSHX.ts +++ b/lib/commands/LPUSHX.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,4 +7,4 @@ export function transformArguments(key: string, element: string | Array) 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.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.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.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.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): TransformArgume 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..86bef6c4d7f 100644 --- a/lib/commands/PFMERGE.ts +++ b/lib/commands/PFMERGE.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyString } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,4 +7,4 @@ export function transformArguments(destination: string, source: string | 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.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.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/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..92df52f03ff 100644 --- a/lib/commands/RPUSH.ts +++ b/lib/commands/RPUSH.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,4 +7,4 @@ export function transformArguments(key: string, element: string | Array) 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..14ad9dc9d50 100644 --- a/lib/commands/RPUSHX.ts +++ b/lib/commands/RPUSHX.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,4 +7,4 @@ export function transformArguments(key: string, element: string | Array) 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..31623c435ce 100644 --- a/lib/commands/SADD.ts +++ b/lib/commands/SADD.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,4 +7,4 @@ export function transformArguments(key: string, members: string | Array) 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.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_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.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..134bd66ef85 100644 --- a/lib/commands/SDIFF.ts +++ b/lib/commands/SDIFF.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyStringArray } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,4 +7,4 @@ export function transformArguments(keys: string | Array): TransformArgum 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..1c437087c5e 100644 --- a/lib/commands/SDIFFSTORE.ts +++ b/lib/commands/SDIFFSTORE.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,4 +7,4 @@ export function transformArguments(destination: string, keys: 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..6348bbc7ab9 100644 --- a/lib/commands/SINTER.ts +++ b/lib/commands/SINTER.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyStringArray } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,4 +7,4 @@ export function transformArguments(keys: string | Array): TransformArgum 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..0d31c409da8 100644 --- a/lib/commands/SINTERSTORE.ts +++ b/lib/commands/SINTERSTORE.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyStringArray } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,4 +7,4 @@ export function transformArguments(destination: string, keys: string | 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..534de170540 100644 --- a/lib/commands/SREM.ts +++ b/lib/commands/SREM.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,4 +7,4 @@ export function transformArguments(key: string, members: string | Array) 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..07a46e38efa 100644 --- a/lib/commands/SUNION.ts +++ b/lib/commands/SUNION.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyStringArray } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -9,4 +9,4 @@ export function transformArguments(keys: string | Array): TransformArgum 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..8745c516433 100644 --- a/lib/commands/SUNIONSTORE.ts +++ b/lib/commands/SUNIONSTORE.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,4 +7,4 @@ export function transformArguments(destination: string, keys: string | 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..8632d848dbf 100644 --- a/lib/commands/TOUCH.ts +++ b/lib/commands/TOUCH.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,4 +7,4 @@ export function transformArguments(key: string | Array): TransformArgume 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..2ff87974cfb 100644 --- a/lib/commands/UNLINK.ts +++ b/lib/commands/UNLINK.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,4 +7,4 @@ export function transformArguments(key: string | Array): TransformArgume return pushVerdictArguments(['UNLINK'], key); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; 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..5ca42c0eb95 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 { pushVerdictArguments } from './generic-transformers'; export function transformArguments(key: string | Array): TransformArgumentsReply { 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..4573b7f3d25 100644 --- a/lib/commands/XACK.ts +++ b/lib/commands/XACK.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,4 +7,4 @@ export function transformArguments(key: string, group: string, id: string | Arra 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..187e5b4e73a 100644 --- a/lib/commands/XDEL.ts +++ b/lib/commands/XDEL.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,4 +7,4 @@ export function transformArguments(key: string, id: string | Array): Tra 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/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..4c5b722131e 100644 --- a/lib/commands/ZDIFF.ts +++ b/lib/commands/ZDIFF.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArgument, transformReplyStringArray } from './generic-transformers'; +import { pushVerdictArgument } from './generic-transformers'; export const FIRST_KEY_INDEX = 2; @@ -9,4 +9,4 @@ export function transformArguments(keys: Array | string): TransformArgum 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..95c58c66b9e 100644 --- a/lib/commands/ZDIFFSTORE.ts +++ b/lib/commands/ZDIFFSTORE.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArgument, transformReplyNumber } from './generic-transformers'; +import { pushVerdictArgument } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,4 +7,4 @@ export function transformArguments(destination: string, keys: Array | st return pushVerdictArgument(['ZDIFFSTORE', destination], keys); } -export const transformReply = transformReplyNumber; +export declare function transformReply(): number; diff --git a/lib/commands/ZINTER.ts b/lib/commands/ZINTER.ts index 91d7982a8e7..ae1b27a6c8d 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 { pushVerdictArgument } from './generic-transformers'; export const FIRST_KEY_INDEX = 2; @@ -27,4 +27,4 @@ export function transformArguments(keys: Array | string, options?: ZInte 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..496729a774e 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 { pushVerdictArgument } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -25,4 +25,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/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/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.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/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..550a41e8b5c 100644 --- a/lib/commands/ZREM.ts +++ b/lib/commands/ZREM.ts @@ -1,5 +1,5 @@ import { TransformArgumentsReply } from '.'; -import { pushVerdictArguments, transformReplyNumber } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,4 +7,4 @@ export function transformArguments(key: string, member: string | Array): 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..1f0723eb021 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 { pushVerdictArgument } from './generic-transformers'; export const FIRST_KEY_INDEX = 2; @@ -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..d0a92b20a60 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 { pushVerdictArgument } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -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/generic-transformers.ts b/lib/commands/generic-transformers.ts index bbc12ee113e..87325e61d72 100644 --- a/lib/commands/generic-transformers.ts +++ b/lib/commands/generic-transformers.ts @@ -1,41 +1,5 @@ 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; -} - 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; diff --git a/lib/commands/index.ts b/lib/commands/index.ts index 89581090e58..192968cb2ae 100644 --- a/lib/commands/index.ts +++ b/lib/commands/index.ts @@ -748,9 +748,11 @@ export interface RedisCommand { IS_READ_ONLY?: boolean; transformArguments(this: void, ...args: Array): TransformArgumentsReply; BUFFER_MODE?: boolean; - transformReply(this: void, reply: RedisReply, preserved?: unknown): any; + transformReply?(this: void, reply: RedisReply, preserved?: unknown): any; } +export type RedisCommandReply = C['transformReply'] extends (...args: any) => infer T ? T : RedisReply; + export interface RedisCommands { [command: string]: RedisCommand; } diff --git a/package-lock.json b/package-lock.json index 9fcd62b5996..e4625a07401 100644 --- a/package-lock.json +++ b/package-lock.json @@ -653,18 +653,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": "10.6.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-10.6.1.tgz", + "integrity": "sha512-53YKy8w8+sHQhUONhTiYt6MqNqPolejYr6rK/3VOevpORAIYGQEX2pmXnnhgdSsjHy176e5ZBgVt0ppOGziS7g==", "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.16.5", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.16.5.tgz", + "integrity": "sha512-2PfRGymdBypqRes4Xelu0BAZZRCV/Qg0xgo8UB10UKoghCM+zg640+T5WkRsRD0edwfLBPP3VsJgDyDTG4EIYg==", "dev": true, "dependencies": { - "@octokit/types": "^6.26.0" + "@octokit/types": "^6.31.0" }, "peerDependencies": { "@octokit/core": ">=2" @@ -680,12 +680,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.11.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.11.3.tgz", + "integrity": "sha512-E19gqHqfP3uJa2/hx6Abhx2NrVP5tsNbst2/AeqGxlGM+eL4N8fRbzhd+NEIsGAB4y3R7e9kVE0y8OOghlXUXw==", "dev": true, "dependencies": { - "@octokit/types": "^6.28.1", + "@octokit/types": "^6.31.1", "deprecation": "^2.3.1" }, "peerDependencies": { @@ -730,12 +730,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.31.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.31.1.tgz", + "integrity": "sha512-xkF46eaYcpT8ieO78mZWhMq3bt37zIsP5BUkN+zWgX+mTYDB7jOtUP1MOxcSF8hhJhsjjlB1YDgQAhX0z0oqPw==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^10.0.0" + "@octokit/openapi-types": "^10.6.1" } }, "node_modules/@sindresorhus/is": { @@ -855,9 +855,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.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.2.tgz", + "integrity": "sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ==", "dev": true }, "node_modules/@types/parse-json": { @@ -876,9 +876,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 +937,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 +1199,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.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.1.tgz", + "integrity": "sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==", "dev": true, "dependencies": { - "caniuse-lite": "^1.0.30001254", - "colorette": "^1.3.0", - "electron-to-chromium": "^1.3.830", + "caniuse-lite": "^1.0.30001259", + "electron-to-chromium": "^1.3.846", "escalade": "^3.1.1", - "node-releases": "^1.1.75" + "nanocolors": "^0.1.5", + "node-releases": "^1.1.76" }, "bin": { "browserslist": "cli.js" @@ -1390,9 +1340,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.30001261", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001261.tgz", + "integrity": "sha512-vM8D9Uvp7bHIN0fZ2KQ4wnmYFpJo/Etb4Vwsuc+ka0tfGDHvOPrFm6S/7CCNLSOkAUjenT2HnUPESdOIL91FaA==", "dev": true, "funding": { "type": "opencollective", @@ -1569,12 +1519,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 +1615,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 +1789,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.853", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.853.tgz", + "integrity": "sha512-W4U8n+U8I5/SUaFcqZgbKRmYZwcyEIQVBDf+j5QQK6xChjXnQD+wj248eGR9X4u+dDmDR//8vIfbu4PrdBBIoQ==", "dev": true }, "node_modules/emoji-regex": { @@ -2679,9 +2623,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 +2668,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" @@ -2896,9 +2840,9 @@ "dev": true }, "node_modules/istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz", + "integrity": "sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ==", "dev": true, "engines": { "node": ">=8" @@ -3317,16 +3261,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 +3281,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", @@ -3372,10 +3315,16 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "node_modules/nanocolors": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.1.12.tgz", + "integrity": "sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==", + "dev": true + }, "node_modules/nanoid": { - "version": "3.1.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 +3374,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" @@ -4475,23 +4424,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 +4436,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", @@ -4782,9 +4708,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 +4733,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 +4876,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" @@ -5433,58 +5359,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", @@ -6206,18 +6080,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": "10.6.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-10.6.1.tgz", + "integrity": "sha512-53YKy8w8+sHQhUONhTiYt6MqNqPolejYr6rK/3VOevpORAIYGQEX2pmXnnhgdSsjHy176e5ZBgVt0ppOGziS7g==", "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.16.5", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.16.5.tgz", + "integrity": "sha512-2PfRGymdBypqRes4Xelu0BAZZRCV/Qg0xgo8UB10UKoghCM+zg640+T5WkRsRD0edwfLBPP3VsJgDyDTG4EIYg==", "dev": true, "requires": { - "@octokit/types": "^6.26.0" + "@octokit/types": "^6.31.0" } }, "@octokit/plugin-request-log": { @@ -6228,12 +6102,12 @@ "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.11.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.11.3.tgz", + "integrity": "sha512-E19gqHqfP3uJa2/hx6Abhx2NrVP5tsNbst2/AeqGxlGM+eL4N8fRbzhd+NEIsGAB4y3R7e9kVE0y8OOghlXUXw==", "dev": true, "requires": { - "@octokit/types": "^6.28.1", + "@octokit/types": "^6.31.1", "deprecation": "^2.3.1" } }, @@ -6275,12 +6149,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.31.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.31.1.tgz", + "integrity": "sha512-xkF46eaYcpT8ieO78mZWhMq3bt37zIsP5BUkN+zWgX+mTYDB7jOtUP1MOxcSF8hhJhsjjlB1YDgQAhX0z0oqPw==", "dev": true, "requires": { - "@octokit/openapi-types": "^10.2.2" + "@octokit/openapi-types": "^10.6.1" } }, "@sindresorhus/is": { @@ -6391,9 +6265,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.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.2.tgz", + "integrity": "sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ==", "dev": true }, "@types/parse-json": { @@ -6412,9 +6286,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 +6335,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 +6530,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.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.1.tgz", + "integrity": "sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001254", - "colorette": "^1.3.0", - "electron-to-chromium": "^1.3.830", + "caniuse-lite": "^1.0.30001259", + "electron-to-chromium": "^1.3.846", "escalade": "^3.1.1", - "node-releases": "^1.1.75" + "nanocolors": "^0.1.5", + "node-releases": "^1.1.76" } }, "buffer": { @@ -6791,9 +6625,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.30001261", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001261.tgz", + "integrity": "sha512-vM8D9Uvp7bHIN0fZ2KQ4wnmYFpJo/Etb4Vwsuc+ka0tfGDHvOPrFm6S/7CCNLSOkAUjenT2HnUPESdOIL91FaA==", "dev": true }, "chalk": { @@ -6924,12 +6758,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 +6839,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 +6967,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.853", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.853.tgz", + "integrity": "sha512-W4U8n+U8I5/SUaFcqZgbKRmYZwcyEIQVBDf+j5QQK6xChjXnQD+wj248eGR9X4u+dDmDR//8vIfbu4PrdBBIoQ==", "dev": true }, "emoji-regex": { @@ -7737,9 +7565,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 +7592,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" @@ -7885,9 +7713,9 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz", + "integrity": "sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ==", "dev": true }, "istanbul-lib-hook": { @@ -8213,16 +8041,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 +8061,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", @@ -8257,10 +8084,16 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "nanocolors": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.1.12.tgz", + "integrity": "sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==", + "dev": true + }, "nanoid": { - "version": "3.1.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 +8133,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" @@ -9101,15 +8934,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 +8943,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", @@ -9324,9 +9142,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 +9164,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 +9274,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": { @@ -9806,48 +9624,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", From 068f7f49bf4db822c603697e99b5f906c78ab850 Mon Sep 17 00:00:00 2001 From: leibale Date: Wed, 29 Sep 2021 18:20:50 -0400 Subject: [PATCH 027/112] fix EVAL & EVALSHA, add some tests, npm update --- lib/commands/EVAL.ts | 4 ---- lib/commands/EVALSHA.ts | 4 ---- lib/commands/ZRANGESTORE.spec.ts | 11 ++++++++++- lib/commands/generic-transformers.spec.ts | 7 +++++++ lib/commands/generic-transformers.ts | 6 ++---- package-lock.json | 12 ++++++------ 6 files changed, 25 insertions(+), 19 deletions(-) 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/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/generic-transformers.spec.ts b/lib/commands/generic-transformers.spec.ts index 9ac72bb1b25..9bde6ebb3af 100644 --- a/lib/commands/generic-transformers.spec.ts +++ b/lib/commands/generic-transformers.spec.ts @@ -300,6 +300,13 @@ describe('Generic Transformers', () => { ); }); + it('with COUNT', () => { + assert.deepEqual( + pushGeoCountArgument([], 1), + ['COUNT', '1'] + ); + }); + it('with ANY', () => { assert.deepEqual( pushGeoCountArgument([], { diff --git a/lib/commands/generic-transformers.ts b/lib/commands/generic-transformers.ts index 87325e61d72..84a6c97b81e 100644 --- a/lib/commands/generic-transformers.ts +++ b/lib/commands/generic-transformers.ts @@ -204,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); diff --git a/package-lock.json b/package-lock.json index e4625a07401..bb840cc6dde 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1789,9 +1789,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.3.853", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.853.tgz", - "integrity": "sha512-W4U8n+U8I5/SUaFcqZgbKRmYZwcyEIQVBDf+j5QQK6xChjXnQD+wj248eGR9X4u+dDmDR//8vIfbu4PrdBBIoQ==", + "version": "1.3.854", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.854.tgz", + "integrity": "sha512-00/IIC1mFPkq32MhUJyLdcTp7+wsKK2G3Sb65GSas9FKJQGYkDcZ4GwJkkxf5YyM3ETvl6n+toV8OmtXl4IA/g==", "dev": true }, "node_modules/emoji-regex": { @@ -6967,9 +6967,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.853", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.853.tgz", - "integrity": "sha512-W4U8n+U8I5/SUaFcqZgbKRmYZwcyEIQVBDf+j5QQK6xChjXnQD+wj248eGR9X4u+dDmDR//8vIfbu4PrdBBIoQ==", + "version": "1.3.854", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.854.tgz", + "integrity": "sha512-00/IIC1mFPkq32MhUJyLdcTp7+wsKK2G3Sb65GSas9FKJQGYkDcZ4GwJkkxf5YyM3ETvl6n+toV8OmtXl4IA/g==", "dev": true }, "emoji-regex": { From 43e546df987b58655383030edb570a7034694ee1 Mon Sep 17 00:00:00 2001 From: leibale Date: Fri, 1 Oct 2021 15:31:00 -0400 Subject: [PATCH 028/112] fix #1665 - add ZRANGEBYLEX, ZRANGEBYSCORE, ZRANGEBYSCORE_WITHSCORES --- lib/commands/ZRANGEBYLEX.spec.ts | 33 +++++++++++++++++ lib/commands/ZRANGEBYLEX.ts | 35 +++++++++++++++++++ lib/commands/ZRANGEBYSCORE.spec.ts | 33 +++++++++++++++++ lib/commands/ZRANGEBYSCORE.ts | 35 +++++++++++++++++++ lib/commands/ZRANGEBYSCORE_WITHSCORES.spec.ts | 33 +++++++++++++++++ lib/commands/ZRANGEBYSCORE_WITHSCORES.ts | 19 ++++++++++ lib/commands/index.ts | 9 +++++ 7 files changed, 197 insertions(+) create mode 100644 lib/commands/ZRANGEBYLEX.spec.ts create mode 100644 lib/commands/ZRANGEBYLEX.ts create mode 100644 lib/commands/ZRANGEBYSCORE.spec.ts create mode 100644 lib/commands/ZRANGEBYSCORE.ts create mode 100644 lib/commands/ZRANGEBYSCORE_WITHSCORES.spec.ts create mode 100644 lib/commands/ZRANGEBYSCORE_WITHSCORES.ts 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..5e4475800c2 --- /dev/null +++ b/lib/commands/ZRANGEBYLEX.ts @@ -0,0 +1,35 @@ +import { TransformArgumentsReply } 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 +): TransformArgumentsReply { + 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..1932683f955 --- /dev/null +++ b/lib/commands/ZRANGEBYSCORE.ts @@ -0,0 +1,35 @@ +import { TransformArgumentsReply } 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 +): TransformArgumentsReply { + 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..050ebf58936 --- /dev/null +++ b/lib/commands/ZRANGEBYSCORE_WITHSCORES.ts @@ -0,0 +1,19 @@ +import { TransformArgumentsReply } 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 +): TransformArgumentsReply { + return [ + ...transformZRangeByScoreArguments(key, min, max, options), + 'WITHSCORES' + ]; +} + +export const transformReply = transformReplySortedSetWithScores; diff --git a/lib/commands/index.ts b/lib/commands/index.ts index 192968cb2ae..03a44ad7947 100644 --- a/lib/commands/index.ts +++ b/lib/commands/index.ts @@ -232,6 +232,9 @@ import * as ZRANDMEMBER_COUNT from './ZRANDMEMBER_COUNT'; import * as ZRANDMEMBER from './ZRANDMEMBER'; import * as ZRANGE_WITHSCORES from './ZRANGE_WITHSCORES'; import * as ZRANGE from './ZRANGE'; +import * as ZRANGEBYLEX from './ZRANGEBYLEX'; +import * as ZRANGEBYSCORE_WITHSCORES from './ZRANGEBYSCORE_WITHSCORES'; +import * as ZRANGEBYSCORE from './ZRANGEBYSCORE'; import * as ZRANGESTORE from './ZRANGESTORE'; import * as ZRANK from './ZRANK'; import * as ZREM from './ZREM'; @@ -713,6 +716,12 @@ export default { zRangeWithScores: ZRANGE_WITHSCORES, ZRANGE, zRange: ZRANGE, + ZRANGEBYLEX, + zRangeByLex: ZRANGEBYLEX, + ZRANGEBYSCORE_WITHSCORES, + zRangeByScoreWithScores: ZRANGEBYSCORE_WITHSCORES, + ZRANGEBYSCORE, + zRangeByScore: ZRANGEBYSCORE, ZRANGESTORE, zRangeStore: ZRANGESTORE, ZRANK, From 5eb06bcaa344ae531088677eef55496a8c3b3b94 Mon Sep 17 00:00:00 2001 From: leibale Date: Fri, 1 Oct 2021 15:51:45 -0400 Subject: [PATCH 029/112] new issue templates --- .github/ISSUE_TEMPLATE.md | 21 --------------------- .github/ISSUE_TEMPLATE/bug-report.md | 15 +++++++++++++++ .github/ISSUE_TEMPLATE/feature-request.md | 7 +++++++ 3 files changed, 22 insertions(+), 21 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/ISSUE_TEMPLATE/bug-report.md create mode 100644 .github/ISSUE_TEMPLATE/feature-request.md 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: '' +--- From 6e7844eca0c0dcb164bb29406d2612fa441b408b Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 4 Oct 2021 17:30:18 -0400 Subject: [PATCH 030/112] add all COMMAND commands --- lib/commands/COMMAND.spec.ts | 28 +++++++++ lib/commands/COMMAND.ts | 12 ++++ lib/commands/COMMAND_COUNT.spec.ts | 26 ++++++++ lib/commands/COMMAND_COUNT.ts | 9 +++ lib/commands/COMMAND_GETKEYS.spec.ts | 26 ++++++++ lib/commands/COMMAND_GETKEYS.ts | 9 +++ lib/commands/COMMAND_INFO.spec.ts | 28 +++++++++ lib/commands/COMMAND_INFO.ts | 12 ++++ lib/commands/generic-transformers.spec.ts | 28 ++++++++- lib/commands/generic-transformers.ts | 76 +++++++++++++++++++++++ lib/commands/index.ts | 12 ++++ 11 files changed, 265 insertions(+), 1 deletion(-) create mode 100644 lib/commands/COMMAND.spec.ts create mode 100644 lib/commands/COMMAND.ts create mode 100644 lib/commands/COMMAND_COUNT.spec.ts create mode 100644 lib/commands/COMMAND_COUNT.ts create mode 100644 lib/commands/COMMAND_GETKEYS.spec.ts create mode 100644 lib/commands/COMMAND_GETKEYS.ts create mode 100644 lib/commands/COMMAND_INFO.spec.ts create mode 100644 lib/commands/COMMAND_INFO.ts diff --git a/lib/commands/COMMAND.spec.ts b/lib/commands/COMMAND.spec.ts new file mode 100644 index 00000000000..e2c563862fb --- /dev/null +++ b/lib/commands/COMMAND.spec.ts @@ -0,0 +1,28 @@ +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]) + } + ); + }); +}); diff --git a/lib/commands/COMMAND.ts b/lib/commands/COMMAND.ts new file mode 100644 index 00000000000..f72cc3f37dd --- /dev/null +++ b/lib/commands/COMMAND.ts @@ -0,0 +1,12 @@ +import { TransformArgumentsReply } from '.'; +import { CommandRawReply, CommandReply, transformCommandReply } from './generic-transformers'; + +export const IS_READ_ONLY = true; + +export function transformArguments(): TransformArgumentsReply { + 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..61ba1bf2540 --- /dev/null +++ b/lib/commands/COMMAND_COUNT.spec.ts @@ -0,0 +1,26 @@ +import { strict as assert } from 'assert'; +import { itWithClient, itWithCluster, TestRedisClusters, TestRedisServers } 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' + ); + }); + + itWithCluster(TestRedisClusters.OPEN, 'cluster.commandCount', async cluster => { + assert.equal( + typeof await cluster.commandCount(), + 'number' + ); + }); +}); diff --git a/lib/commands/COMMAND_COUNT.ts b/lib/commands/COMMAND_COUNT.ts new file mode 100644 index 00000000000..4cdec7bebf1 --- /dev/null +++ b/lib/commands/COMMAND_COUNT.ts @@ -0,0 +1,9 @@ +import { TransformArgumentsReply } from '.'; + +export const IS_READ_ONLY = true; + +export function transformArguments(): TransformArgumentsReply { + 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..37e91781589 --- /dev/null +++ b/lib/commands/COMMAND_GETKEYS.spec.ts @@ -0,0 +1,26 @@ +import { strict as assert } from 'assert'; +import { itWithClient, itWithCluster, TestRedisClusters, TestRedisServers } 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'] + ); + }); + + itWithCluster(TestRedisClusters.OPEN, 'cluster.commandGetKeys', async cluster => { + assert.deepEqual( + await cluster.commandGetKeys(['GET', 'key']), + ['key'] + ); + }); +}); diff --git a/lib/commands/COMMAND_GETKEYS.ts b/lib/commands/COMMAND_GETKEYS.ts new file mode 100644 index 00000000000..0b8f38e3d08 --- /dev/null +++ b/lib/commands/COMMAND_GETKEYS.ts @@ -0,0 +1,9 @@ +import { TransformArgumentsReply } from '.'; + +export const IS_READ_ONLY = true; + +export function transformArguments(args: Array): TransformArgumentsReply { + 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..c4deec0d220 --- /dev/null +++ b/lib/commands/COMMAND_INFO.spec.ts @@ -0,0 +1,28 @@ +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]) + }] + ); + }); +}); diff --git a/lib/commands/COMMAND_INFO.ts b/lib/commands/COMMAND_INFO.ts new file mode 100644 index 00000000000..274c57d6aef --- /dev/null +++ b/lib/commands/COMMAND_INFO.ts @@ -0,0 +1,12 @@ +import { TransformArgumentsReply } from '.'; +import { CommandRawReply, CommandReply, transformCommandReply } from './generic-transformers'; + +export const IS_READ_ONLY = true; + +export function transformArguments(commands: Array): TransformArgumentsReply { + return ['COMMAND', 'INFO', ...commands]; +} + +export function transformReply(reply: Array): Array { + return reply.map(command => command ? transformCommandReply(command) : null); +} diff --git a/lib/commands/generic-transformers.spec.ts b/lib/commands/generic-transformers.spec.ts index 9bde6ebb3af..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', () => { @@ -626,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 84a6c97b81e..98e6750f765 100644 --- a/lib/commands/generic-transformers.ts +++ b/lib/commands/generic-transformers.ts @@ -335,3 +335,79 @@ export function pushOptionalVerdictArgument(args: TransformArgumentsReply, 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 03a44ad7947..014aff9e3a6 100644 --- a/lib/commands/index.ts +++ b/lib/commands/index.ts @@ -35,6 +35,10 @@ import * as CLUSTER_MEET from './CLUSTER_MEET'; import * as CLUSTER_RESET from './CLUSTER_RESET'; import * as CLUSTER_SETSLOT from './CLUSTER_SETSLOT'; import * as CLUSTER_SLOTS from './CLUSTER_SLOTS'; +import * as COMMAND_COUNT from './COMMAND_COUNT'; +import * as COMMAND_GETKEYS from './COMMAND_GETKEYS'; +import * as COMMAND_INFO from './COMMAND_INFO'; +import * as COMMAND from './COMMAND'; import * as CONFIG_GET from './CONFIG_GET'; import * as CONFIG_RESETASTAT from './CONFIG_RESETSTAT'; import * as CONFIG_REWRITE from './CONFIG_REWRITE'; @@ -323,6 +327,14 @@ export default { 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, From 833416c4e90a4f301ce257c30ce4309f300ab31e Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 4 Oct 2021 18:27:32 -0400 Subject: [PATCH 031/112] run COMMAND & COMMAND INFO tests only on redis >6 --- lib/commands/COMMAND.spec.ts | 2 ++ lib/commands/COMMAND_INFO.spec.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/lib/commands/COMMAND.spec.ts b/lib/commands/COMMAND.spec.ts index e2c563862fb..1f036dadc17 100644 --- a/lib/commands/COMMAND.spec.ts +++ b/lib/commands/COMMAND.spec.ts @@ -24,5 +24,7 @@ describe('COMMAND', () => { categories: new Set([CommandCategories.FAST, CommandCategories.CONNECTION]) } ); + }, { + minimumRedisVersion: [6] }); }); diff --git a/lib/commands/COMMAND_INFO.spec.ts b/lib/commands/COMMAND_INFO.spec.ts index c4deec0d220..59a61f6680a 100644 --- a/lib/commands/COMMAND_INFO.spec.ts +++ b/lib/commands/COMMAND_INFO.spec.ts @@ -24,5 +24,7 @@ describe('COMMAND INFO', () => { categories: new Set([CommandCategories.FAST, CommandCategories.CONNECTION]) }] ); + }, { + minimumRedisVersion: [6] }); }); From ef93bb192d04372d130aca5510c347a866990685 Mon Sep 17 00:00:00 2001 From: Leibale Eidelman Date: Tue, 5 Oct 2021 16:53:32 -0400 Subject: [PATCH 032/112] Create SECURITY.md --- SECURITY.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 SECURITY.md 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. From cc83cee22ce5cc835d54ea2281c5debb2e6cd3ff Mon Sep 17 00:00:00 2001 From: leibale Date: Thu, 7 Oct 2021 10:20:21 -0400 Subject: [PATCH 033/112] fix #1671 - add support for all client configurations in cluster --- README.md | 34 +++++++++++++++------------------- index.ts | 2 -- lib/cluster-slots.ts | 12 +++++------- lib/cluster.spec.ts | 4 ++-- lib/cluster.ts | 10 ++++++---- lib/commands/BZPOPMAX.spec.ts | 1 - lib/test-utils.ts | 22 +++++++++++++--------- 7 files changed, 41 insertions(+), 44 deletions(-) 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/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/cluster-slots.ts b/lib/cluster-slots.ts index a5155cc53db..4c33f2e0f79 100644 --- a/lib/cluster-slots.ts +++ b/lib/cluster-slots.ts @@ -2,7 +2,7 @@ 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 { RedisClusterClientOptions, RedisClusterOptions } from './cluster'; import { RedisModules } from './commands'; import { RedisLuaScripts } from './lua-script'; @@ -39,21 +39,19 @@ export default class RedisClusterSlots): 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 = RedisClient.create(clientOptions); await client.connect(); diff --git a/lib/cluster.spec.ts b/lib/cluster.spec.ts index b7dbe50c908..22ae204f9aa 100644 --- a/lib/cluster.spec.ts +++ b/lib/cluster.spec.ts @@ -8,7 +8,7 @@ import { ClusterSlotStates } from './commands/CLUSTER_SETSLOT'; describe('Cluster', () => { it('sendCommand', async () => { const cluster = RedisCluster.create({ - rootNodes: TEST_REDIS_CLUSTERES[TestRedisClusters.OPEN], + ...TEST_REDIS_CLUSTERES[TestRedisClusters.OPEN], useReplicas: true }); @@ -42,7 +42,7 @@ describe('Cluster', () => { 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.ts index 87dcec17b71..565bb859b84 100644 --- a/lib/cluster.ts +++ b/lib/cluster.ts @@ -1,14 +1,16 @@ import { RedisCommand, RedisCommandReply, RedisModules, TransformArgumentsReply } from './commands'; -import RedisClient, { ClientCommandOptions, RedisClientType, WithPlugins } from './client'; -import { RedisSocketOptions } from './socket'; +import RedisClient, { ClientCommandOptions, RedisClientOptions, RedisClientType, WithPlugins } from './client'; import RedisClusterSlots, { ClusterNode } from './cluster-slots'; import { RedisLuaScript, RedisLuaScripts } from './lua-script'; import { extendWithModulesAndScripts, extendWithDefaultCommands, transformCommandArguments, transformCommandReply } from './commander'; import RedisMultiCommand, { MultiQueuedCommand, RedisMultiCommandType } from './multi-command'; import { EventEmitter } from 'events'; -export interface RedisClusterOptions { - rootNodes: Array; +export type RedisClusterClientOptions = Omit, 'modules' | 'scripts'>; + +export interface RedisClusterOptions { + rootNodes: Array; + defaults?: RedisClusterClientOptions; modules?: M; scripts?: S; useReplicas?: boolean; 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/test-utils.ts b/lib/test-utils.ts index 713a1a3434a..bc3c0514606 100644 --- a/lib/test-utils.ts +++ b/lib/test-utils.ts @@ -5,7 +5,7 @@ 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'; @@ -60,7 +60,7 @@ export enum TestRedisClusters { OPEN } -export const TEST_REDIS_CLUSTERES: Record> = {}; +export const TEST_REDIS_CLUSTERES: Record> = {}; let port = 6379; @@ -248,9 +248,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 +318,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 +339,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 + } }] }); From d7026f619e66eadb186c15589cb9bc5cc7d03de4 Mon Sep 17 00:00:00 2001 From: leibale Date: Thu, 7 Oct 2021 11:44:45 -0400 Subject: [PATCH 034/112] ref #1671 - add support for defaults --- lib/cluster-slots.ts | 31 ++++++++++++++++++++++--------- lib/cluster.ts | 2 +- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/lib/cluster-slots.ts b/lib/cluster-slots.ts index 4c33f2e0f79..29730bf753d 100644 --- a/lib/cluster-slots.ts +++ b/lib/cluster-slots.ts @@ -1,6 +1,5 @@ import calculateSlot from 'cluster-key-slot'; import RedisClient, { RedisClientType } from './client'; -import { RedisSocketOptions } from './socket'; import { RedisClusterMasterNode, RedisClusterReplicaNode } from './commands/CLUSTER_NODES'; import { RedisClusterClientOptions, RedisClusterOptions } from './cluster'; import { RedisModules } from './commands'; @@ -32,7 +31,7 @@ export default class RedisClusterSlots { 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'); @@ -99,6 +98,18 @@ export default class RedisClusterSlots, promises: Array>): ClusterNode { const url = `${nodeData.host}:${nodeData.port}`; clientsInUse.add(url); @@ -107,13 +118,15 @@ export default class RedisClusterSlots, 'module export interface RedisClusterOptions { rootNodes: Array; - defaults?: RedisClusterClientOptions; + defaults?: Partial; modules?: M; scripts?: S; useReplicas?: boolean; From 13d44147db4e4f718c27c7c34f7ab4eb3b009e4c Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 11 Oct 2021 17:18:41 -0400 Subject: [PATCH 035/112] remove some commands from cluster, npm update, clean code, --- benchmark/package-lock.json | 122 +-- benchmark/package.json | 2 +- lib/{ => client}/commands-queue.ts | 6 +- lib/client/commands.ts | 233 ++++++ lib/{client.spec.ts => client/index.spec.ts} | 19 +- lib/{client.ts => client/index.ts} | 90 +- lib/client/multi-command.ts | 132 +++ lib/{ => client}/socket.spec.ts | 0 lib/{ => client}/socket.ts | 4 +- lib/{ => cluster}/cluster-slots.ts | 25 +- lib/cluster/commands.ts | 535 ++++++++++++ .../index.spec.ts} | 13 +- lib/{cluster.ts => cluster/index.ts} | 80 +- lib/cluster/multi-command.ts | 112 +++ lib/commander.ts | 45 +- lib/commands/ACL_DELUSER.ts | 4 +- lib/commands/ACL_SETUSER.ts | 4 +- lib/commands/BITOP.ts | 4 +- lib/commands/BLPOP.ts | 4 +- lib/commands/BRPOP.ts | 4 +- lib/commands/BZPOPMAX.ts | 4 +- lib/commands/BZPOPMIN.ts | 4 +- lib/commands/CLUSTER_INFO.spec.ts | 18 - lib/commands/CLUSTER_NODES.spec.ts | 21 - lib/commands/CLUSTER_SLOTS.ts | 4 +- lib/commands/COMMAND.ts | 4 +- lib/commands/COMMAND_COUNT.spec.ts | 9 +- lib/commands/COMMAND_COUNT.ts | 4 +- lib/commands/COMMAND_GETKEYS.spec.ts | 9 +- lib/commands/COMMAND_GETKEYS.ts | 4 +- lib/commands/COMMAND_INFO.ts | 4 +- lib/commands/DBSIZE.spec.ts | 9 +- lib/commands/DEL.ts | 4 +- lib/commands/ECHO.spec.ts | 9 +- lib/commands/EXISTS.ts | 4 +- lib/commands/GEOHASH.ts | 4 +- lib/commands/GEOPOS.ts | 4 +- lib/commands/GEOSEARCH_WITH.spec.ts | 4 +- lib/commands/GEOSEARCH_WITH.ts | 6 +- lib/commands/GET.ts | 4 +- lib/commands/GETEX.ts | 4 +- lib/commands/HDEL.ts | 4 +- lib/commands/HMGET.ts | 4 +- lib/commands/HSET.ts | 4 +- lib/commands/LASTSAVE.spec.ts | 6 +- lib/commands/LOLWUT.spec.ts | 11 +- lib/commands/LPUSH.ts | 4 +- lib/commands/LPUSHX.ts | 4 +- lib/commands/MEMORY_DOCTOR.spec.ts | 9 +- lib/commands/MEMORY_MALLOC-STATS.spec.ts | 9 +- lib/commands/MEMORY_PURGE.spec.ts | 9 +- lib/commands/MEMORY_USAGE.spec.ts | 9 +- lib/commands/PFADD.ts | 4 +- lib/commands/PFCOUNT.ts | 4 +- lib/commands/PFMERGE.ts | 4 +- lib/commands/PING.spec.ts | 9 +- lib/commands/PUBSUB_CHANNELS.spec.ts | 9 +- lib/commands/PUBSUB_NUMPAT.spec.ts | 9 +- lib/commands/PUBSUB_NUMSUB.spec.ts | 9 +- lib/commands/RPUSH.ts | 4 +- lib/commands/RPUSHX.ts | 4 +- lib/commands/SADD.ts | 4 +- lib/commands/SCRIPT_DEBUG.spec.ts | 9 +- lib/commands/SCRIPT_EXISTS.spec.ts | 9 +- lib/commands/SCRIPT_EXISTS.ts | 4 +- lib/commands/SCRIPT_FLUSH.spec.ts | 9 +- lib/commands/SCRIPT_LOAD.spec.ts | 9 +- lib/commands/SDIFF.ts | 4 +- lib/commands/SDIFFSTORE.ts | 4 +- lib/commands/SET.ts | 4 +- lib/commands/SETBIT.ts | 4 +- lib/commands/SETEX.ts | 4 +- lib/commands/SINTER.ts | 4 +- lib/commands/SINTERSTORE.ts | 4 +- lib/commands/SREM.ts | 4 +- lib/commands/SUNION.ts | 4 +- lib/commands/SUNIONSTORE.ts | 4 +- lib/commands/TOUCH.ts | 4 +- lib/commands/UNLINK.ts | 4 +- lib/commands/UNWATCH.spec.ts | 9 +- lib/commands/WATCH.ts | 4 +- lib/commands/XACK.ts | 4 +- lib/commands/XDEL.ts | 4 +- lib/commands/ZDIFF.ts | 4 +- lib/commands/ZDIFFSTORE.ts | 4 +- lib/commands/ZDIFF_WITHSCORES.ts | 4 +- lib/commands/ZINTER.ts | 4 +- lib/commands/ZINTERSTORE.ts | 4 +- lib/commands/ZINTER_WITHSCORES.ts | 4 +- lib/commands/ZMSCORE.ts | 4 +- lib/commands/ZRANGEBYLEX.ts | 4 +- lib/commands/ZRANGEBYSCORE.ts | 4 +- lib/commands/ZRANGEBYSCORE_WITHSCORES.ts | 4 +- lib/commands/ZREM.ts | 4 +- lib/commands/ZUNION.ts | 4 +- lib/commands/ZUNIONSTORE.ts | 4 +- lib/commands/ZUNION_WITHSCORES.ts | 4 +- lib/commands/generic-transformers.ts | 8 +- lib/commands/index.ts | 784 +----------------- lib/lua-script.ts | 10 +- lib/multi-command.spec.ts | 163 ++-- lib/multi-command.ts | 190 +---- lib/test-utils.ts | 8 +- package-lock.json | 492 ++++++----- package.json | 15 +- tsconfig.json | 8 +- 106 files changed, 1729 insertions(+), 1822 deletions(-) rename lib/{ => client}/commands-queue.ts (97%) create mode 100644 lib/client/commands.ts rename lib/{client.spec.ts => client/index.spec.ts} (97%) rename lib/{client.ts => client/index.ts} (82%) create mode 100644 lib/client/multi-command.ts rename lib/{ => client}/socket.spec.ts (100%) rename lib/{ => client}/socket.ts (98%) rename lib/{ => cluster}/cluster-slots.ts (91%) create mode 100644 lib/cluster/commands.ts rename lib/{cluster.spec.ts => cluster/index.spec.ts} (91%) rename lib/{cluster.ts => cluster/index.ts} (68%) create mode 100644 lib/cluster/multi-command.ts diff --git a/benchmark/package-lock.json b/benchmark/package-lock.json index 767d6870184..49d77a57787 100644 --- a/benchmark/package-lock.json +++ b/benchmark/package-lock.json @@ -7,7 +7,7 @@ "name": "benchmark", "license": "ISC", "dependencies": { - "benny": "^3.6.15", + "benny": "^3.7.0", "v3": "npm:redis@3.1.2", "v4": "file:../" } @@ -24,20 +24,21 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@tsconfig/node12": "^1.0.9", "@types/mocha": "^9.0.0", - "@types/node": "^16.9.6", - "@types/sinon": "^10.0.3", + "@types/node": "^16.10.3", + "@types/sinon": "^10.0.4", "@types/which": "^2.0.1", "@types/yallist": "^4.0.1", - "mocha": "^9.1.1", + "mocha": "^9.1.2", "nyc": "^15.1.0", "release-it": "^14.11.6", "sinon": "^11.1.2", "source-map-support": "^0.5.20", - "ts-node": "^10.2.1", - "typedoc": "0.21.9", - "typedoc-github-wiki-theme": "^0.5.1", - "typedoc-plugin-markdown": "3.10.4", + "ts-node": "^10.3.0", + "typedoc": "^0.22.5", + "typedoc-github-wiki-theme": "^0.6.0", + "typedoc-plugin-markdown": "^3.11.3", "typescript": "^4.4.3", "which": "^2.0.2" }, @@ -126,14 +127,6 @@ "node": ">=8" } }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/benchmark": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", @@ -144,20 +137,21 @@ } }, "node_modules/benny": { - "version": "3.6.15", - "resolved": "https://registry.npmjs.org/benny/-/benny-3.6.15.tgz", - "integrity": "sha512-kq6XVGGYVou3Y8KNPs3SEF881vi5fJ8sIf9w69D2rreiNfRicWVWK6u6/mObMw6BiexoHHumtipn5gcu0Tngng==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/benny/-/benny-3.7.0.tgz", + "integrity": "sha512-tfQ8s4qwjfyMvFqe7wSGGel2Pzgl5ytwztS72Xh/ynPKJeXFLQ0sSVL95X9wHpqpXqW13pTHsEMCggrNKgeAoA==", "dependencies": { "@arrows/composition": "^1.0.0", "@arrows/dispatch": "^1.0.2", "@arrows/multimethod": "^1.1.6", "benchmark": "^2.1.4", - "fs-extra": "^9.0.1", - "json2csv": "^5.0.4", - "kleur": "^4.1.3", - "log-update": "^4.0.0", - "prettier": "^2.1.2", - "stats-median": "^1.0.1" + "fs-extra": "^10.0.0", + "json2csv": "^5.0.6", + "kleur": "^4.1.4", + "log-update": "^4.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/cli-cursor": { @@ -214,17 +208,16 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", "dependencies": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/graceful-fs": { @@ -338,17 +331,6 @@ "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" }, - "node_modules/prettier": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/redis-commands": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", @@ -406,11 +388,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/stats-median": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stats-median/-/stats-median-1.0.1.tgz", - "integrity": "sha512-IYsheLg6dasD3zT/w9+8Iq9tcIQqqu91ZIpJOnIEM25C3X/g4Tl8mhXwW2ZQpbrsJISr9+wizEYgsibN5/b32Q==" - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -555,11 +532,6 @@ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, "benchmark": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", @@ -570,20 +542,18 @@ } }, "benny": { - "version": "3.6.15", - "resolved": "https://registry.npmjs.org/benny/-/benny-3.6.15.tgz", - "integrity": "sha512-kq6XVGGYVou3Y8KNPs3SEF881vi5fJ8sIf9w69D2rreiNfRicWVWK6u6/mObMw6BiexoHHumtipn5gcu0Tngng==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/benny/-/benny-3.7.0.tgz", + "integrity": "sha512-tfQ8s4qwjfyMvFqe7wSGGel2Pzgl5ytwztS72Xh/ynPKJeXFLQ0sSVL95X9wHpqpXqW13pTHsEMCggrNKgeAoA==", "requires": { "@arrows/composition": "^1.0.0", "@arrows/dispatch": "^1.0.2", "@arrows/multimethod": "^1.1.6", "benchmark": "^2.1.4", - "fs-extra": "^9.0.1", - "json2csv": "^5.0.4", - "kleur": "^4.1.3", - "log-update": "^4.0.0", - "prettier": "^2.1.2", - "stats-median": "^1.0.1" + "fs-extra": "^10.0.0", + "json2csv": "^5.0.6", + "kleur": "^4.1.4", + "log-update": "^4.0.0" } }, "cli-cursor": { @@ -628,11 +598,10 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", "requires": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" @@ -716,11 +685,6 @@ "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" }, - "prettier": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==" - }, "redis-commands": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", @@ -763,11 +727,6 @@ "is-fullwidth-code-point": "^3.0.0" } }, - "stats-median": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stats-median/-/stats-median-1.0.1.tgz", - "integrity": "sha512-IYsheLg6dasD3zT/w9+8Iq9tcIQqqu91ZIpJOnIEM25C3X/g4Tl8mhXwW2ZQpbrsJISr9+wizEYgsibN5/b32Q==" - }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -811,23 +770,24 @@ "version": "file:..", "requires": { "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@tsconfig/node12": "^1.0.9", "@types/mocha": "^9.0.0", - "@types/node": "^16.9.6", - "@types/sinon": "^10.0.3", + "@types/node": "^16.10.3", + "@types/sinon": "^10.0.4", "@types/which": "^2.0.1", "@types/yallist": "^4.0.1", "cluster-key-slot": "1.1.0", "generic-pool": "3.8.2", - "mocha": "^9.1.1", + "mocha": "^9.1.2", "nyc": "^15.1.0", "redis-parser": "3.0.0", "release-it": "^14.11.6", "sinon": "^11.1.2", "source-map-support": "^0.5.20", - "ts-node": "^10.2.1", - "typedoc": "0.21.9", - "typedoc-github-wiki-theme": "^0.5.1", - "typedoc-plugin-markdown": "3.10.4", + "ts-node": "^10.3.0", + "typedoc": "^0.22.5", + "typedoc-github-wiki-theme": "^0.6.0", + "typedoc-plugin-markdown": "^3.11.3", "typescript": "^4.4.3", "which": "^2.0.2", "yallist": "4.0.0" diff --git a/benchmark/package.json b/benchmark/package.json index 5226a5b0c89..f56ad2f23ce 100644 --- a/benchmark/package.json +++ b/benchmark/package.json @@ -10,7 +10,7 @@ "author": "", "license": "ISC", "dependencies": { - "benny": "^3.6.15", + "benny": "^3.7.0", "v3": "npm:redis@3.1.2", "v4": "file:../" } diff --git a/lib/commands-queue.ts b/lib/client/commands-queue.ts similarity index 97% rename from lib/commands-queue.ts rename to lib/client/commands-queue.ts index 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 82% rename from lib/client.ts rename to lib/client/index.ts index 98169bc302e..5aeffd365da 100644 --- a/lib/client.ts +++ b/lib/client/index.ts @@ -1,79 +1,81 @@ +import COMMANDS from './commands'; +import { RedisCommand, RedisCommandArguments, RedisCommandRawReply, RedisCommandReply, RedisModules, RedisPlugins, RedisScript, RedisScripts } from '../commands'; import RedisSocket, { RedisSocketOptions, RedisNetSocketOptions, RedisTlsSocketOptions } from './socket'; import RedisCommandsQueue, { PubSubListener, PubSubSubscribeCommands, PubSubUnsubscribeCommands, QueueCommandOptions } from './commands-queue'; -import COMMANDS, { RedisCommandReply, TransformArgumentsReply } from './commands'; -import { RedisCommand, RedisModules, RedisReply } from './commands'; -import RedisMultiCommand, { MultiQueuedCommand, RedisMultiCommandType } from './multi-command'; +import RedisClientMultiCommand, { RedisClientMultiCommandType } from './multi-command'; +import { RedisMultiQueuedCommand } from '../multi-command'; import EventEmitter from 'events'; -import { CommandOptions, commandOptions, isCommandOptions } from './command-options'; -import { RedisLuaScript, RedisLuaScripts } from './lua-script'; -import { ScanOptions, ZMember } from './commands/generic-transformers'; -import { ScanCommandOptions } from './commands/SCAN'; -import { HScanTuple } from './commands/HSCAN'; -import { encodeCommand, extendWithDefaultCommands, extendWithModulesAndScripts, transformCommandArguments, transformCommandReply } from './commander'; +import { CommandOptions, commandOptions, isCommandOptions } from '../command-options'; +import { ScanOptions, ZMember } from '../commands/generic-transformers'; +import { ScanCommandOptions } from '../commands/SCAN'; +import { HScanTuple } from '../commands/HSCAN'; +import { encodeCommand, extendWithCommands, extendWithModulesAndScripts, transformCommandArguments, transformCommandReply } from '../commander'; import { Pool, Options as PoolOptions, createPool } from 'generic-pool'; -import { ClientClosedError } from './errors'; +import { ClientClosedError } from '../errors'; import { URL } from 'url'; -export interface RedisClientOptions { +export interface RedisClientOptions extends RedisPlugins { url?: string; socket?: RedisSocketOptions; username?: string; password?: string; database?: number; - modules?: M; - scripts?: S; commandsQueueMaxLength?: number; readonly?: boolean; legacyMode?: boolean; isolationPoolOptions?: PoolOptions; } -export type RedisCommandSignature = +export type RedisClientCommandSignature = (...args: Parameters | [options: CommandOptions, ...rest: Parameters]) => Promise>; type WithCommands = { - [P in keyof typeof COMMANDS]: RedisCommandSignature<(typeof COMMANDS)[P]>; + [P in keyof typeof COMMANDS]: RedisClientCommandSignature<(typeof COMMANDS)[P]>; }; -type WithModules = { +export type WithModules = { [P in keyof M]: { - [C in keyof M[P]]: RedisCommandSignature; + [C in keyof M[P]]: RedisClientCommandSignature; }; }; -type WithScripts = { - [P in keyof S]: RedisCommandSignature; +export type WithScripts = { + [P in keyof S]: RedisClientCommandSignature; }; -export type WithPlugins = - WithCommands & WithModules & WithScripts; +export type RedisClientType = + RedisClient & WithCommands & WithModules & WithScripts; -export type RedisClientType = - WithPlugins & RedisClient; +export type InstantiableRedisClient = + new (...args: ConstructorParameters) => RedisClientType; export interface ClientCommandOptions extends QueueCommandOptions { isolated?: boolean; } -export default class RedisClient extends EventEmitter { +export default class RedisClient extends EventEmitter { static commandOptions(options: ClientCommandOptions): CommandOptions { return commandOptions(options); } - static create(options?: RedisClientOptions): RedisClientType { - const Client = (extendWithModulesAndScripts({ + static extend(plugins?: RedisPlugins): InstantiableRedisClient { + const Client = extendWithModulesAndScripts({ BaseClass: RedisClient, - modules: options?.modules, + modules: plugins?.modules, modulesCommandsExecutor: RedisClient.prototype.commandsExecutor, - scripts: options?.scripts, + scripts: plugins?.scripts, scriptsExecutor: RedisClient.prototype.scriptsExecutor - })); + }); if (Client !== RedisClient) { - Client.prototype.Multi = RedisMultiCommand.extend(options); + Client.prototype.Multi = RedisClientMultiCommand.extend(plugins); } - return new Client(options); + return Client; + } + + static create(options?: RedisClientOptions): RedisClientType { + return new (RedisClient.extend(options))(options); } static parseURL(url: string): RedisClientOptions<{}, {}> { @@ -285,12 +287,12 @@ export default class RedisClient(args: TransformArgumentsReply, options?: ClientCommandOptions, bufferMode?: boolean): Promise { + sendCommand(args: RedisCommandArguments, options?: ClientCommandOptions, bufferMode?: boolean): Promise { return this.#sendCommand(args, options, bufferMode); } // using `#sendCommand` cause `sendCommand` is overwritten in legacy mode - async #sendCommand(args: TransformArgumentsReply, options?: ClientCommandOptions, bufferMode?: boolean): Promise { + async #sendCommand(args: RedisCommandArguments, options?: ClientCommandOptions, bufferMode?: boolean): Promise { if (!this.#socket.isOpen) { throw new ClientClosedError(); } @@ -309,7 +311,7 @@ export default class RedisClient): Promise> { + async scriptsExecutor(script: RedisScript, args: Array): Promise> { const { args: redisArgs, options } = transformCommandArguments(script, args); return transformCommandReply( @@ -319,7 +321,7 @@ export default class RedisClient> { + async executeScript(script: RedisScript, args: RedisCommandArguments, options?: ClientCommandOptions, bufferMode?: boolean): Promise> { try { return await this.#sendCommand([ 'EVALSHA', @@ -341,8 +343,6 @@ export default class RedisClient; async SELECT(options: CommandOptions, db: number): Promise; async SELECT(options?: any, db?: any): Promise { @@ -429,14 +429,14 @@ export default class RedisClient { + multi(): RedisClientMultiCommandType { return new (this as any).Multi( - this.#multiExecutor.bind(this), - this.#options + this.multiExecutor.bind(this), + this.#options?.legacyMode ); } - #multiExecutor(commands: Array, chainId?: symbol): Promise> { + multiExecutor(commands: Array, chainId?: symbol): Promise> { const promise = Promise.all( commands.map(({ args }) => { return this.#queue.addCommand(args, RedisClient.commandOptions({ @@ -508,5 +508,9 @@ export default class RedisClient = + (...args: Parameters) => RedisClientMultiCommandType; + +type WithCommands = { + [P in keyof typeof COMMANDS]: RedisClientMultiCommandSignature<(typeof COMMANDS)[P], M, S> +}; + +type WithModules = { + [P in keyof M]: { + [C in keyof M[P]]: RedisClientMultiCommandSignature; + }; +}; + +type WithScripts = { + [P in keyof S]: RedisClientMultiCommandSignature +}; + +export type RedisClientMultiCommandType = + RedisClientMultiCommand & WithCommands & WithModules & WithScripts; + +export type RedisClientMultiExecutor = (queue: Array, chainId?: symbol) => Promise>; + +export default class RedisClientMultiCommand { + readonly #multi = new RedisMultiCommand(); + readonly #executor: RedisClientMultiExecutor; + + static extend( + plugins?: RedisPlugins + ): new (...args: ConstructorParameters) => RedisClientMultiCommandType { + return extendWithModulesAndScripts({ + BaseClass: RedisClientMultiCommand, + modules: plugins?.modules, + modulesCommandsExecutor: RedisClientMultiCommand.prototype.commandsExecutor, + scripts: plugins?.scripts, + scriptsExecutor: RedisClientMultiCommand.prototype.scriptsExecutor + }); + } + + readonly v4: Record = {}; + + constructor(executor: RedisClientMultiExecutor, legacyMode = false) { + this.#executor = executor; + if (legacyMode) { + this.#legacyMode(); + } + } + + #legacyMode(): void { + this.v4.addCommand = this.addCommand.bind(this); + (this as any).addCommand = (...args: Array>): this => { + this.#multi.addCommand(args.flat()); + return this; + }; + this.v4.exec = this.exec.bind(this); + (this as any).exec = (callback?: (err: Error | null, replies?: Array) => unknown): void => { + this.v4.exec() + .then((reply: Array) => { + if (!callback) return; + + callback(null, reply); + }) + .catch((err: Error) => { + if (!callback) { + // this.emit('error', err); + return; + } + + callback(err); + }); + }; + + for (const name of Object.keys(COMMANDS)) { + this.#defineLegacyCommand(name); + } + } + + #defineLegacyCommand(name: string): void { + (this as any).v4[name] = (this as any)[name].bind(this.v4); + (this as any)[name] = (...args: Array): void => (this as any).addCommand(name, args); + } + + commandsExecutor(command: RedisCommand, args: Array): this { + return this.addCommand( + command.transformArguments(...args), + command.transformReply + ); + } + + addCommand(args: RedisCommandArguments, transformReply?: RedisCommand['transformReply']): this { + this.#multi.addCommand(args, transformReply); + return this; + } + + scriptsExecutor(script: RedisScript, args: Array): this { + this.#multi.addScript(script, args); + return this; + } + + async exec(execAsPipeline = false): Promise> { + if (execAsPipeline) { + return this.execAsPipeline(); + } + + const commands = this.#multi.exec(); + if (!commands) return []; + + return this.#multi.handleExecReplies( + await this.#executor(commands, RedisMultiCommand.generateChainId()) + ); + } + + EXEC = this.exec; + + async execAsPipeline(): Promise> { + if (!this.#multi.queue.length) return []; + + return this.#multi.transformReplies( + await this.#executor(this.#multi.queue) + ); + } +} + +extendWithCommands({ + BaseClass: RedisClientMultiCommand, + commands: COMMANDS, + executor: RedisClientMultiCommand.prototype.commandsExecutor +}); diff --git a/lib/socket.spec.ts b/lib/client/socket.spec.ts similarity index 100% rename from lib/socket.spec.ts rename to lib/client/socket.spec.ts diff --git a/lib/socket.ts b/lib/client/socket.ts similarity index 98% rename from lib/socket.ts rename to lib/client/socket.ts index 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 91% rename from lib/cluster-slots.ts rename to lib/cluster/cluster-slots.ts index 29730bf753d..63834d4b4ca 100644 --- a/lib/cluster-slots.ts +++ b/lib/cluster/cluster-slots.ts @@ -1,16 +1,15 @@ import calculateSlot from 'cluster-key-slot'; -import RedisClient, { RedisClientType } from './client'; -import { RedisClusterMasterNode, RedisClusterReplicaNode } from './commands/CLUSTER_NODES'; -import { RedisClusterClientOptions, RedisClusterOptions } from './cluster'; -import { RedisModules } from './commands'; -import { RedisLuaScripts } from './lua-script'; +import RedisClient, { InstantiableRedisClient, RedisClientType } from '../client'; +import { RedisClusterMasterNode, RedisClusterReplicaNode } from '../commands/CLUSTER_NODES'; +import { RedisClusterClientOptions, RedisClusterOptions } from '.'; +import { RedisModules, RedisScripts } from '../commands'; -export interface ClusterNode { +export interface ClusterNode { id: string; client: RedisClientType; } -interface SlotNodes { +interface SlotNodes { master: ClusterNode; replicas: Array>; clientIterator: IterableIterator> | undefined; @@ -18,14 +17,16 @@ interface SlotNodes { type OnError = (err: unknown) => void; -export default class RedisClusterSlots { - readonly #options: RedisClusterOptions; +export default class RedisClusterSlots { + readonly #options: RedisClusterOptions; + readonly #Client: InstantiableRedisClient; readonly #onError: OnError; readonly #nodeByUrl = new Map>(); readonly #slots: Array> = []; - constructor(options: RedisClusterOptions, onError: OnError) { + constructor(options: RedisClusterOptions, onError: OnError) { this.#options = options; + this.#Client = RedisClient.extend(options); this.#onError = onError; } @@ -50,7 +51,7 @@ export default class RedisClusterSlots { - const client = RedisClient.create(clientOptions); + const client = new this.#Client(clientOptions); await client.connect(); @@ -118,7 +119,7 @@ export default class RedisClusterSlots { it('sendCommand', async () => { @@ -15,7 +15,7 @@ describe('Cluster', () => { await cluster.connect(); try { - await cluster.ping(); + await cluster.publish('channel', 'message'); await cluster.set('a', 'b'); await cluster.set('a{a}', 'bb'); await cluster.set('aa', 'bb'); @@ -32,11 +32,10 @@ describe('Cluster', () => { const key = 'key'; assert.deepEqual( await cluster.multi(key) - .ping() .set(key, 'value') .get(key) .exec(), - ['PONG', 'OK', 'value'] + ['OK', 'value'] ); }); diff --git a/lib/cluster.ts b/lib/cluster/index.ts similarity index 68% rename from lib/cluster.ts rename to lib/cluster/index.ts index 295e193cbc9..4b55a93d4ab 100644 --- a/lib/cluster.ts +++ b/lib/cluster/index.ts @@ -1,27 +1,35 @@ -import { RedisCommand, RedisCommandReply, RedisModules, TransformArgumentsReply } from './commands'; -import RedisClient, { ClientCommandOptions, RedisClientOptions, RedisClientType, WithPlugins } from './client'; +import COMMANDS from './commands'; +import { RedisCommand, RedisCommandArguments, RedisCommandReply, RedisModules, RedisScript, RedisScripts } from '../commands'; +import { ClientCommandOptions, RedisClientCommandSignature, RedisClientOptions, RedisClientType, WithModules, WithScripts } from '../client'; import RedisClusterSlots, { ClusterNode } from './cluster-slots'; -import { RedisLuaScript, RedisLuaScripts } from './lua-script'; -import { extendWithModulesAndScripts, extendWithDefaultCommands, transformCommandArguments, transformCommandReply } from './commander'; -import RedisMultiCommand, { MultiQueuedCommand, RedisMultiCommandType } from './multi-command'; +import { extendWithModulesAndScripts, transformCommandArguments, transformCommandReply, extendWithCommands } from '../commander'; import { EventEmitter } from 'events'; +import RedisClusterMultiCommand, { RedisClusterMultiCommandType } from './multi-command'; +import { RedisMultiQueuedCommand } from '../multi-command'; export type RedisClusterClientOptions = Omit, 'modules' | 'scripts'>; -export interface RedisClusterOptions { - rootNodes: Array; - defaults?: Partial; +export interface RedisClusterPlugins { modules?: M; scripts?: S; +} + +export interface RedisClusterOptions extends RedisClusterPlugins { + rootNodes: Array; + defaults?: Partial; useReplicas?: boolean; maxCommandRedirections?: number; } -export type RedisClusterType = - WithPlugins & RedisCluster; +type WithCommands = { + [P in keyof typeof COMMANDS]: RedisClientCommandSignature<(typeof COMMANDS)[P]>; +}; + +export type RedisClusterType = + RedisCluster & WithCommands & WithModules & WithScripts; -export default class RedisCluster extends EventEmitter { - static #extractFirstKey(command: RedisCommand, originalArgs: Array, redisArgs: TransformArgumentsReply): string | Buffer | undefined { +export default class RedisCluster extends EventEmitter { + static extractFirstKey(command: RedisCommand, originalArgs: Array, redisArgs: RedisCommandArguments): string | Buffer | undefined { if (command.FIRST_KEY_INDEX === undefined) { return undefined; } else if (typeof command.FIRST_KEY_INDEX === 'number') { @@ -31,7 +39,7 @@ export default class RedisCluster(options?: RedisClusterOptions): RedisClusterType { + static create(options?: RedisClusterOptions): RedisClusterType { return new (extendWithModulesAndScripts({ BaseClass: RedisCluster, modules: options?.modules, @@ -41,20 +49,20 @@ export default class RedisCluster; readonly #slots: RedisClusterSlots; - readonly #Multi: new (...args: ConstructorParameters) => RedisMultiCommandType; + readonly #Multi: new (...args: ConstructorParameters) => RedisClusterMultiCommandType; constructor(options: RedisClusterOptions) { super(); this.#options = options; this.#slots = new RedisClusterSlots(options, err => this.emit('error', err)); - this.#Multi = RedisMultiCommand.extend(options); + this.#Multi = RedisClusterMultiCommand.extend(options); } - duplicate(): RedisClusterOptions { - return new (Object.getPrototypeOf(this).constructor)(this.#options); + duplicate(): RedisClusterType { + return new (Object.getPrototypeOf(this).constructor)(); } async connect(): Promise { @@ -67,7 +75,7 @@ export default class RedisCluster( firstKey: string | Buffer | undefined, isReadonly: boolean | undefined, - args: TransformArgumentsReply, + args: RedisCommandArguments, options?: ClientCommandOptions, bufferMode?: boolean, redirections = 0 @@ -101,7 +109,7 @@ export default class RedisCluster): Promise> { + async scriptsExecutor(script: RedisScript, args: Array): Promise> { const { args: redisArgs, options } = transformCommandArguments(script, args); return transformCommandReply( @@ -117,14 +125,14 @@ export default class RedisCluster, - redisArgs: TransformArgumentsReply, + redisArgs: RedisCommandArguments, options?: ClientCommandOptions, redirections = 0 ): Promise> { const client = this.#slots.getClient( - RedisCluster.#extractFirstKey(script, originalArgs, redisArgs), + RedisCluster.extractFirstKey(script, originalArgs, redisArgs), script.IS_READ_ONLY ); @@ -169,20 +177,14 @@ export default class RedisCluster { + multi(routing?: string | Buffer): RedisClusterMultiCommandType { return new this.#Multi( - async (commands: Array, chainId?: symbol) => { - const client = this.#slots.getClient(routing); - - return Promise.all( - commands.map(({ args }) => { - return client.sendCommand(args, RedisClient.commandOptions({ - chainId - })); - }) - ); + async (commands: Array, firstKey?: string | Buffer, chainId?: symbol) => { + return this.#slots + .getClient(firstKey) + .multiExecutor(commands, chainId); }, - this.#options + routing ); } @@ -199,4 +201,8 @@ export default class RedisCluster = + (...args: Parameters) => RedisClusterMultiCommandType; + +type WithCommands = { + [P in keyof typeof COMMANDS]: RedisClusterMultiCommandSignature<(typeof COMMANDS)[P], M, S> +}; + +type WithModules = { + [P in keyof M]: { + [C in keyof M[P]]: RedisClusterMultiCommandSignature; + }; +}; + +type WithScripts = { + [P in keyof S]: RedisClusterMultiCommandSignature +}; + +export type RedisClusterMultiCommandType = + RedisClusterMultiCommand & WithCommands & WithModules & WithScripts; + +export type RedisClusterMultiExecutor = (queue: Array, firstKey?: string | Buffer, chainId?: symbol) => Promise>; + +export default class RedisClusterMultiCommand { + readonly #multi = new RedisMultiCommand(); + readonly #executor: RedisClusterMultiExecutor; + #firstKey: string | Buffer | undefined; + + static extend( + plugins?: RedisPlugins + ): new (...args: ConstructorParameters) => RedisClusterMultiCommandType { + return extendWithModulesAndScripts({ + BaseClass: RedisClusterMultiCommand, + modules: plugins?.modules, + modulesCommandsExecutor: RedisClusterMultiCommand.prototype.commandsExecutor, + scripts: plugins?.scripts, + scriptsExecutor: RedisClusterMultiCommand.prototype.scriptsExecutor + }); + } + + constructor(executor: RedisClusterMultiExecutor, firstKey?: string | Buffer) { + this.#executor = executor; + this.#firstKey = firstKey; + } + + commandsExecutor(command: RedisCommand, args: Array): this { + const transformedArguments = command.transformArguments(...args); + if (!this.#firstKey) { + this.#firstKey = RedisCluster.extractFirstKey(command, args, transformedArguments); + } + + return this.addCommand( + undefined, + transformedArguments, + command.transformReply + ); + } + + addCommand( + firstKey: string | Buffer | undefined, + args: RedisCommandArguments, + transformReply?: RedisCommand['transformReply'] + ): this { + if (!this.#firstKey) { + this.#firstKey = firstKey; + } + + this.#multi.addCommand(args, transformReply); + return this; + } + + scriptsExecutor(script: RedisScript, args: Array): this { + const transformedArguments = this.#multi.addScript(script, args); + if (!this.#firstKey) { + this.#firstKey = RedisCluster.extractFirstKey(script, args, transformedArguments); + } + + return this.addCommand(undefined, transformedArguments); + } + + async exec(execAsPipeline = false): Promise> { + if (execAsPipeline) { + return this.execAsPipeline(); + } + + const commands = this.#multi.exec(); + if (!commands) return []; + + return this.#multi.handleExecReplies( + await this.#executor(commands, this.#firstKey, RedisMultiCommand.generateChainId()) + ); + } + + EXEC = this.exec; + + async execAsPipeline(): Promise> { + return this.#multi.transformReplies( + await this.#executor(this.#multi.queue, this.#firstKey) + ); + } +} + +extendWithCommands({ + BaseClass: RedisClusterMultiCommand, + commands: COMMANDS, + executor: RedisClusterMultiCommand.prototype.commandsExecutor +}); diff --git a/lib/commander.ts b/lib/commander.ts index 4e542bde74a..5871c2f235b 100644 --- a/lib/commander.ts +++ b/lib/commander.ts @@ -1,37 +1,32 @@ -import COMMANDS, { RedisCommand, RedisCommandReply, RedisModules, RedisReply, TransformArgumentsReply } from './commands'; -import { RedisLuaScript, RedisLuaScripts } from './lua-script'; import { CommandOptions, isCommandOptions } from './command-options'; +import { RedisCommand, RedisCommandArguments, RedisCommandRawReply, RedisCommandReply, RedisCommands, RedisModules, RedisScript, RedisScripts } from './commands'; type Instantiable = new(...args: Array) => T; -type CommandExecutor = (this: InstanceType, command: RedisCommand, args: Array) => unknown; +interface ExtendWithCommandsConfig { + BaseClass: T; + commands: RedisCommands; + executor(command: RedisCommand, args: Array): unknown; +} -export function extendWithDefaultCommands(BaseClass: T, executor: CommandExecutor): void { - for (const [name, command] of Object.entries(COMMANDS)) { +export function extendWithCommands({ BaseClass, commands, executor }: ExtendWithCommandsConfig): void { + for (const [name, command] of Object.entries(commands)) { BaseClass.prototype[name] = function (...args: Array): unknown { return executor.call(this, command, args); }; } } -interface ExtendWithModulesAndScriptsConfig< - T extends Instantiable, - M extends RedisModules, - S extends RedisLuaScripts -> { +interface ExtendWithModulesAndScriptsConfig { BaseClass: T; - modules: M | undefined; - modulesCommandsExecutor: CommandExecutor; - scripts: S | undefined; - scriptsExecutor(this: InstanceType, script: RedisLuaScript, args: Array): unknown; + modules?: RedisModules; + modulesCommandsExecutor(this: InstanceType, command: RedisCommand, args: Array): unknown; + scripts?: RedisScripts; + scriptsExecutor(this: InstanceType, script: RedisScript, args: Array): unknown; } -export function extendWithModulesAndScripts< - T extends Instantiable, - M extends RedisModules, - S extends RedisLuaScripts, ->(config: ExtendWithModulesAndScriptsConfig): T { +export function extendWithModulesAndScripts(config: ExtendWithModulesAndScriptsConfig): T { let Commander: T | undefined; if (config.modules) { @@ -39,7 +34,7 @@ export function extendWithModulesAndScripts< constructor(...args: Array) { super(...args); - for (const module of Object.keys(config.modules as RedisModules)) { + for (const module of Object.keys(config.modules!)) { this[module] = new this[module](this); } } @@ -79,7 +74,7 @@ export function transformCommandArguments( command: RedisCommand, args: Array ): { - args: TransformArgumentsReply; + args: RedisCommandArguments; options: CommandOptions | undefined; } { let options; @@ -96,7 +91,7 @@ export function transformCommandArguments( const DELIMITER = '\r\n'; -export function* encodeCommand(args: TransformArgumentsReply): IterableIterator { +export function* encodeCommand(args: RedisCommandArguments): IterableIterator { yield `*${args.length}${DELIMITER}`; for (const arg of args) { @@ -107,7 +102,11 @@ export function* encodeCommand(args: TransformArgumentsReply): IterableIterator< } } -export function transformCommandReply(command: RedisCommand, rawReply: RedisReply, preserved: unknown): RedisCommandReply { +export function transformCommandReply( + command: RedisCommand, + rawReply: RedisCommandRawReply, + preserved: unknown +): RedisCommandReply { if (!command.transformReply) { return rawReply; } diff --git a/lib/commands/ACL_DELUSER.ts b/lib/commands/ACL_DELUSER.ts index e83e4d7d0ab..97f50d48945 100644 --- a/lib/commands/ACL_DELUSER.ts +++ b/lib/commands/ACL_DELUSER.ts @@ -1,7 +1,7 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; -export function transformArguments(username: string | Array): TransformArgumentsReply { +export function transformArguments(username: string | Array): RedisCommandArguments { return pushVerdictArguments(['ACL', 'DELUSER'], username); } diff --git a/lib/commands/ACL_SETUSER.ts b/lib/commands/ACL_SETUSER.ts index a590376ab84..d8734f0a1ca 100644 --- a/lib/commands/ACL_SETUSER.ts +++ b/lib/commands/ACL_SETUSER.ts @@ -1,7 +1,7 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; -export function transformArguments(username: string, rule: string | Array): TransformArgumentsReply { +export function transformArguments(username: string, rule: string | Array): RedisCommandArguments { return pushVerdictArguments(['ACL', 'SETUSER', username], rule); } diff --git a/lib/commands/BITOP.ts b/lib/commands/BITOP.ts index 1a750f811ca..af31f42f1dc 100644 --- a/lib/commands/BITOP.ts +++ b/lib/commands/BITOP.ts @@ -1,11 +1,11 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 2; type BitOperations = 'AND' | 'OR' | 'XOR' | 'NOT'; -export function transformArguments(operation: BitOperations, destKey: string, key: string | Array): TransformArgumentsReply { +export function transformArguments(operation: BitOperations, destKey: string, key: string | Array): RedisCommandArguments { return pushVerdictArguments(['BITOP', operation, destKey], key); } diff --git a/lib/commands/BLPOP.ts b/lib/commands/BLPOP.ts index 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/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/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_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_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.ts b/lib/commands/COMMAND.ts index f72cc3f37dd..b6ee50b2f4c 100644 --- a/lib/commands/COMMAND.ts +++ b/lib/commands/COMMAND.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { CommandRawReply, CommandReply, transformCommandReply } from './generic-transformers'; export const IS_READ_ONLY = true; -export function transformArguments(): TransformArgumentsReply { +export function transformArguments(): RedisCommandArguments { return ['COMMAND']; } diff --git a/lib/commands/COMMAND_COUNT.spec.ts b/lib/commands/COMMAND_COUNT.spec.ts index 61ba1bf2540..23e83c71cec 100644 --- a/lib/commands/COMMAND_COUNT.spec.ts +++ b/lib/commands/COMMAND_COUNT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { itWithClient, itWithCluster, TestRedisClusters, TestRedisServers } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './COMMAND_COUNT'; describe('COMMAND COUNT', () => { @@ -16,11 +16,4 @@ describe('COMMAND COUNT', () => { 'number' ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.commandCount', async cluster => { - assert.equal( - typeof await cluster.commandCount(), - 'number' - ); - }); }); diff --git a/lib/commands/COMMAND_COUNT.ts b/lib/commands/COMMAND_COUNT.ts index 4cdec7bebf1..5b8283bcc66 100644 --- a/lib/commands/COMMAND_COUNT.ts +++ b/lib/commands/COMMAND_COUNT.ts @@ -1,8 +1,8 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; export const IS_READ_ONLY = true; -export function transformArguments(): TransformArgumentsReply { +export function transformArguments(): RedisCommandArguments { return ['COMMAND', 'COUNT']; } diff --git a/lib/commands/COMMAND_GETKEYS.spec.ts b/lib/commands/COMMAND_GETKEYS.spec.ts index 37e91781589..f2630db9afa 100644 --- a/lib/commands/COMMAND_GETKEYS.spec.ts +++ b/lib/commands/COMMAND_GETKEYS.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { itWithClient, itWithCluster, TestRedisClusters, TestRedisServers } from '../test-utils'; +import { TestRedisServers, itWithClient } from '../test-utils'; import { transformArguments } from './COMMAND_GETKEYS'; describe('COMMAND GETKEYS', () => { @@ -16,11 +16,4 @@ describe('COMMAND GETKEYS', () => { ['key'] ); }); - - itWithCluster(TestRedisClusters.OPEN, 'cluster.commandGetKeys', async cluster => { - assert.deepEqual( - await cluster.commandGetKeys(['GET', 'key']), - ['key'] - ); - }); }); diff --git a/lib/commands/COMMAND_GETKEYS.ts b/lib/commands/COMMAND_GETKEYS.ts index 0b8f38e3d08..caf342088fb 100644 --- a/lib/commands/COMMAND_GETKEYS.ts +++ b/lib/commands/COMMAND_GETKEYS.ts @@ -1,8 +1,8 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; export const IS_READ_ONLY = true; -export function transformArguments(args: Array): TransformArgumentsReply { +export function transformArguments(args: Array): RedisCommandArguments { return ['COMMAND', 'GETKEYS', ...args]; } diff --git a/lib/commands/COMMAND_INFO.ts b/lib/commands/COMMAND_INFO.ts index 274c57d6aef..6f84d0edaf9 100644 --- a/lib/commands/COMMAND_INFO.ts +++ b/lib/commands/COMMAND_INFO.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { CommandRawReply, CommandReply, transformCommandReply } from './generic-transformers'; export const IS_READ_ONLY = true; -export function transformArguments(commands: Array): TransformArgumentsReply { +export function transformArguments(commands: Array): RedisCommandArguments { return ['COMMAND', 'INFO', ...commands]; } diff --git a/lib/commands/DBSIZE.spec.ts b/lib/commands/DBSIZE.spec.ts index 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/DEL.ts b/lib/commands/DEL.ts index b815258df1b..02ef553f647 100644 --- a/lib/commands/DEL.ts +++ b/lib/commands/DEL.ts @@ -1,7 +1,7 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; -export function transformArguments(keys: string | Array): TransformArgumentsReply { +export function transformArguments(keys: string | Array): RedisCommandArguments { return pushVerdictArguments(['DEL'], keys); } diff --git a/lib/commands/ECHO.spec.ts b/lib/commands/ECHO.spec.ts index 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/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/GEOHASH.ts b/lib/commands/GEOHASH.ts index 2ee2c6a6689..8613f37fa43 100644 --- a/lib/commands/GEOHASH.ts +++ b/lib/commands/GEOHASH.ts @@ -1,11 +1,11 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; -export function transformArguments(key: string, member: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, member: string | Array): RedisCommandArguments { return pushVerdictArguments(['GEOHASH', key], member); } diff --git a/lib/commands/GEOPOS.ts b/lib/commands/GEOPOS.ts index 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_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 dbd303d1c65..0e89a4e6a74 100644 --- a/lib/commands/GET.ts +++ b/lib/commands/GET.ts @@ -1,10 +1,10 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; -export function transformArguments(key: string | Buffer): TransformArgumentsReply { +export function transformArguments(key: string | Buffer): RedisCommandArguments { return ['GET', key]; } diff --git a/lib/commands/GETEX.ts b/lib/commands/GETEX.ts index 2c6a4f243f6..cd4f283eee3 100644 --- a/lib/commands/GETEX.ts +++ b/lib/commands/GETEX.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { transformEXAT, transformPXAT } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -15,7 +15,7 @@ type GetExModes = { PERSIST: true; }; -export function transformArguments(key: string, mode: GetExModes): TransformArgumentsReply { +export function transformArguments(key: string, mode: GetExModes): RedisCommandArguments { const args = ['GETEX', key]; if ('EX' in mode) { diff --git a/lib/commands/HDEL.ts b/lib/commands/HDEL.ts index 75130c87239..58d057ebf10 100644 --- a/lib/commands/HDEL.ts +++ b/lib/commands/HDEL.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, field: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, field: string | Array): RedisCommandArguments { return pushVerdictArguments(['HDEL', key], field); } diff --git a/lib/commands/HMGET.ts b/lib/commands/HMGET.ts index 420102d2b27..7ca3a55b69c 100644 --- a/lib/commands/HMGET.ts +++ b/lib/commands/HMGET.ts @@ -1,11 +1,11 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; -export function transformArguments(key: string, fields: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, fields: string | Array): RedisCommandArguments { return pushVerdictArguments(['HMGET', key], fields); } diff --git a/lib/commands/HSET.ts b/lib/commands/HSET.ts index 1aecd50c0d0..1d4acd6c018 100644 --- a/lib/commands/HSET.ts +++ b/lib/commands/HSET.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; type HSETObject = Record; @@ -14,7 +14,7 @@ type SingleFieldArguments = [...generic: GenericArguments, field: string, value: type MultipleFieldsArguments = [...generic: GenericArguments, value: HSETObject | HSETMap | HSETTuples]; -export function transformArguments(...[ key, value, fieldValue ]: SingleFieldArguments | MultipleFieldsArguments): TransformArgumentsReply { +export function transformArguments(...[ key, value, fieldValue ]: SingleFieldArguments | MultipleFieldsArguments): RedisCommandArguments { const args = ['HSET', key]; if (typeof value === 'string') { diff --git a/lib/commands/LASTSAVE.spec.ts b/lib/commands/LASTSAVE.spec.ts index 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/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/LPUSH.ts b/lib/commands/LPUSH.ts index 349affb5e09..b9644344772 100644 --- a/lib/commands/LPUSH.ts +++ b/lib/commands/LPUSH.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, elements: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, elements: string | Array): RedisCommandArguments { return pushVerdictArguments(['LPUSH', key], elements);} export declare function transformReply(): number; diff --git a/lib/commands/LPUSHX.ts b/lib/commands/LPUSHX.ts index 23b8bd9b91b..5f92d84d3b0 100644 --- a/lib/commands/LPUSHX.ts +++ b/lib/commands/LPUSHX.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, element: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, element: string | Array): RedisCommandArguments { return pushVerdictArguments(['LPUSHX', key], element); } diff --git a/lib/commands/MEMORY_DOCTOR.spec.ts b/lib/commands/MEMORY_DOCTOR.spec.ts index 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_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_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_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/PFADD.ts b/lib/commands/PFADD.ts index cc99bed7f65..4328a18dfe5 100644 --- a/lib/commands/PFADD.ts +++ b/lib/commands/PFADD.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments, transformReplyBoolean } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, element: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, element: string | Array): RedisCommandArguments { return pushVerdictArguments(['PFADD', key], element); } diff --git a/lib/commands/PFCOUNT.ts b/lib/commands/PFCOUNT.ts index 1fe3b1ee5d2..ec6c0906041 100644 --- a/lib/commands/PFCOUNT.ts +++ b/lib/commands/PFCOUNT.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string | Array): TransformArgumentsReply { +export function transformArguments(key: string | Array): RedisCommandArguments { return pushVerdictArguments(['PFCOUNT'], key); } diff --git a/lib/commands/PFMERGE.ts b/lib/commands/PFMERGE.ts index 86bef6c4d7f..e934062b3fe 100644 --- a/lib/commands/PFMERGE.ts +++ b/lib/commands/PFMERGE.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(destination: string, source: string | Array): TransformArgumentsReply { +export function transformArguments(destination: string, source: string | Array): RedisCommandArguments { return pushVerdictArguments(['PFMERGE', destination], source); } diff --git a/lib/commands/PING.spec.ts b/lib/commands/PING.spec.ts index 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/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_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_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/RPUSH.ts b/lib/commands/RPUSH.ts index 92df52f03ff..575177755cc 100644 --- a/lib/commands/RPUSH.ts +++ b/lib/commands/RPUSH.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, element: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, element: string | Array): RedisCommandArguments { return pushVerdictArguments(['RPUSH', key], element); } diff --git a/lib/commands/RPUSHX.ts b/lib/commands/RPUSHX.ts index 14ad9dc9d50..bacc60d404b 100644 --- a/lib/commands/RPUSHX.ts +++ b/lib/commands/RPUSHX.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, element: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, element: string | Array): RedisCommandArguments { return pushVerdictArguments(['RPUSHX', key], element); } diff --git a/lib/commands/SADD.ts b/lib/commands/SADD.ts index 31623c435ce..05e5a6858f7 100644 --- a/lib/commands/SADD.ts +++ b/lib/commands/SADD.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, members: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, members: string | Array): RedisCommandArguments { return pushVerdictArguments(['SADD', key], members); } diff --git a/lib/commands/SCRIPT_DEBUG.spec.ts b/lib/commands/SCRIPT_DEBUG.spec.ts index 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_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_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/SDIFF.ts b/lib/commands/SDIFF.ts index 134bd66ef85..7c1e4fc34a9 100644 --- a/lib/commands/SDIFF.ts +++ b/lib/commands/SDIFF.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(keys: string | Array): TransformArgumentsReply { +export function transformArguments(keys: string | Array): RedisCommandArguments { return pushVerdictArguments(['SDIFF'], keys); } diff --git a/lib/commands/SDIFFSTORE.ts b/lib/commands/SDIFFSTORE.ts index 1c437087c5e..9cca24beb61 100644 --- a/lib/commands/SDIFFSTORE.ts +++ b/lib/commands/SDIFFSTORE.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(destination: string, keys: string | Array): TransformArgumentsReply { +export function transformArguments(destination: string, keys: string | Array): RedisCommandArguments { return pushVerdictArguments(['SDIFFSTORE', destination], keys); } diff --git a/lib/commands/SET.ts b/lib/commands/SET.ts index 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 7b96907dfeb..7b0812a55ba 100644 --- a/lib/commands/SETBIT.ts +++ b/lib/commands/SETBIT.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { BitValue } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, offset: number, value: BitValue): TransformArgumentsReply { +export function transformArguments(key: string, offset: number, value: BitValue): RedisCommandArguments { return ['SETBIT', key, offset.toString(), value.toString()]; } diff --git a/lib/commands/SETEX.ts b/lib/commands/SETEX.ts index 0d21479bdc4..89c6e06a3f2 100644 --- a/lib/commands/SETEX.ts +++ b/lib/commands/SETEX.ts @@ -1,8 +1,8 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string | Buffer, seconds: number, value: string): TransformArgumentsReply { +export function transformArguments(key: string | Buffer, seconds: number, value: string): RedisCommandArguments { return [ 'SETEX', key, diff --git a/lib/commands/SINTER.ts b/lib/commands/SINTER.ts index 6348bbc7ab9..5d74e761f0e 100644 --- a/lib/commands/SINTER.ts +++ b/lib/commands/SINTER.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(keys: string | Array): TransformArgumentsReply { +export function transformArguments(keys: string | Array): RedisCommandArguments { return pushVerdictArguments(['SINTER'], keys); } diff --git a/lib/commands/SINTERSTORE.ts b/lib/commands/SINTERSTORE.ts index 0d31c409da8..40f31a8b7a3 100644 --- a/lib/commands/SINTERSTORE.ts +++ b/lib/commands/SINTERSTORE.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(destination: string, keys: string | Array): TransformArgumentsReply { +export function transformArguments(destination: string, keys: string | Array): RedisCommandArguments { return pushVerdictArguments(['SINTERSTORE', destination], keys); } diff --git a/lib/commands/SREM.ts b/lib/commands/SREM.ts index 534de170540..9a37ac9bf99 100644 --- a/lib/commands/SREM.ts +++ b/lib/commands/SREM.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, members: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, members: string | Array): RedisCommandArguments { return pushVerdictArguments(['SREM', key], members); } diff --git a/lib/commands/SUNION.ts b/lib/commands/SUNION.ts index 07a46e38efa..ae8b02b481d 100644 --- a/lib/commands/SUNION.ts +++ b/lib/commands/SUNION.ts @@ -1,11 +1,11 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; -export function transformArguments(keys: string | Array): TransformArgumentsReply { +export function transformArguments(keys: string | Array): RedisCommandArguments { return pushVerdictArguments(['SUNION'], keys); } diff --git a/lib/commands/SUNIONSTORE.ts b/lib/commands/SUNIONSTORE.ts index 8745c516433..f259769f49a 100644 --- a/lib/commands/SUNIONSTORE.ts +++ b/lib/commands/SUNIONSTORE.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(destination: string, keys: string | Array): TransformArgumentsReply { +export function transformArguments(destination: string, keys: string | Array): RedisCommandArguments { return pushVerdictArguments(['SUNIONSTORE', destination], keys); } diff --git a/lib/commands/TOUCH.ts b/lib/commands/TOUCH.ts index 8632d848dbf..a3dc31e8568 100644 --- a/lib/commands/TOUCH.ts +++ b/lib/commands/TOUCH.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string | Array): TransformArgumentsReply { +export function transformArguments(key: string | Array): RedisCommandArguments { return pushVerdictArguments(['TOUCH'], key); } diff --git a/lib/commands/UNLINK.ts b/lib/commands/UNLINK.ts index 2ff87974cfb..467b4172e0f 100644 --- a/lib/commands/UNLINK.ts +++ b/lib/commands/UNLINK.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string | Array): TransformArgumentsReply { +export function transformArguments(key: string | Array): RedisCommandArguments { return pushVerdictArguments(['UNLINK'], key); } diff --git a/lib/commands/UNWATCH.spec.ts b/lib/commands/UNWATCH.spec.ts index 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/WATCH.ts b/lib/commands/WATCH.ts index 5ca42c0eb95..f66429b507e 100644 --- a/lib/commands/WATCH.ts +++ b/lib/commands/WATCH.ts @@ -1,7 +1,7 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; -export function transformArguments(key: string | Array): TransformArgumentsReply { +export function transformArguments(key: string | Array): RedisCommandArguments { return pushVerdictArguments(['WATCH'], key); } diff --git a/lib/commands/XACK.ts b/lib/commands/XACK.ts index 4573b7f3d25..0d21a0ec085 100644 --- a/lib/commands/XACK.ts +++ b/lib/commands/XACK.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, group: string, id: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, group: string, id: string | Array): RedisCommandArguments { return pushVerdictArguments(['XACK', key, group], id); } diff --git a/lib/commands/XDEL.ts b/lib/commands/XDEL.ts index 187e5b4e73a..892b9a0de5b 100644 --- a/lib/commands/XDEL.ts +++ b/lib/commands/XDEL.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, id: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, id: string | Array): RedisCommandArguments { return pushVerdictArguments(['XDEL', key], id); } diff --git a/lib/commands/ZDIFF.ts b/lib/commands/ZDIFF.ts index 4c5b722131e..a45bf01a526 100644 --- a/lib/commands/ZDIFF.ts +++ b/lib/commands/ZDIFF.ts @@ -1,11 +1,11 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArgument } from './generic-transformers'; export const FIRST_KEY_INDEX = 2; export const IS_READ_ONLY = true; -export function transformArguments(keys: Array | string): TransformArgumentsReply { +export function transformArguments(keys: Array | string): RedisCommandArguments { return pushVerdictArgument(['ZDIFF'], keys); } diff --git a/lib/commands/ZDIFFSTORE.ts b/lib/commands/ZDIFFSTORE.ts index 95c58c66b9e..9c782b8a5ab 100644 --- a/lib/commands/ZDIFFSTORE.ts +++ b/lib/commands/ZDIFFSTORE.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArgument } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(destination: string, keys: Array | string): TransformArgumentsReply { +export function transformArguments(destination: string, keys: Array | string): RedisCommandArguments { return pushVerdictArgument(['ZDIFFSTORE', destination], keys); } diff --git a/lib/commands/ZDIFF_WITHSCORES.ts b/lib/commands/ZDIFF_WITHSCORES.ts index 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 ae1b27a6c8d..eee49837386 100644 --- a/lib/commands/ZINTER.ts +++ b/lib/commands/ZINTER.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArgument } from './generic-transformers'; export const FIRST_KEY_INDEX = 2; @@ -10,7 +10,7 @@ interface ZInterOptions { AGGREGATE?: 'SUM' | 'MIN' | 'MAX'; } -export function transformArguments(keys: Array | string, options?: ZInterOptions): TransformArgumentsReply { +export function transformArguments(keys: Array | string, options?: ZInterOptions): RedisCommandArguments { const args = pushVerdictArgument(['ZINTER'], keys); if (options?.WEIGHTS) { diff --git a/lib/commands/ZINTERSTORE.ts b/lib/commands/ZINTERSTORE.ts index 496729a774e..59a27e11c51 100644 --- a/lib/commands/ZINTERSTORE.ts +++ b/lib/commands/ZINTERSTORE.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArgument } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -8,7 +8,7 @@ interface ZInterStoreOptions { AGGREGATE?: 'SUM' | 'MIN' | 'MAX'; } -export function transformArguments(destination: string, keys: Array | string, options?: ZInterStoreOptions): TransformArgumentsReply { +export function transformArguments(destination: string, keys: Array | string, options?: ZInterStoreOptions): RedisCommandArguments { const args = pushVerdictArgument(['ZINTERSTORE', destination], keys); if (options?.WEIGHTS) { diff --git a/lib/commands/ZINTER_WITHSCORES.ts b/lib/commands/ZINTER_WITHSCORES.ts index 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/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/ZRANGEBYLEX.ts b/lib/commands/ZRANGEBYLEX.ts index 5e4475800c2..7e2e7613b00 100644 --- a/lib/commands/ZRANGEBYLEX.ts +++ b/lib/commands/ZRANGEBYLEX.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { transformArgumentNumberInfinity } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -17,7 +17,7 @@ export function transformArguments( min: number | string, max: number | string, options?: ZRangeByLexOptions -): TransformArgumentsReply { +): RedisCommandArguments { const args = [ 'ZRANGEBYLEX', key, diff --git a/lib/commands/ZRANGEBYSCORE.ts b/lib/commands/ZRANGEBYSCORE.ts index 1932683f955..48dd8a415c6 100644 --- a/lib/commands/ZRANGEBYSCORE.ts +++ b/lib/commands/ZRANGEBYSCORE.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { transformArgumentNumberInfinity } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -17,7 +17,7 @@ export function transformArguments( min: number | string, max: number | string, options?: ZRangeByScoreOptions -): TransformArgumentsReply { +): RedisCommandArguments { const args = [ 'ZRANGEBYSCORE', key, diff --git a/lib/commands/ZRANGEBYSCORE_WITHSCORES.ts b/lib/commands/ZRANGEBYSCORE_WITHSCORES.ts index 050ebf58936..f6f7f993cbc 100644 --- a/lib/commands/ZRANGEBYSCORE_WITHSCORES.ts +++ b/lib/commands/ZRANGEBYSCORE_WITHSCORES.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { transformReplySortedSetWithScores } from './generic-transformers'; import { ZRangeByScoreOptions, transformArguments as transformZRangeByScoreArguments } from './ZRANGEBYSCORE'; @@ -9,7 +9,7 @@ export function transformArguments( min: number | string, max: number | string, options?: ZRangeByScoreOptions -): TransformArgumentsReply { +): RedisCommandArguments { return [ ...transformZRangeByScoreArguments(key, min, max, options), 'WITHSCORES' diff --git a/lib/commands/ZREM.ts b/lib/commands/ZREM.ts index 550a41e8b5c..332289b3fdb 100644 --- a/lib/commands/ZREM.ts +++ b/lib/commands/ZREM.ts @@ -1,9 +1,9 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; -export function transformArguments(key: string, member: string | Array): TransformArgumentsReply { +export function transformArguments(key: string, member: string | Array): RedisCommandArguments { return pushVerdictArguments(['ZREM', key], member); } diff --git a/lib/commands/ZUNION.ts b/lib/commands/ZUNION.ts index 1f0723eb021..2163978470c 100644 --- a/lib/commands/ZUNION.ts +++ b/lib/commands/ZUNION.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArgument } from './generic-transformers'; export const FIRST_KEY_INDEX = 2; @@ -10,7 +10,7 @@ interface ZUnionOptions { AGGREGATE?: 'SUM' | 'MIN' | 'MAX'; } -export function transformArguments(keys: Array | string, options?: ZUnionOptions): TransformArgumentsReply { +export function transformArguments(keys: Array | string, options?: ZUnionOptions): RedisCommandArguments { const args = pushVerdictArgument(['ZUNION'], keys); if (options?.WEIGHTS) { diff --git a/lib/commands/ZUNIONSTORE.ts b/lib/commands/ZUNIONSTORE.ts index d0a92b20a60..406f0430c52 100644 --- a/lib/commands/ZUNIONSTORE.ts +++ b/lib/commands/ZUNIONSTORE.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; import { pushVerdictArgument } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -8,7 +8,7 @@ interface ZUnionOptions { AGGREGATE?: 'SUM' | 'MIN' | 'MAX'; } -export function transformArguments(destination: string, keys: Array | string, options?: ZUnionOptions): TransformArgumentsReply { +export function transformArguments(destination: string, keys: Array | string, options?: ZUnionOptions): RedisCommandArguments { const args = pushVerdictArgument(['ZUNIONSTORE', destination], keys); if (options?.WEIGHTS) { diff --git a/lib/commands/ZUNION_WITHSCORES.ts b/lib/commands/ZUNION_WITHSCORES.ts index 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.ts b/lib/commands/generic-transformers.ts index 98e6750f765..a531e86b432 100644 --- a/lib/commands/generic-transformers.ts +++ b/lib/commands/generic-transformers.ts @@ -1,4 +1,4 @@ -import { TransformArgumentsReply } from '.'; +import { RedisCommandArguments } from '.'; export function transformReplyBoolean(reply: number): boolean { return reply === 1; @@ -308,7 +308,7 @@ export function pushStringTuplesArguments(args: Array, tuples: StringTup return args; } -export function pushVerdictArguments(args: TransformArgumentsReply, value: string | Buffer | Array): TransformArgumentsReply { +export function pushVerdictArguments(args: RedisCommandArguments, value: string | Buffer | Array): RedisCommandArguments { if (Array.isArray(value)) { args.push(...value); } else { @@ -318,7 +318,7 @@ export function pushVerdictArguments(args: TransformArgumentsReply, value: strin return args; } -export function pushVerdictArgument(args: TransformArgumentsReply, value: string | Array): TransformArgumentsReply { +export function pushVerdictArgument(args: RedisCommandArguments, value: string | Array): RedisCommandArguments { if (typeof value === 'string') { args.push('1', value); } else { @@ -328,7 +328,7 @@ export function pushVerdictArgument(args: TransformArgumentsReply, value: string return args; } -export function pushOptionalVerdictArgument(args: TransformArgumentsReply, name: string, value: undefined | string | Array): TransformArgumentsReply { +export function pushOptionalVerdictArgument(args: RedisCommandArguments, name: string, value: undefined | string | Array): RedisCommandArguments { if (value === undefined) return args; args.push(name); diff --git a/lib/commands/index.ts b/lib/commands/index.ts index 014aff9e3a6..f88d777c892 100644 --- a/lib/commands/index.ts +++ b/lib/commands/index.ts @@ -1,778 +1,18 @@ -import * as ACL_CAT from './ACL_CAT'; -import * as ACL_DELUSER from './ACL_DELUSER'; -import * as ACL_GENPASS from './ACL_GENPASS'; -import * as ACL_GETUSER from './ACL_GETUSER'; -import * as ACL_LIST from './ACL_LIST'; -import * as ACL_LOAD from './ACL_LOAD'; -import * as ACL_LOG_RESET from './ACL_LOG_RESET'; -import * as ACL_LOG from './ACL_LOG'; -import * as ACL_SAVE from './ACL_SAVE'; -import * as ACL_SETUSER from './ACL_SETUSER'; -import * as ACL_USERS from './ACL_USERS'; -import * as ACL_WHOAMI from './ACL_WHOAMI'; -import * as APPEND from './APPEND'; -import * as ASKING from './ASKING'; -import * as AUTH from './AUTH'; -import * as BGREWRITEAOF from './BGREWRITEAOF'; -import * as BGSAVE from './BGSAVE'; -import * as BITCOUNT from './BITCOUNT'; -import * as BITFIELD from './BITFIELD'; -import * as BITOP from './BITOP'; -import * as BITPOS from './BITPOS'; -import * as BLMOVE from './BLMOVE'; -import * as BLPOP from './BLPOP'; -import * as BRPOP from './BRPOP'; -import * as BRPOPLPUSH from './BRPOPLPUSH'; -import * as BZPOPMAX from './BZPOPMAX'; -import * as BZPOPMIN from './BZPOPMIN'; -import * as CLIENT_ID from './CLIENT_ID'; -import * as CLIENT_INFO from './CLIENT_INFO'; -import * as CLUSTER_ADDSLOTS from './CLUSTER_ADDSLOTS'; -import * as CLUSTER_FLUSHSLOTS from './CLUSTER_FLUSHSLOTS'; -import * as CLUSTER_INFO from './CLUSTER_INFO'; -import * as CLUSTER_NODES from './CLUSTER_NODES'; -import * as CLUSTER_MEET from './CLUSTER_MEET'; -import * as CLUSTER_RESET from './CLUSTER_RESET'; -import * as CLUSTER_SETSLOT from './CLUSTER_SETSLOT'; -import * as CLUSTER_SLOTS from './CLUSTER_SLOTS'; -import * as COMMAND_COUNT from './COMMAND_COUNT'; -import * as COMMAND_GETKEYS from './COMMAND_GETKEYS'; -import * as COMMAND_INFO from './COMMAND_INFO'; -import * as COMMAND from './COMMAND'; -import * as CONFIG_GET from './CONFIG_GET'; -import * as CONFIG_RESETASTAT from './CONFIG_RESETSTAT'; -import * as CONFIG_REWRITE from './CONFIG_REWRITE'; -import * as CONFIG_SET from './CONFIG_SET'; -import * as COPY from './COPY'; -import * as DBSIZE from './DBSIZE'; -import * as DECR from './DECR'; -import * as DECRBY from './DECRBY'; -import * as DEL from './DEL'; -import * as DISCARD from './DISCARD'; -import * as DUMP from './DUMP'; -import * as ECHO from './ECHO'; -import * as EVAL from './EVAL'; -import * as EVALSHA from './EVALSHA'; -import * as EXISTS from './EXISTS'; -import * as EXPIRE from './EXPIRE'; -import * as EXPIREAT from './EXPIREAT'; -import * as FAILOVER from './FAILOVER'; -import * as FLUSHALL from './FLUSHALL'; -import * as FLUSHDB from './FLUSHDB'; -import * as GEOADD from './GEOADD'; -import * as GEODIST from './GEODIST'; -import * as GEOHASH from './GEOHASH'; -import * as GEOPOS from './GEOPOS'; -import * as GEOSEARCH_WITH from './GEOSEARCH_WITH'; -import * as GEOSEARCH from './GEOSEARCH'; -import * as GEOSEARCHSTORE from './GEOSEARCHSTORE'; -import * as GET_BUFFER from './GET_BUFFER'; -import * as GET from './GET'; -import * as GETBIT from './GETBIT'; -import * as GETDEL from './GETDEL'; -import * as GETEX from './GETEX'; -import * as GETRANGE from './GETRANGE'; -import * as GETSET from './GETSET'; -import * as HDEL from './HDEL'; -import * as HELLO from './HELLO'; -import * as HEXISTS from './HEXISTS'; -import * as HGET from './HGET'; -import * as HGETALL from './HGETALL'; -import * as HINCRBY from './HINCRBY'; -import * as HINCRBYFLOAT from './HINCRBYFLOAT'; -import * as HKEYS from './HKEYS'; -import * as HLEN from './HLEN'; -import * as HMGET from './HMGET'; -import * as HRANDFIELD_COUNT_WITHVALUES from './HRANDFIELD_COUNT_WITHVALUES'; -import * as HRANDFIELD_COUNT from './HRANDFIELD_COUNT'; -import * as HRANDFIELD from './HRANDFIELD'; -import * as HSCAN from './HSCAN'; -import * as HSET from './HSET'; -import * as HSETNX from './HSETNX'; -import * as HSTRLEN from './HSTRLEN'; -import * as HVALS from './HVALS'; -import * as INCR from './INCR'; -import * as INCRBY from './INCRBY'; -import * as INCRBYFLOAT from './INCRBYFLOAT'; -import * as INFO from './INFO'; -import * as KEYS from './KEYS'; -import * as LASTSAVE from './LASTSAVE'; -import * as LINDEX from './LINDEX'; -import * as LINSERT from './LINSERT'; -import * as LLEN from './LLEN'; -import * as LMOVE from './LMOVE'; -import * as LOLWUT from './LOLWUT'; -import * as LPOP_COUNT from './LPOP_COUNT'; -import * as LPOP from './LPOP'; -import * as LPOS_COUNT from './LPOS_COUNT'; -import * as LPOS from './LPOS'; -import * as LPUSH from './LPUSH'; -import * as LPUSHX from './LPUSHX'; -import * as LRANGE from './LRANGE'; -import * as LREM from './LREM'; -import * as LSET from './LSET'; -import * as LTRIM from './LTRIM'; -import * as MEMOERY_DOCTOR from './MEMORY_DOCTOR'; -import * as MEMORY_MALLOC_STATS from './MEMORY_MALLOC-STATS'; -import * as MEMORY_PURGE from './MEMORY_PURGE'; -import * as MEMORY_STATS from './MEMORY_STATS'; -import * as MEMORY_USAGE from './MEMORY_USAGE'; -import * as MGET from './MGET'; -import * as MIGRATE from './MIGRATE'; -import * as MODULE_LIST from './MODULE_LIST'; -import * as MODULE_LOAD from './MODULE_LOAD'; -import * as MODULE_UNLOAD from './MODULE_UNLOAD'; -import * as MOVE from './MOVE'; -import * as MSET from './MSET'; -import * as MSETNX from './MSETNX'; -import * as PERSIST from './PERSIST'; -import * as PEXPIRE from './PEXPIRE'; -import * as PEXPIREAT from './PEXPIREAT'; -import * as PFADD from './PFADD'; -import * as PFCOUNT from './PFCOUNT'; -import * as PFMERGE from './PFMERGE'; -import * as PING from './PING'; -import * as PSETEX from './PSETEX'; -import * as PTTL from './PTTL'; -import * as PUBLISH from './PUBLISH'; -import * as PUBSUB_CHANNELS from './PUBSUB_CHANNELS'; -import * as PUBSUB_NUMPAT from './PUBSUB_NUMPAT'; -import * as PUBSUB_NUMSUB from './PUBSUB_NUMSUB'; -import * as RANDOMKEY from './RANDOMKEY'; -import * as READONLY from './READONLY'; -import * as READWRITE from './READWRITE'; -import * as RENAME from './RENAME'; -import * as RENAMENX from './RENAMENX'; -import * as REPLICAOF from './REPLICAOF'; -import * as RESTORE_ASKING from './RESTORE-ASKING'; -import * as ROLE from './ROLE'; -import * as RPOP_COUNT from './RPOP_COUNT'; -import * as RPOP from './RPOP'; -import * as RPOPLPUSH from './RPOPLPUSH'; -import * as RPUSH from './RPUSH'; -import * as RPUSHX from './RPUSHX'; -import * as SADD from './SADD'; -import * as SAVE from './SAVE'; -import * as SCAN from './SCAN'; -import * as SCARD from './SCARD'; -import * as SCRIPT_DEBUG from './SCRIPT_DEBUG'; -import * as SCRIPT_EXISTS from './SCRIPT_EXISTS'; -import * as SCRIPT_FLUSH from './SCRIPT_FLUSH'; -import * as SCRIPT_KILL from './SCRIPT_KILL'; -import * as SCRIPT_LOAD from './SCRIPT_LOAD'; -import * as SDIFF from './SDIFF'; -import * as SDIFFSTORE from './SDIFFSTORE'; -import * as SET from './SET'; -import * as SETBIT from './SETBIT'; -import * as SETEX from './SETEX'; -import * as SETNX from './SETNX'; -import * as SETRANGE from './SETRANGE'; -import * as SHUTDOWN from './SHUTDOWN'; -import * as SINTER from './SINTER'; -import * as SINTERSTORE from './SINTERSTORE'; -import * as SISMEMBER from './SISMEMBER'; -import * as SMEMBERS from './SMEMBERS'; -import * as SMISMEMBER from './SMISMEMBER'; -import * as SMOVE from './SMOVE'; -import * as SORT from './SORT'; -import * as SPOP from './SPOP'; -import * as SRANDMEMBER_COUNT from './SRANDMEMBER_COUNT'; -import * as SRANDMEMBER from './SRANDMEMBER'; -import * as SREM from './SREM'; -import * as SSCAN from './SSCAN'; -import * as STRLEN from './STRLEN'; -import * as SUNION from './SUNION'; -import * as SUNIONSTORE from './SUNIONSTORE'; -import * as SWAPDB from './SWAPDB'; -import * as TIME from './TIME'; -import * as TOUCH from './TOUCH'; -import * as TTL from './TTL'; -import * as TYPE from './TYPE'; -import * as UNLINK from './UNLINK'; -import * as UNWATCH from './UNWATCH'; -import * as WAIT from './WAIT'; -import * as WATCH from './WATCH'; -import * as XACK from './XACK'; -import * as XADD from './XADD'; -import * as XAUTOCLAIM_JUSTID from './XAUTOCLAIM_JUSTID'; -import * as XAUTOCLAIM from './XAUTOCLAIM'; -import * as XCLAIM from './XCLAIM'; -import * as XCLAIM_JUSTID from './XCLAIM_JUSTID'; -import * as XDEL from './XDEL'; -import * as XGROUP_CREATE from './XGROUP_CREATE'; -import * as XGROUP_CREATECONSUMER from './XGROUP_CREATECONSUMER'; -import * as XGROUP_DELCONSUMER from './XGROUP_DELCONSUMER'; -import * as XGROUP_DESTROY from './XGROUP_DESTROY'; -import * as XGROUP_SETID from './XGROUP_SETID'; -import * as XINFO_CONSUMERS from './XINFO_CONSUMERS'; -import * as XINFO_GROUPS from './XINFO_GROUPS'; -import * as XINFO_STREAM from './XINFO_STREAM'; -import * as XLEN from './XLEN'; -import * as XPENDING_RANGE from './XPENDING_RANGE'; -import * as XPENDING from './XPENDING'; -import * as XRANGE from './XRANGE'; -import * as XREAD from './XREAD'; -import * as XREADGROUP from './XREADGROUP'; -import * as XREVRANGE from './XREVRANGE'; -import * as XTRIM from './XTRIM'; -import * as ZADD from './ZADD'; -import * as ZCARD from './ZCARD'; -import * as ZCOUNT from './ZCOUNT'; -import * as ZDIFF_WITHSCORES from './ZDIFF_WITHSCORES'; -import * as ZDIFF from './ZDIFF'; -import * as ZDIFFSTORE from './ZDIFFSTORE'; -import * as ZINCRBY from './ZINCRBY'; -import * as ZINTER_WITHSCORES from './ZINTER_WITHSCORES'; -import * as ZINTER from './ZINTER'; -import * as ZINTERSTORE from './ZINTERSTORE'; -import * as ZLEXCOUNT from './ZLEXCOUNT'; -import * as ZMSCORE from './ZMSCORE'; -import * as ZPOPMAX_COUNT from './ZPOPMAX_COUNT'; -import * as ZPOPMAX from './ZPOPMAX'; -import * as ZPOPMIN_COUNT from './ZPOPMIN_COUNT'; -import * as ZPOPMIN from './ZPOPMIN'; -import * as ZRANDMEMBER_COUNT_WITHSCORES from './ZRANDMEMBER_COUNT_WITHSCORES'; -import * as ZRANDMEMBER_COUNT from './ZRANDMEMBER_COUNT'; -import * as ZRANDMEMBER from './ZRANDMEMBER'; -import * as ZRANGE_WITHSCORES from './ZRANGE_WITHSCORES'; -import * as ZRANGE from './ZRANGE'; -import * as ZRANGEBYLEX from './ZRANGEBYLEX'; -import * as ZRANGEBYSCORE_WITHSCORES from './ZRANGEBYSCORE_WITHSCORES'; -import * as ZRANGEBYSCORE from './ZRANGEBYSCORE'; -import * as ZRANGESTORE from './ZRANGESTORE'; -import * as ZRANK from './ZRANK'; -import * as ZREM from './ZREM'; -import * as ZREMRANGEBYLEX from './ZREMRANGEBYLEX'; -import * as ZREMRANGEBYRANK from './ZREMRANGEBYRANK'; -import * as ZREMRANGEBYSCORE from './ZREMRANGEBYSCORE'; -import * as ZREVRANK from './ZREVRANK'; -import * as ZSCAN from './ZSCAN'; -import * as ZSCORE from './ZSCORE'; -import * as ZUNION_WITHSCORES from './ZUNION_WITHSCORES'; -import * as ZUNION from './ZUNION'; -import * as ZUNIONSTORE from './ZUNIONSTORE'; +import { RedisScriptConfig, SHA1 } from '../lua-script'; -export default { - ACL_CAT, - aclCat: ACL_CAT, - ACL_DELUSER, - aclDelUser: ACL_DELUSER, - ACL_GENPASS, - aclGenPass: ACL_GENPASS, - ACL_GETUSER, - aclGetUser: ACL_GETUSER, - ACL_LIST, - aclList: ACL_LIST, - ACL_LOAD, - aclLoad: ACL_LOAD, - ACL_LOG_RESET, - aclLogReset: ACL_LOG_RESET, - ACL_LOG, - aclLog: ACL_LOG, - ACL_SAVE, - aclSave: ACL_SAVE, - ACL_SETUSER, - aclSetUser: ACL_SETUSER, - ACL_USERS, - aclUsers: ACL_USERS, - ACL_WHOAMI, - aclWhoAmI: ACL_WHOAMI, - APPEND, - append: APPEND, - ASKING, - asking: ASKING, - AUTH, - auth: AUTH, - BGREWRITEAOF, - bgRewriteAof: BGREWRITEAOF, - BGSAVE, - bgSave: BGSAVE, - BITCOUNT, - bitCount: BITCOUNT, - BITFIELD, - bitField: BITFIELD, - BITOP, - bitOp: BITOP, - BITPOS, - bitPos: BITPOS, - BLMOVE, - blMove: BLMOVE, - BLPOP, - blPop: BLPOP, - BRPOP, - brPop: BRPOP, - BRPOPLPUSH, - brPopLPush: BRPOPLPUSH, - BZPOPMAX, - bzPopMax: BZPOPMAX, - BZPOPMIN, - bzPopMin: BZPOPMIN, - CLIENT_ID, - clientId: CLIENT_ID, - CLIENT_INFO, - clientInfo: CLIENT_INFO, - CLUSTER_ADDSLOTS, - clusterAddSlots: CLUSTER_ADDSLOTS, - CLUSTER_FLUSHSLOTS, - clusterFlushSlots: CLUSTER_FLUSHSLOTS, - CLUSTER_INFO, - clusterInfo: CLUSTER_INFO, - CLUSTER_NODES, - clusterNodes: CLUSTER_NODES, - CLUSTER_MEET, - clusterMeet: CLUSTER_MEET, - CLUSTER_RESET, - clusterReset: CLUSTER_RESET, - CLUSTER_SETSLOT, - clusterSetSlot: CLUSTER_SETSLOT, - CLUSTER_SLOTS, - clusterSlots: CLUSTER_SLOTS, - COMMAND_COUNT, - commandCount: COMMAND_COUNT, - COMMAND_GETKEYS, - commandGetKeys: COMMAND_GETKEYS, - COMMAND_INFO, - commandInfo: COMMAND_INFO, - COMMAND, - command: COMMAND, - CONFIG_GET, - configGet: CONFIG_GET, - CONFIG_RESETASTAT, - configResetStat: CONFIG_RESETASTAT, - CONFIG_REWRITE, - configRewrite: CONFIG_REWRITE, - CONFIG_SET, - configSet: CONFIG_SET, - COPY, - copy: COPY, - DBSIZE, - dbSize: DBSIZE, - DECR, - decr: DECR, - DECRBY, - decrBy: DECRBY, - DEL, - del: DEL, - DISCARD, - discard: DISCARD, - DUMP, - dump: DUMP, - ECHO, - echo: ECHO, - EVAL, - eval: EVAL, - EVALSHA, - evalSha: EVALSHA, - EXISTS, - exists: EXISTS, - EXPIRE, - expire: EXPIRE, - EXPIREAT, - expireAt: EXPIREAT, - FAILOVER, - failover: FAILOVER, - FLUSHALL, - flushAll: FLUSHALL, - FLUSHDB, - flushDb: FLUSHDB, - GEOADD, - geoAdd: GEOADD, - GEODIST, - geoDist: GEODIST, - GEOHASH, - geoHash: GEOHASH, - GEOPOS, - geoPos: GEOPOS, - GEOSEARCH_WITH, - geoSearchWith: GEOSEARCH_WITH, - GEOSEARCH, - geoSearch: GEOSEARCH, - GEOSEARCHSTORE, - geoSearchStore: GEOSEARCHSTORE, - GET_BUFFER, - getBuffer: GET_BUFFER, - GET, - get: GET, - GETBIT, - getBit: GETBIT, - GETDEL, - getDel: GETDEL, - GETEX, - getEx: GETEX, - GETRANGE, - getRange: GETRANGE, - GETSET, - getSet: GETSET, - HDEL, - hDel: HDEL, - HELLO, - hello: HELLO, - HEXISTS, - hExists: HEXISTS, - HGET, - hGet: HGET, - HGETALL, - hGetAll: HGETALL, - HINCRBY, - hIncrBy: HINCRBY, - HINCRBYFLOAT, - hIncrByFloat: HINCRBYFLOAT, - HKEYS, - hKeys: HKEYS, - HLEN, - hLen: HLEN, - HMGET, - hmGet: HMGET, - HRANDFIELD_COUNT_WITHVALUES, - hRandFieldCountWithValues: HRANDFIELD_COUNT_WITHVALUES, - HRANDFIELD_COUNT, - hRandFieldCount: HRANDFIELD_COUNT, - HRANDFIELD, - hRandField: HRANDFIELD, - HSCAN, - hScan: HSCAN, - HSET, - hSet: HSET, - HSETNX, - hSetNX: HSETNX, - HSTRLEN, - hStrLen: HSTRLEN, - HVALS, - hVals: HVALS, - INCR, - incr: INCR, - INCRBY, - incrBy: INCRBY, - INCRBYFLOAT, - incrByFloat: INCRBYFLOAT, - INFO, - info: INFO, - KEYS, - keys: KEYS, - LASTSAVE, - lastSave: LASTSAVE, - LINDEX, - lIndex: LINDEX, - LINSERT, - lInsert: LINSERT, - LLEN, - lLen: LLEN, - LMOVE, - lMove: LMOVE, - LOLWUT, - LPOP_COUNT, - lPopCount: LPOP_COUNT, - LPOP, - lPop: LPOP, - LPOS_COUNT, - lPosCount: LPOS_COUNT, - LPOS, - lPos: LPOS, - LPUSH, - lPush: LPUSH, - LPUSHX, - lPushX: LPUSHX, - LRANGE, - lRange: LRANGE, - LREM, - lRem: LREM, - LSET, - lSet: LSET, - LTRIM, - lTrim: LTRIM, - MEMOERY_DOCTOR, - memoryDoctor: MEMOERY_DOCTOR, - 'MEMORY_MALLOC-STATS': MEMORY_MALLOC_STATS, - memoryMallocStats: MEMORY_MALLOC_STATS, - MEMORY_PURGE, - memoryPurge: MEMORY_PURGE, - MEMORY_STATS, - memoryStats: MEMORY_STATS, - MEMORY_USAGE, - memoryUsage: MEMORY_USAGE, - MGET, - mGet: MGET, - MIGRATE, - migrate: MIGRATE, - MODULE_LIST, - moduleList: MODULE_LIST, - MODULE_LOAD, - moduleLoad: MODULE_LOAD, - MODULE_UNLOAD, - moduleUnload: MODULE_UNLOAD, - MOVE, - move: MOVE, - MSET, - mSet: MSET, - MSETNX, - mSetNX: MSETNX, - PERSIST, - persist: PERSIST, - PEXPIRE, - pExpire: PEXPIRE, - PEXPIREAT, - pExpireAt: PEXPIREAT, - PFADD, - pfAdd: PFADD, - PFCOUNT, - pfCount: PFCOUNT, - PFMERGE, - pfMerge: PFMERGE, - PING, - ping: PING, - PSETEX, - pSetEx: PSETEX, - PTTL, - pTTL: PTTL, - PUBLISH, - publish: PUBLISH, - PUBSUB_CHANNELS, - pubSubChannels: PUBSUB_CHANNELS, - PUBSUB_NUMPAT, - pubSubNumPat: PUBSUB_NUMPAT, - PUBSUB_NUMSUB, - pubSubNumSub: PUBSUB_NUMSUB, - RANDOMKEY, - randomKey: RANDOMKEY, - READONLY, - readonly: READONLY, - READWRITE, - readwrite: READWRITE, - RENAME, - rename: RENAME, - RENAMENX, - renameNX: RENAMENX, - REPLICAOF, - replicaOf: REPLICAOF, - 'RESTORE-ASKING': RESTORE_ASKING, - restoreAsking: RESTORE_ASKING, - ROLE, - role: ROLE, - RPOP_COUNT, - rPopCount: RPOP_COUNT, - RPOP, - rPop: RPOP, - RPOPLPUSH, - rPopLPush: RPOPLPUSH, - RPUSH, - rPush: RPUSH, - RPUSHX, - rPushX: RPUSHX, - SADD, - sAdd: SADD, - SAVE, - save: SAVE, - SCAN, - scan: SCAN, - SCARD, - sCard: SCARD, - SCRIPT_DEBUG, - scriptDebug: SCRIPT_DEBUG, - SCRIPT_EXISTS, - scriptExists: SCRIPT_EXISTS, - SCRIPT_FLUSH, - scriptFlush: SCRIPT_FLUSH, - SCRIPT_KILL, - scriptKill: SCRIPT_KILL, - SCRIPT_LOAD, - scriptLoad: SCRIPT_LOAD, - SDIFF, - sDiff: SDIFF, - SDIFFSTORE, - sDiffStore: SDIFFSTORE, - SINTER, - sInter: SINTER, - SINTERSTORE, - sInterStore: SINTERSTORE, - SET, - set: SET, - SETBIT, - setBit: SETBIT, - SETEX, - setEx: SETEX, - SETNX, - setNX: SETNX, - SETRANGE, - setRange: SETRANGE, - SHUTDOWN, - shutdown: SHUTDOWN, - SISMEMBER, - sIsMember: SISMEMBER, - SMEMBERS, - sMembers: SMEMBERS, - SMISMEMBER, - smIsMember: SMISMEMBER, - SMOVE, - sMove: SMOVE, - SORT, - sort: SORT, - SPOP, - sPop: SPOP, - SRANDMEMBER_COUNT, - sRandMemberCount: SRANDMEMBER_COUNT, - SRANDMEMBER, - sRandMember: SRANDMEMBER, - SREM, - sRem: SREM, - SSCAN, - sScan: SSCAN, - STRLEN, - strLen: STRLEN, - SUNION, - sUnion: SUNION, - SUNIONSTORE, - sUnionStore: SUNIONSTORE, - SWAPDB, - swapDb: SWAPDB, - TIME, - time: TIME, - TOUCH, - touch: TOUCH, - TTL, - ttl: TTL, - TYPE, - type: TYPE, - UNLINK, - unlink: UNLINK, - UNWATCH, - unwatch: UNWATCH, - WAIT, - wait: WAIT, - WATCH, - watch: WATCH, - XACK, - xAck: XACK, - XADD, - xAdd: XADD, - XAUTOCLAIM_JUSTID, - xAutoClaimJustId: XAUTOCLAIM_JUSTID, - XAUTOCLAIM, - xAutoClaim: XAUTOCLAIM, - XCLAIM, - xClaim: XCLAIM, - XCLAIM_JUSTID, - xClaimJustId: XCLAIM_JUSTID, - XDEL, - xDel: XDEL, - XGROUP_CREATE, - xGroupCreate: XGROUP_CREATE, - XGROUP_CREATECONSUMER, - xGroupCreateConsumer: XGROUP_CREATECONSUMER, - XGROUP_DELCONSUMER, - xGroupDelConsumer: XGROUP_DELCONSUMER, - XGROUP_DESTROY, - xGroupDestroy: XGROUP_DESTROY, - XGROUP_SETID, - xGroupSetId: XGROUP_SETID, - XINFO_CONSUMERS, - xInfoConsumers: XINFO_CONSUMERS, - XINFO_GROUPS, - xInfoGroups: XINFO_GROUPS, - XINFO_STREAM, - xInfoStream: XINFO_STREAM, - XLEN, - xLen: XLEN, - XPENDING_RANGE, - xPendingRange: XPENDING_RANGE, - XPENDING, - xPending: XPENDING, - XRANGE, - xRange: XRANGE, - XREAD, - xRead: XREAD, - XREADGROUP, - xReadGroup: XREADGROUP, - XREVRANGE, - xRevRange: XREVRANGE, - XTRIM, - xTrim: XTRIM, - ZADD, - zAdd: ZADD, - ZCARD, - zCard: ZCARD, - ZCOUNT, - zCount: ZCOUNT, - ZDIFF_WITHSCORES, - zDiffWithScores: ZDIFF_WITHSCORES, - ZDIFF, - zDiff: ZDIFF, - ZDIFFSTORE, - zDiffStore: ZDIFFSTORE, - ZINCRBY, - zIncrBy: ZINCRBY, - ZINTER_WITHSCORES, - zInterWithScores: ZINTER_WITHSCORES, - ZINTER, - zInter: ZINTER, - ZINTERSTORE, - zInterStore: ZINTERSTORE, - ZLEXCOUNT, - zLexCount: ZLEXCOUNT, - ZMSCORE, - zmScore: ZMSCORE, - ZPOPMAX_COUNT, - zPopMaxCount: ZPOPMAX_COUNT, - ZPOPMAX, - zPopMax: ZPOPMAX, - ZPOPMIN_COUNT, - zPopMinCount: ZPOPMIN_COUNT, - ZPOPMIN, - zPopMin: ZPOPMIN, - ZRANDMEMBER_COUNT_WITHSCORES, - zRandMemberCountWithScores: ZRANDMEMBER_COUNT_WITHSCORES, - ZRANDMEMBER_COUNT, - zRandMemberCount: ZRANDMEMBER_COUNT, - ZRANDMEMBER, - zRandMember: ZRANDMEMBER, - ZRANGE_WITHSCORES, - zRangeWithScores: ZRANGE_WITHSCORES, - ZRANGE, - zRange: ZRANGE, - ZRANGEBYLEX, - zRangeByLex: ZRANGEBYLEX, - ZRANGEBYSCORE_WITHSCORES, - zRangeByScoreWithScores: ZRANGEBYSCORE_WITHSCORES, - ZRANGEBYSCORE, - zRangeByScore: ZRANGEBYSCORE, - ZRANGESTORE, - zRangeStore: ZRANGESTORE, - ZRANK, - zRank: ZRANK, - ZREM, - zRem: ZREM, - ZREMRANGEBYLEX, - zRemRangeByLex: ZREMRANGEBYLEX, - ZREMRANGEBYRANK, - zRemRangeByRank: ZREMRANGEBYRANK, - ZREMRANGEBYSCORE, - zRemRangeByScore: ZREMRANGEBYSCORE, - ZREVRANK, - zRevRank: ZREVRANK, - ZSCAN, - zScan: ZSCAN, - ZSCORE, - zScore: ZSCORE, - ZUNION_WITHSCORES, - zUnionWithScores: ZUNION_WITHSCORES, - ZUNION, - zUnion: ZUNION, - ZUNIONSTORE, - zUnionStore: ZUNIONSTORE -}; +export type RedisCommandRawReply = string | number | Buffer | Array | null | undefined; -export type RedisReply = string | number | Buffer | Array | null | undefined; - -export type TransformArgumentsReply = Array & { preserve?: unknown }; +export type RedisCommandArguments = Array & { preserve?: unknown }; export interface RedisCommand { FIRST_KEY_INDEX?: number | ((...args: Array) => string); IS_READ_ONLY?: boolean; - transformArguments(this: void, ...args: Array): TransformArgumentsReply; + transformArguments(this: void, ...args: Array): RedisCommandArguments; BUFFER_MODE?: boolean; - transformReply?(this: void, reply: RedisReply, preserved?: unknown): any; + transformReply?(this: void, reply: RedisCommandRawReply, preserved?: unknown): any; } -export type RedisCommandReply = C['transformReply'] extends (...args: any) => infer T ? T : RedisReply; +export type RedisCommandReply = C['transformReply'] extends (...args: any) => infer T ? T : RedisCommandRawReply; export interface RedisCommands { [command: string]: RedisCommand; @@ -785,4 +25,14 @@ export interface RedisModule { export interface RedisModules { [module: string]: RedisModule; } -// export type RedisModules = Record; + +export type RedisScript = RedisScriptConfig & SHA1; + +export interface RedisScripts { + [script: string]: RedisScript; +} + +export interface RedisPlugins { + modules?: M; + scripts?: S; +} diff --git a/lib/lua-script.ts b/lib/lua-script.ts index 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 bc3c0514606..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, { RedisClusterOptions, RedisClusterType } from './cluster'; import { promises as fs } from 'fs'; import { Context as MochaContext } from 'mocha'; import { promiseTimeout } from './utils'; -import { RedisModules } from './commands'; -import { RedisLuaScripts } from './lua-script'; +import { RedisModules, RedisScripts } from './commands'; type RedisVersion = [major: number, minor: number, patch: number]; @@ -54,13 +52,13 @@ export enum TestRedisServers { PASSWORD } -export const TEST_REDIS_SERVERS: Record> = {}; +export const TEST_REDIS_SERVERS: Record> = {}; export enum TestRedisClusters { OPEN } -export const TEST_REDIS_CLUSTERES: Record> = {}; +export const TEST_REDIS_CLUSTERES: Record> = {}; let port = 6379; diff --git a/package-lock.json b/package-lock.json index bb840cc6dde..6a7fa380af7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,20 +16,21 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@tsconfig/node12": "^1.0.9", "@types/mocha": "^9.0.0", - "@types/node": "^16.9.6", - "@types/sinon": "^10.0.3", + "@types/node": "^16.10.3", + "@types/sinon": "^10.0.4", "@types/which": "^2.0.1", "@types/yallist": "^4.0.1", - "mocha": "^9.1.1", + "mocha": "^9.1.2", "nyc": "^15.1.0", "release-it": "^14.11.6", "sinon": "^11.1.2", "source-map-support": "^0.5.20", - "ts-node": "^10.2.1", - "typedoc": "0.21.9", - "typedoc-github-wiki-theme": "^0.5.1", - "typedoc-plugin-markdown": "3.10.4", + "ts-node": "^10.3.0", + "typedoc": "^0.22.5", + "typedoc-github-wiki-theme": "^0.6.0", + "typedoc-plugin-markdown": "^3.11.3", "typescript": "^4.4.3", "which": "^2.0.2" }, @@ -38,9 +39,9 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", "dev": true, "dependencies": { "@babel/highlight": "^7.14.5" @@ -59,20 +60,20 @@ } }, "node_modules/@babel/core": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", - "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", + "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", + "@babel/code-frame": "^7.15.8", + "@babel/generator": "^7.15.8", "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.8", "@babel/helpers": "^7.15.4", - "@babel/parser": "^7.15.5", + "@babel/parser": "^7.15.8", "@babel/template": "^7.15.4", "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4", + "@babel/types": "^7.15.6", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -89,12 +90,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", - "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", + "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", "dev": true, "dependencies": { - "@babel/types": "^7.15.4", + "@babel/types": "^7.15.6", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -183,9 +184,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz", - "integrity": "sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", + "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.15.4", @@ -370,9 +371,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz", - "integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -438,9 +439,9 @@ } }, "node_modules/@cspotcode/source-map-support": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz", - "integrity": "sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", "dev": true, "dependencies": { "@cspotcode/source-map-consumer": "0.8.0" @@ -653,18 +654,18 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "10.6.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-10.6.1.tgz", - "integrity": "sha512-53YKy8w8+sHQhUONhTiYt6MqNqPolejYr6rK/3VOevpORAIYGQEX2pmXnnhgdSsjHy176e5ZBgVt0ppOGziS7g==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz", + "integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA==", "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "2.16.5", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.16.5.tgz", - "integrity": "sha512-2PfRGymdBypqRes4Xelu0BAZZRCV/Qg0xgo8UB10UKoghCM+zg640+T5WkRsRD0edwfLBPP3VsJgDyDTG4EIYg==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz", + "integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==", "dev": true, "dependencies": { - "@octokit/types": "^6.31.0" + "@octokit/types": "^6.34.0" }, "peerDependencies": { "@octokit/core": ">=2" @@ -680,12 +681,12 @@ } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "5.11.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.11.3.tgz", - "integrity": "sha512-E19gqHqfP3uJa2/hx6Abhx2NrVP5tsNbst2/AeqGxlGM+eL4N8fRbzhd+NEIsGAB4y3R7e9kVE0y8OOghlXUXw==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz", + "integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==", "dev": true, "dependencies": { - "@octokit/types": "^6.31.1", + "@octokit/types": "^6.34.0", "deprecation": "^2.3.1" }, "peerDependencies": { @@ -693,9 +694,9 @@ } }, "node_modules/@octokit/request": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.1.tgz", - "integrity": "sha512-Ls2cfs1OfXaOKzkcxnqw5MR6drMA/zWX/LIS/p8Yjdz7QKTPQLMsB3R+OvoxE6XnXeXEE2X7xe4G4l4X0gRiKQ==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.2.tgz", + "integrity": "sha512-je66CvSEVf0jCpRISxkUcCa0UkxmFs6eGDRSbfJtAVwbLH5ceqF+YEyC8lj8ystKyZTy8adWr0qmkY52EfOeLA==", "dev": true, "dependencies": { "@octokit/endpoint": "^6.0.1", @@ -730,12 +731,12 @@ } }, "node_modules/@octokit/types": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.31.1.tgz", - "integrity": "sha512-xkF46eaYcpT8ieO78mZWhMq3bt37zIsP5BUkN+zWgX+mTYDB7jOtUP1MOxcSF8hhJhsjjlB1YDgQAhX0z0oqPw==", + "version": "6.34.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz", + "integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^10.6.1" + "@octokit/openapi-types": "^11.2.0" } }, "node_modules/@sindresorhus/is": { @@ -855,9 +856,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.2.tgz", - "integrity": "sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ==", + "version": "16.10.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.3.tgz", + "integrity": "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ==", "dev": true }, "node_modules/@types/parse-json": { @@ -1199,16 +1200,16 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.1.tgz", - "integrity": "sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", + "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", "dev": true, "dependencies": { - "caniuse-lite": "^1.0.30001259", - "electron-to-chromium": "^1.3.846", + "caniuse-lite": "^1.0.30001264", + "electron-to-chromium": "^1.3.857", "escalade": "^3.1.1", - "nanocolors": "^0.1.5", - "node-releases": "^1.1.76" + "node-releases": "^1.1.77", + "picocolors": "^0.2.1" }, "bin": { "browserslist": "cli.js" @@ -1340,9 +1341,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001261", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001261.tgz", - "integrity": "sha512-vM8D9Uvp7bHIN0fZ2KQ4wnmYFpJo/Etb4Vwsuc+ka0tfGDHvOPrFm6S/7CCNLSOkAUjenT2HnUPESdOIL91FaA==", + "version": "1.0.30001265", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", + "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", "dev": true, "funding": { "type": "opencollective", @@ -1444,9 +1445,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", - "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "dev": true, "engines": { "node": ">=6" @@ -1789,9 +1790,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.3.854", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.854.tgz", - "integrity": "sha512-00/IIC1mFPkq32MhUJyLdcTp7+wsKK2G3Sb65GSas9FKJQGYkDcZ4GwJkkxf5YyM3ETvl6n+toV8OmtXl4IA/g==", + "version": "1.3.864", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.864.tgz", + "integrity": "sha512-v4rbad8GO6/yVI92WOeU9Wgxc4NA0n4f6P1FvZTY+jyY7JHEhw3bduYu60v3Q1h81Cg6eo4ApZrFPuycwd5hGw==", "dev": true }, "node_modules/emoji-regex": { @@ -2840,9 +2841,9 @@ "dev": true }, "node_modules/istanbul-lib-coverage": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz", - "integrity": "sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", "dev": true, "engines": { "node": ">=8" @@ -2943,9 +2944,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.3.tgz", + "integrity": "sha512-0i77ZFLsb9U3DHi22WzmIngVzfoyxxbQcZRqlF3KoKmCJGq9nhFHoGi8FqBztN2rE8w6hURnZghetn0xpkVb6A==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -3164,9 +3165,9 @@ "dev": true }, "node_modules/marked": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.4.tgz", - "integrity": "sha512-jBo8AOayNaEcvBhNobg6/BLhdsK3NvnKWJg33MAAPbvTWiG4QBn9gpW1+7RssrKu4K1dKlN+0goVQwV41xEfOA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.7.tgz", + "integrity": "sha512-ctKqbnLuNbsHbI26cfMyOlKgXGfl1orOv1AvWWDX7AkgfMOwCWvmuYc+mVLeWhQ9W6hdWVBynOs96VkcscKo0Q==", "dev": true, "bin": { "marked": "bin/marked" @@ -3315,12 +3316,6 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "node_modules/nanocolors": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.1.12.tgz", - "integrity": "sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==", - "dev": true - }, "node_modules/nanoid": { "version": "3.1.25", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", @@ -3398,9 +3393,9 @@ } }, "node_modules/node-releases": { - "version": "1.1.76", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz", - "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==", + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", "dev": true }, "node_modules/normalize-path": { @@ -4062,6 +4057,12 @@ "node": ">=8" } }, + "node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "node_modules/picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -4159,15 +4160,6 @@ "node": ">=8" } }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/protocols": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", @@ -4613,9 +4605,9 @@ } }, "node_modules/rxjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.3.0.tgz", - "integrity": "sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", "dev": true, "dependencies": { "tslib": "~2.1.0" @@ -5015,12 +5007,12 @@ "dev": true }, "node_modules/ts-node": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz", - "integrity": "sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.3.0.tgz", + "integrity": "sha512-RYIy3i8IgpFH45AX4fQHExrT8BxDeKTdC83QFJkNzkvt8uFB6QJ8XMyhynYiKMLxt9a7yuXaDBZNOYS3XjDcYw==", "dev": true, "dependencies": { - "@cspotcode/source-map-support": "0.6.1", + "@cspotcode/source-map-support": "0.7.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", @@ -5040,9 +5032,6 @@ "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" }, - "engines": { - "node": ">=12.0.0" - }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", @@ -5101,19 +5090,16 @@ } }, "node_modules/typedoc": { - "version": "0.21.9", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.21.9.tgz", - "integrity": "sha512-VRo7aII4bnYaBBM1lhw4bQFmUcDQV8m8tqgjtc7oXl87jc1Slbhfw2X5MccfcR2YnEClHDWgsiQGgNB8KJXocA==", + "version": "0.22.5", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.5.tgz", + "integrity": "sha512-KFrWGU1iKiTGw0RcyjLNYDmhd7uICU14HgBNPmFKY/sT4Pm/fraaLyWyisst9vGTUAKxqibqoDITR7+ZcAkhHg==", "dev": true, "dependencies": { - "glob": "^7.1.7", - "handlebars": "^4.7.7", + "glob": "^7.2.0", "lunr": "^2.3.9", - "marked": "^3.0.2", - "minimatch": "^3.0.0", - "progress": "^2.0.3", - "shiki": "^0.9.8", - "typedoc-default-themes": "^0.12.10" + "marked": "^3.0.4", + "minimatch": "^3.0.4", + "shiki": "^0.9.11" }, "bin": { "typedoc": "bin/typedoc" @@ -5125,35 +5111,46 @@ "typescript": "4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x" } }, - "node_modules/typedoc-default-themes": { - "version": "0.12.10", - "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.10.tgz", - "integrity": "sha512-fIS001cAYHkyQPidWXmHuhs8usjP5XVJjWB8oZGqkTowZaz3v7g3KDZeeqE82FBrmkAnIBOY3jgy7lnPnqATbA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/typedoc-github-wiki-theme": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/typedoc-github-wiki-theme/-/typedoc-github-wiki-theme-0.5.1.tgz", - "integrity": "sha512-ED2Uc3WUjbv6xIdCkpMz3yBtcEciJnAhDQdRWLYgw4K+FKY0T3PzbI+ssNsBVgwDnYQP/XuaqfZkeQ3EQsOm9g==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/typedoc-github-wiki-theme/-/typedoc-github-wiki-theme-0.6.0.tgz", + "integrity": "sha512-uHhR7PwAZ4JgO0KzlLocWSvMqKsSZ/wxUQYGKskIepzsotPAQcAWnSSnGi6gdkSw8UAfIIppdD7H1AmI39962w==", "dev": true, "peerDependencies": { - "typedoc": ">=0.20.0", - "typedoc-plugin-markdown": ">=3.4.0" + "typedoc": ">=0.22.0", + "typedoc-plugin-markdown": ">=3.11.0" } }, "node_modules/typedoc-plugin-markdown": { - "version": "3.10.4", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.10.4.tgz", - "integrity": "sha512-if9w7S9fXLg73AYi/EoRSEhTOZlg3I8mIP8YEmvzSE33VrNXC9/hA0nVcLEwFVJeQY7ay6z67I6kW0KIv7LjeA==", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.11.3.tgz", + "integrity": "sha512-rWiHbEIe0oZetDIsBR24XJVxGOJ91kDcHoj2KhFKxCLoJGX659EKBQkHne9QJ4W2stGhu1fRgFyQaouSBnxukA==", "dev": true, "dependencies": { "handlebars": "^4.7.7" }, "peerDependencies": { - "typedoc": ">=0.21.2" + "typedoc": ">=0.22.0" + } + }, + "node_modules/typedoc/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/typescript": { @@ -5602,9 +5599,9 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", "dev": true, "requires": { "@babel/highlight": "^7.14.5" @@ -5617,20 +5614,20 @@ "dev": true }, "@babel/core": { - "version": "7.15.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.5.tgz", - "integrity": "sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", + "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", "dev": true, "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", + "@babel/code-frame": "^7.15.8", + "@babel/generator": "^7.15.8", "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.8", "@babel/helpers": "^7.15.4", - "@babel/parser": "^7.15.5", + "@babel/parser": "^7.15.8", "@babel/template": "^7.15.4", "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4", + "@babel/types": "^7.15.6", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -5640,12 +5637,12 @@ } }, "@babel/generator": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz", - "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", + "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", "dev": true, "requires": { - "@babel/types": "^7.15.4", + "@babel/types": "^7.15.6", "jsesc": "^2.5.1", "source-map": "^0.5.0" } @@ -5710,9 +5707,9 @@ } }, "@babel/helper-module-transforms": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.7.tgz", - "integrity": "sha512-ZNqjjQG/AuFfekFTY+7nY4RgBSklgTu970c7Rj3m/JOhIu5KPBUuTA9AY6zaKcUvk4g6EbDXdBnhi35FAssdSw==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", + "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.15.4", @@ -5857,9 +5854,9 @@ } }, "@babel/parser": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.7.tgz", - "integrity": "sha512-rycZXvQ+xS9QyIcJ9HXeDWf1uxqlbVFAUq0Rq0dbc50Zb/+wUe/ehyfzGfm9KZZF0kBejYgxltBXocP+gKdL2g==", + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", "dev": true }, "@babel/template": { @@ -5907,9 +5904,9 @@ "dev": true }, "@cspotcode/source-map-support": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.6.1.tgz", - "integrity": "sha512-DX3Z+T5dt1ockmPdobJS/FAsQPW4V4SrWEhD2iYQT2Cb2tQsiMnYxrcUH9By/Z3B+v0S5LMBkQtV/XOBbpLEOg==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", "dev": true, "requires": { "@cspotcode/source-map-consumer": "0.8.0" @@ -6080,18 +6077,18 @@ } }, "@octokit/openapi-types": { - "version": "10.6.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-10.6.1.tgz", - "integrity": "sha512-53YKy8w8+sHQhUONhTiYt6MqNqPolejYr6rK/3VOevpORAIYGQEX2pmXnnhgdSsjHy176e5ZBgVt0ppOGziS7g==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz", + "integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA==", "dev": true }, "@octokit/plugin-paginate-rest": { - "version": "2.16.5", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.16.5.tgz", - "integrity": "sha512-2PfRGymdBypqRes4Xelu0BAZZRCV/Qg0xgo8UB10UKoghCM+zg640+T5WkRsRD0edwfLBPP3VsJgDyDTG4EIYg==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz", + "integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==", "dev": true, "requires": { - "@octokit/types": "^6.31.0" + "@octokit/types": "^6.34.0" } }, "@octokit/plugin-request-log": { @@ -6102,19 +6099,19 @@ "requires": {} }, "@octokit/plugin-rest-endpoint-methods": { - "version": "5.11.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.11.3.tgz", - "integrity": "sha512-E19gqHqfP3uJa2/hx6Abhx2NrVP5tsNbst2/AeqGxlGM+eL4N8fRbzhd+NEIsGAB4y3R7e9kVE0y8OOghlXUXw==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz", + "integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==", "dev": true, "requires": { - "@octokit/types": "^6.31.1", + "@octokit/types": "^6.34.0", "deprecation": "^2.3.1" } }, "@octokit/request": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.1.tgz", - "integrity": "sha512-Ls2cfs1OfXaOKzkcxnqw5MR6drMA/zWX/LIS/p8Yjdz7QKTPQLMsB3R+OvoxE6XnXeXEE2X7xe4G4l4X0gRiKQ==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.2.tgz", + "integrity": "sha512-je66CvSEVf0jCpRISxkUcCa0UkxmFs6eGDRSbfJtAVwbLH5ceqF+YEyC8lj8ystKyZTy8adWr0qmkY52EfOeLA==", "dev": true, "requires": { "@octokit/endpoint": "^6.0.1", @@ -6149,12 +6146,12 @@ } }, "@octokit/types": { - "version": "6.31.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.31.1.tgz", - "integrity": "sha512-xkF46eaYcpT8ieO78mZWhMq3bt37zIsP5BUkN+zWgX+mTYDB7jOtUP1MOxcSF8hhJhsjjlB1YDgQAhX0z0oqPw==", + "version": "6.34.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz", + "integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==", "dev": true, "requires": { - "@octokit/openapi-types": "^10.6.1" + "@octokit/openapi-types": "^11.2.0" } }, "@sindresorhus/is": { @@ -6265,9 +6262,9 @@ "dev": true }, "@types/node": { - "version": "16.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.2.tgz", - "integrity": "sha512-zCclL4/rx+W5SQTzFs9wyvvyCwoK9QtBpratqz2IYJ3O8Umrn0m3nsTv0wQBk9sRGpvUe9CwPDrQFB10f1FIjQ==", + "version": "16.10.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.3.tgz", + "integrity": "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ==", "dev": true }, "@types/parse-json": { @@ -6530,16 +6527,16 @@ "dev": true }, "browserslist": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.1.tgz", - "integrity": "sha512-aLD0ZMDSnF4lUt4ZDNgqi5BUn9BZ7YdQdI/cYlILrhdSSZJLU9aNZoD5/NBmM4SK34APB2e83MOsRt1EnkuyaQ==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", + "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001259", - "electron-to-chromium": "^1.3.846", + "caniuse-lite": "^1.0.30001264", + "electron-to-chromium": "^1.3.857", "escalade": "^3.1.1", - "nanocolors": "^0.1.5", - "node-releases": "^1.1.76" + "node-releases": "^1.1.77", + "picocolors": "^0.2.1" } }, "buffer": { @@ -6625,9 +6622,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001261", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001261.tgz", - "integrity": "sha512-vM8D9Uvp7bHIN0fZ2KQ4wnmYFpJo/Etb4Vwsuc+ka0tfGDHvOPrFm6S/7CCNLSOkAUjenT2HnUPESdOIL91FaA==", + "version": "1.0.30001265", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", + "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", "dev": true }, "chalk": { @@ -6701,9 +6698,9 @@ } }, "cli-spinners": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", - "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "dev": true }, "cli-width": { @@ -6967,9 +6964,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.854", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.854.tgz", - "integrity": "sha512-00/IIC1mFPkq32MhUJyLdcTp7+wsKK2G3Sb65GSas9FKJQGYkDcZ4GwJkkxf5YyM3ETvl6n+toV8OmtXl4IA/g==", + "version": "1.3.864", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.864.tgz", + "integrity": "sha512-v4rbad8GO6/yVI92WOeU9Wgxc4NA0n4f6P1FvZTY+jyY7JHEhw3bduYu60v3Q1h81Cg6eo4ApZrFPuycwd5hGw==", "dev": true }, "emoji-regex": { @@ -7713,9 +7710,9 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz", - "integrity": "sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", "dev": true }, "istanbul-lib-hook": { @@ -7796,9 +7793,9 @@ } }, "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.3.tgz", + "integrity": "sha512-0i77ZFLsb9U3DHi22WzmIngVzfoyxxbQcZRqlF3KoKmCJGq9nhFHoGi8FqBztN2rE8w6hURnZghetn0xpkVb6A==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -7971,9 +7968,9 @@ "dev": true }, "marked": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.4.tgz", - "integrity": "sha512-jBo8AOayNaEcvBhNobg6/BLhdsK3NvnKWJg33MAAPbvTWiG4QBn9gpW1+7RssrKu4K1dKlN+0goVQwV41xEfOA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.7.tgz", + "integrity": "sha512-ctKqbnLuNbsHbI26cfMyOlKgXGfl1orOv1AvWWDX7AkgfMOwCWvmuYc+mVLeWhQ9W6hdWVBynOs96VkcscKo0Q==", "dev": true }, "merge-stream": { @@ -8084,12 +8081,6 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "nanocolors": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.1.12.tgz", - "integrity": "sha512-2nMHqg1x5PU+unxX7PGY7AuYxl2qDx7PSrTRjizr8sxdd3l/3hBuWWaki62qmtYm2U5i4Z5E7GbjlyDFhs9/EQ==", - "dev": true - }, "nanoid": { "version": "3.1.25", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", @@ -8151,9 +8142,9 @@ } }, "node-releases": { - "version": "1.1.76", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.76.tgz", - "integrity": "sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA==", + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", "dev": true }, "normalize-path": { @@ -8669,6 +8660,12 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -8738,12 +8735,6 @@ "fromentries": "^1.2.0" } }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, "protocols": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz", @@ -9065,9 +9056,9 @@ } }, "rxjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.3.0.tgz", - "integrity": "sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", "dev": true, "requires": { "tslib": "~2.1.0" @@ -9374,12 +9365,12 @@ "dev": true }, "ts-node": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.2.1.tgz", - "integrity": "sha512-hCnyOyuGmD5wHleOQX6NIjJtYVIO8bPP8F2acWkB4W06wdlkgyvJtubO/I9NkI88hCFECbsEgoLc0VNkYmcSfw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.3.0.tgz", + "integrity": "sha512-RYIy3i8IgpFH45AX4fQHExrT8BxDeKTdC83QFJkNzkvt8uFB6QJ8XMyhynYiKMLxt9a7yuXaDBZNOYS3XjDcYw==", "dev": true, "requires": { - "@cspotcode/source-map-support": "0.6.1", + "@cspotcode/source-map-support": "0.7.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", @@ -9429,38 +9420,45 @@ } }, "typedoc": { - "version": "0.21.9", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.21.9.tgz", - "integrity": "sha512-VRo7aII4bnYaBBM1lhw4bQFmUcDQV8m8tqgjtc7oXl87jc1Slbhfw2X5MccfcR2YnEClHDWgsiQGgNB8KJXocA==", + "version": "0.22.5", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.5.tgz", + "integrity": "sha512-KFrWGU1iKiTGw0RcyjLNYDmhd7uICU14HgBNPmFKY/sT4Pm/fraaLyWyisst9vGTUAKxqibqoDITR7+ZcAkhHg==", "dev": true, "requires": { - "glob": "^7.1.7", - "handlebars": "^4.7.7", + "glob": "^7.2.0", "lunr": "^2.3.9", - "marked": "^3.0.2", - "minimatch": "^3.0.0", - "progress": "^2.0.3", - "shiki": "^0.9.8", - "typedoc-default-themes": "^0.12.10" + "marked": "^3.0.4", + "minimatch": "^3.0.4", + "shiki": "^0.9.11" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, - "typedoc-default-themes": { - "version": "0.12.10", - "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.10.tgz", - "integrity": "sha512-fIS001cAYHkyQPidWXmHuhs8usjP5XVJjWB8oZGqkTowZaz3v7g3KDZeeqE82FBrmkAnIBOY3jgy7lnPnqATbA==", - "dev": true - }, "typedoc-github-wiki-theme": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/typedoc-github-wiki-theme/-/typedoc-github-wiki-theme-0.5.1.tgz", - "integrity": "sha512-ED2Uc3WUjbv6xIdCkpMz3yBtcEciJnAhDQdRWLYgw4K+FKY0T3PzbI+ssNsBVgwDnYQP/XuaqfZkeQ3EQsOm9g==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/typedoc-github-wiki-theme/-/typedoc-github-wiki-theme-0.6.0.tgz", + "integrity": "sha512-uHhR7PwAZ4JgO0KzlLocWSvMqKsSZ/wxUQYGKskIepzsotPAQcAWnSSnGi6gdkSw8UAfIIppdD7H1AmI39962w==", "dev": true, "requires": {} }, "typedoc-plugin-markdown": { - "version": "3.10.4", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.10.4.tgz", - "integrity": "sha512-if9w7S9fXLg73AYi/EoRSEhTOZlg3I8mIP8YEmvzSE33VrNXC9/hA0nVcLEwFVJeQY7ay6z67I6kW0KIv7LjeA==", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.11.3.tgz", + "integrity": "sha512-rWiHbEIe0oZetDIsBR24XJVxGOJ91kDcHoj2KhFKxCLoJGX659EKBQkHne9QJ4W2stGhu1fRgFyQaouSBnxukA==", "dev": true, "requires": { "handlebars": "^4.7.7" diff --git a/package.json b/package.json index b2ceadbdd16..48c5018c13f 100644 --- a/package.json +++ b/package.json @@ -34,20 +34,21 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@tsconfig/node12": "^1.0.9", "@types/mocha": "^9.0.0", - "@types/node": "^16.9.6", - "@types/sinon": "^10.0.3", + "@types/node": "^16.10.3", + "@types/sinon": "^10.0.4", "@types/which": "^2.0.1", "@types/yallist": "^4.0.1", - "mocha": "^9.1.1", + "mocha": "^9.1.2", "nyc": "^15.1.0", "release-it": "^14.11.6", "sinon": "^11.1.2", "source-map-support": "^0.5.20", - "ts-node": "^10.2.1", - "typedoc": "0.21.9", - "typedoc-github-wiki-theme": "^0.5.1", - "typedoc-plugin-markdown": "3.10.4", + "ts-node": "^10.3.0", + "typedoc": "^0.22.5", + "typedoc-github-wiki-theme": "^0.6.0", + "typedoc-plugin-markdown": "^3.11.3", "typescript": "^4.4.3", "which": "^2.0.2" }, diff --git a/tsconfig.json b/tsconfig.json index 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" From c650d864d1fc2e48c243ed0cdec50b24b583eb55 Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 11 Oct 2021 17:32:15 -0400 Subject: [PATCH 036/112] lock benny version --- benchmark/package-lock.json | 92 +++++++++++++++++++++++++++---------- benchmark/package.json | 2 +- 2 files changed, 68 insertions(+), 26 deletions(-) diff --git a/benchmark/package-lock.json b/benchmark/package-lock.json index 49d77a57787..4afaf8c305c 100644 --- a/benchmark/package-lock.json +++ b/benchmark/package-lock.json @@ -7,7 +7,7 @@ "name": "benchmark", "license": "ISC", "dependencies": { - "benny": "^3.7.0", + "benny": "3.6.15", "v3": "npm:redis@3.1.2", "v4": "file:../" } @@ -127,6 +127,14 @@ "node": ">=8" } }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/benchmark": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", @@ -137,21 +145,20 @@ } }, "node_modules/benny": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/benny/-/benny-3.7.0.tgz", - "integrity": "sha512-tfQ8s4qwjfyMvFqe7wSGGel2Pzgl5ytwztS72Xh/ynPKJeXFLQ0sSVL95X9wHpqpXqW13pTHsEMCggrNKgeAoA==", + "version": "3.6.15", + "resolved": "https://registry.npmjs.org/benny/-/benny-3.6.15.tgz", + "integrity": "sha512-kq6XVGGYVou3Y8KNPs3SEF881vi5fJ8sIf9w69D2rreiNfRicWVWK6u6/mObMw6BiexoHHumtipn5gcu0Tngng==", "dependencies": { "@arrows/composition": "^1.0.0", "@arrows/dispatch": "^1.0.2", "@arrows/multimethod": "^1.1.6", "benchmark": "^2.1.4", - "fs-extra": "^10.0.0", - "json2csv": "^5.0.6", - "kleur": "^4.1.4", - "log-update": "^4.0.0" - }, - "engines": { - "node": ">=12" + "fs-extra": "^9.0.1", + "json2csv": "^5.0.4", + "kleur": "^4.1.3", + "log-update": "^4.0.0", + "prettier": "^2.1.2", + "stats-median": "^1.0.1" } }, "node_modules/cli-cursor": { @@ -208,16 +215,17 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dependencies": { + "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" } }, "node_modules/graceful-fs": { @@ -331,6 +339,17 @@ "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" }, + "node_modules/prettier": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/redis-commands": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", @@ -388,6 +407,11 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/stats-median": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stats-median/-/stats-median-1.0.1.tgz", + "integrity": "sha512-IYsheLg6dasD3zT/w9+8Iq9tcIQqqu91ZIpJOnIEM25C3X/g4Tl8mhXwW2ZQpbrsJISr9+wizEYgsibN5/b32Q==" + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -532,6 +556,11 @@ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, "benchmark": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", @@ -542,18 +571,20 @@ } }, "benny": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/benny/-/benny-3.7.0.tgz", - "integrity": "sha512-tfQ8s4qwjfyMvFqe7wSGGel2Pzgl5ytwztS72Xh/ynPKJeXFLQ0sSVL95X9wHpqpXqW13pTHsEMCggrNKgeAoA==", + "version": "3.6.15", + "resolved": "https://registry.npmjs.org/benny/-/benny-3.6.15.tgz", + "integrity": "sha512-kq6XVGGYVou3Y8KNPs3SEF881vi5fJ8sIf9w69D2rreiNfRicWVWK6u6/mObMw6BiexoHHumtipn5gcu0Tngng==", "requires": { "@arrows/composition": "^1.0.0", "@arrows/dispatch": "^1.0.2", "@arrows/multimethod": "^1.1.6", "benchmark": "^2.1.4", - "fs-extra": "^10.0.0", - "json2csv": "^5.0.6", - "kleur": "^4.1.4", - "log-update": "^4.0.0" + "fs-extra": "^9.0.1", + "json2csv": "^5.0.4", + "kleur": "^4.1.3", + "log-update": "^4.0.0", + "prettier": "^2.1.2", + "stats-median": "^1.0.1" } }, "cli-cursor": { @@ -598,10 +629,11 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "requires": { + "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" @@ -685,6 +717,11 @@ "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" }, + "prettier": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==" + }, "redis-commands": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", @@ -727,6 +764,11 @@ "is-fullwidth-code-point": "^3.0.0" } }, + "stats-median": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stats-median/-/stats-median-1.0.1.tgz", + "integrity": "sha512-IYsheLg6dasD3zT/w9+8Iq9tcIQqqu91ZIpJOnIEM25C3X/g4Tl8mhXwW2ZQpbrsJISr9+wizEYgsibN5/b32Q==" + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", diff --git a/benchmark/package.json b/benchmark/package.json index f56ad2f23ce..ab874090c4b 100644 --- a/benchmark/package.json +++ b/benchmark/package.json @@ -10,7 +10,7 @@ "author": "", "license": "ISC", "dependencies": { - "benny": "^3.7.0", + "benny": "3.6.15", "v3": "npm:redis@3.1.2", "v4": "file:../" } From 40972582f02acb9b5ebf8ac5c897e2eefa9e9474 Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 11 Oct 2021 17:32:49 -0400 Subject: [PATCH 037/112] fix #1674 - remove `isolationPoolOptions` when creating isolated connection --- lib/client/index.ts | 11 ++++++++--- lib/cluster/index.ts | 7 +++++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/client/index.ts b/lib/client/index.ts index 5aeffd365da..1a5384f509f 100644 --- a/lib/client/index.ts +++ b/lib/client/index.ts @@ -147,7 +147,9 @@ export default class RedisClient this.#queue = this.#initiateQueue(); this.#isolationPool = createPool({ create: async () => { - const duplicate = this.duplicate(); + const duplicate = this.duplicate({ + isolationPoolOptions: undefined + }); await duplicate.connect(); return duplicate; }, @@ -269,8 +271,11 @@ export default class RedisClient }; } - duplicate(): RedisClientType { - return new (Object.getPrototypeOf(this).constructor)(this.#options); + duplicate(overrides?: Partial>): RedisClientType { + return new (Object.getPrototypeOf(this).constructor)({ + ...this.#options, + ...overrides + }); } async connect(): Promise { diff --git a/lib/cluster/index.ts b/lib/cluster/index.ts index 4b55a93d4ab..aeaabecae35 100644 --- a/lib/cluster/index.ts +++ b/lib/cluster/index.ts @@ -61,8 +61,11 @@ export default class RedisCluster(): RedisClusterType { - return new (Object.getPrototypeOf(this).constructor)(); + duplicate(overrides?: Partial>): RedisClusterType { + return new (Object.getPrototypeOf(this).constructor)({ + ...this.#options, + ...overrides + }); } async connect(): Promise { From 61cec9d06cc6806fd097bbc94d6d096b000e269a Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 11 Oct 2021 19:15:02 -0400 Subject: [PATCH 038/112] increase test coverage --- lib/cluster/index.spec.ts | 2 +- lib/commands/GEODIST.spec.ts | 32 ++++++++++++++++--- lib/commands/HELLO.ts | 2 +- lib/commands/HSET.spec.ts | 10 +++--- lib/commands/XREAD.spec.ts | 22 +++++++++++-- lib/commands/XREADGROUP.spec.ts | 56 +++++++++++++++++++++------------ lib/commands/ZINTER.ts | 2 +- lib/commands/ZINTERSTORE.ts | 2 +- lib/commands/ZRANGE.spec.ts | 7 +++++ 9 files changed, 97 insertions(+), 38 deletions(-) diff --git a/lib/cluster/index.spec.ts b/lib/cluster/index.spec.ts index f3bf4d8bacb..f2227395385 100644 --- a/lib/cluster/index.spec.ts +++ b/lib/cluster/index.spec.ts @@ -31,7 +31,7 @@ describe('Cluster', () => { itWithCluster(TestRedisClusters.OPEN, 'multi', async cluster => { const key = 'key'; assert.deepEqual( - await cluster.multi(key) + await cluster.multi() .set(key, 'value') .get(key) .exec(), diff --git a/lib/commands/GEODIST.spec.ts b/lib/commands/GEODIST.spec.ts index c1168259312..2cff8ecbd82 100644 --- a/lib/commands/GEODIST.spec.ts +++ b/lib/commands/GEODIST.spec.ts @@ -19,11 +19,33 @@ describe('GEODIST', () => { }); }); - 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/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/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/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/ZINTER.ts b/lib/commands/ZINTER.ts index eee49837386..629515b57f9 100644 --- a/lib/commands/ZINTER.ts +++ b/lib/commands/ZINTER.ts @@ -21,7 +21,7 @@ export function transformArguments(keys: Array | string, options?: ZInte } if (options?.AGGREGATE) { - args.push('AGGREGATE', options?.AGGREGATE); + args.push('AGGREGATE', options.AGGREGATE); } return args; diff --git a/lib/commands/ZINTERSTORE.ts b/lib/commands/ZINTERSTORE.ts index 59a27e11c51..e0916e5b14a 100644 --- a/lib/commands/ZINTERSTORE.ts +++ b/lib/commands/ZINTERSTORE.ts @@ -19,7 +19,7 @@ export function transformArguments(destination: string, keys: Array | st } if (options?.AGGREGATE) { - args.push('AGGREGATE', options?.AGGREGATE); + args.push('AGGREGATE', options.AGGREGATE); } return args; 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, { From b0f657c74762a2f5c87bbe27ed3d160b0dd8fbd9 Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 11 Oct 2021 19:34:23 -0400 Subject: [PATCH 039/112] update .npmignore --- .npmignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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/ From 235db19f795d18ca620def083e2230a36b889858 Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 11 Oct 2021 19:36:46 -0400 Subject: [PATCH 040/112] Release 4.0.0-rc.3 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6a7fa380af7..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", diff --git a/package.json b/package.json index 48c5018c13f..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", From eb11f8386ad36503d165c23927876f9226cbd115 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 12 Oct 2021 11:43:53 -0400 Subject: [PATCH 041/112] fix README --- README.md | 5 ++--- index.ts | 2 ++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c768b691d71..073776535e6 100644 --- a/README.md +++ b/README.md @@ -192,7 +192,7 @@ You can override the default options by providing a configuration object: client.scanIterator({ TYPE: 'string', // `SCAN` only MATCH: 'patter*', - COUNT: 100, + COUNT: 100 }); ``` @@ -201,8 +201,7 @@ client.scanIterator({ Define new functions using [Lua scripts](https://redis.io/commands/eval) which execute on the Redis server: ```typescript -import { createClient } from 'redis'; -import { defineScript } from 'redis/lua-script'; +import { createClient, defineScript } from 'redis'; (async () => { const client = createClient({ diff --git a/index.ts b/index.ts index fb448f989c7..408cbe3b996 100644 --- a/index.ts +++ b/index.ts @@ -6,3 +6,5 @@ export const createClient = RedisClient.create; export const commandOptions = RedisClient.commandOptions; export const createCluster = RedisCluster.create; + +export { defineScript } from './lib/lua-script'; From c8f3327ab7408139f7651e6fe83e26d069e082d0 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 12 Oct 2021 11:44:16 -0400 Subject: [PATCH 042/112] remove whitespace from LICENSE --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 5cb3bb4180b..db86cc4de7f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ - MIT License +MIT License Copyright (c) 2016-present Node Redis contributors. From bc1ffbc5db92cb4e6d8c972258fcfe877bfb79f1 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 12 Oct 2021 13:19:30 -0400 Subject: [PATCH 043/112] use "export { x as y }" instead of import & const --- lib/commands/CONFIG_GET.ts | 4 +--- lib/commands/COPY.ts | 4 +--- lib/commands/EXISTS.ts | 4 ++-- lib/commands/EXPIRE.ts | 4 +--- lib/commands/EXPIREAT.ts | 4 ++-- lib/commands/GEOSEARCH_WITH.ts | 4 ++-- lib/commands/HEXISTS.ts | 4 +--- lib/commands/HGETALL.ts | 4 +--- lib/commands/HRANDFIELD_COUNT_WITHVALUES.ts | 3 +-- lib/commands/HSETNX.ts | 4 +--- lib/commands/MOVE.ts | 4 +--- lib/commands/MSETNX.ts | 4 +--- lib/commands/PERSIST.ts | 4 +--- lib/commands/PEXPIRE.ts | 4 +--- lib/commands/PEXPIREAT.ts | 4 ++-- lib/commands/PFADD.ts | 4 ++-- lib/commands/RENAMENX.ts | 4 +--- lib/commands/SCRIPT_EXISTS.ts | 4 ++-- lib/commands/SETNX.ts | 4 +--- lib/commands/SISMEMBER.ts | 4 +--- lib/commands/SMISMEMBER.ts | 4 +--- lib/commands/SMOVE.ts | 4 +--- lib/commands/XCLAIM.ts | 4 ++-- lib/commands/XGROUP_CREATECONSUMER.ts | 4 +--- lib/commands/XGROUP_DESTROY.ts | 4 +--- lib/commands/XPENDING_RANGE.ts | 6 ++---- lib/commands/XRANGE.ts | 4 +--- lib/commands/XREAD.ts | 4 +--- lib/commands/XREADGROUP.ts | 4 +--- lib/commands/XREVRANGE.ts | 4 +--- lib/commands/ZADD.ts | 6 +++--- lib/commands/ZDIFF_WITHSCORES.ts | 3 +-- lib/commands/ZINCRBY.ts | 4 ++-- lib/commands/ZINTER_WITHSCORES.ts | 3 +-- lib/commands/ZMSCORE.ts | 4 ++-- lib/commands/ZPOPMAX_COUNT.ts | 3 +-- lib/commands/ZPOPMIN_COUNT.ts | 3 +-- lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.ts | 3 +-- lib/commands/ZRANGEBYSCORE_WITHSCORES.ts | 3 +-- lib/commands/ZRANGE_WITHSCORES.ts | 3 +-- lib/commands/ZSCORE.ts | 4 +--- lib/commands/ZUNION_WITHSCORES.ts | 3 +-- 42 files changed, 54 insertions(+), 109 deletions(-) diff --git a/lib/commands/CONFIG_GET.ts b/lib/commands/CONFIG_GET.ts index 423683c13a4..35907742e25 100644 --- a/lib/commands/CONFIG_GET.ts +++ b/lib/commands/CONFIG_GET.ts @@ -1,7 +1,5 @@ -import { transformReplyTuples } from './generic-transformers'; - export function transformArguments(parameter: string): Array { return ['CONFIG', 'GET', parameter]; } -export const transformReply = transformReplyTuples; +export { transformReplyTuples as transformReply } from './generic-transformers'; diff --git a/lib/commands/COPY.ts b/lib/commands/COPY.ts index 534b0d9c48c..c7a44e45c3c 100644 --- a/lib/commands/COPY.ts +++ b/lib/commands/COPY.ts @@ -1,5 +1,3 @@ -import { transformReplyBoolean } from './generic-transformers'; - interface CopyCommandOptions { destinationDb?: number; replace?: boolean; @@ -21,4 +19,4 @@ export function transformArguments(source: string, destination: string, options? return args; } -export const transformReply = transformReplyBoolean; +export { transformReplyBoolean as transformReply } from './generic-transformers'; diff --git a/lib/commands/EXISTS.ts b/lib/commands/EXISTS.ts index aac164fc953..5a9c0e3be66 100644 --- a/lib/commands/EXISTS.ts +++ b/lib/commands/EXISTS.ts @@ -1,5 +1,5 @@ import { RedisCommandArguments } from '.'; -import { pushVerdictArguments, transformReplyBoolean } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -9,4 +9,4 @@ export function transformArguments(keys: string | Array): RedisCommandAr return pushVerdictArguments(['EXISTS'], keys); } -export const transformReply = transformReplyBoolean; +export { transformReplyBoolean as transformReply } from './generic-transformers'; diff --git a/lib/commands/EXPIRE.ts b/lib/commands/EXPIRE.ts index 04b0504a6f7..36bcf8b882d 100644 --- a/lib/commands/EXPIRE.ts +++ b/lib/commands/EXPIRE.ts @@ -1,7 +1,5 @@ -import { transformReplyBoolean } from './generic-transformers'; - export function transformArguments(key: string, seconds: number): Array { return ['EXPIRE', key, seconds.toString()]; } -export const transformReply = transformReplyBoolean; +export { transformReplyBoolean as transformReply } from './generic-transformers'; diff --git a/lib/commands/EXPIREAT.ts b/lib/commands/EXPIREAT.ts index b7bfdcaa422..72142e4cb79 100644 --- a/lib/commands/EXPIREAT.ts +++ b/lib/commands/EXPIREAT.ts @@ -1,4 +1,4 @@ -import { transformEXAT, transformReplyBoolean } from './generic-transformers'; +import { transformEXAT } from './generic-transformers'; export function transformArguments(key: string, timestamp: number | Date): Array { return [ @@ -8,4 +8,4 @@ export function transformArguments(key: string, timestamp: number | Date): Array ]; } -export const transformReply = transformReplyBoolean; +export { transformReplyBoolean as transformReply } from './generic-transformers'; diff --git a/lib/commands/GEOSEARCH_WITH.ts b/lib/commands/GEOSEARCH_WITH.ts index cd461c9677f..64c6d88e33c 100644 --- a/lib/commands/GEOSEARCH_WITH.ts +++ b/lib/commands/GEOSEARCH_WITH.ts @@ -1,5 +1,5 @@ import { RedisCommandArguments } from '.'; -import { GeoSearchFrom, GeoSearchBy, GeoReplyWith, GeoSearchOptions, transformGeoMembersWithReply } from './generic-transformers'; +import { GeoSearchFrom, GeoSearchBy, GeoReplyWith, GeoSearchOptions } from './generic-transformers'; import { transformArguments as geoSearchTransformArguments } from './GEOSEARCH'; export { FIRST_KEY_INDEX, IS_READ_ONLY } from './GEOSEARCH'; @@ -20,4 +20,4 @@ export function transformArguments( return args; } -export const transformReply = transformGeoMembersWithReply; +export { transformGeoMembersWithReply as transformReply } from './generic-transformers'; diff --git a/lib/commands/HEXISTS.ts b/lib/commands/HEXISTS.ts index 7cf0b158d92..0eae5e03e52 100644 --- a/lib/commands/HEXISTS.ts +++ b/lib/commands/HEXISTS.ts @@ -1,9 +1,7 @@ -import { transformReplyBoolean } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, field: string): Array { return ['HEXISTS', key, field]; } -export const transformReply = transformReplyBoolean; +export { transformReplyBoolean as transformReply } from './generic-transformers'; diff --git a/lib/commands/HGETALL.ts b/lib/commands/HGETALL.ts index 8ac14ec4963..55c6d3456a1 100644 --- a/lib/commands/HGETALL.ts +++ b/lib/commands/HGETALL.ts @@ -1,9 +1,7 @@ -import { transformReplyTuples } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string): Array { return ['HGETALL', key]; } -export const transformReply = transformReplyTuples; +export { transformReplyTuples as transformReply } from './generic-transformers'; diff --git a/lib/commands/HRANDFIELD_COUNT_WITHVALUES.ts b/lib/commands/HRANDFIELD_COUNT_WITHVALUES.ts index 53856c1984e..1769cae0b76 100644 --- a/lib/commands/HRANDFIELD_COUNT_WITHVALUES.ts +++ b/lib/commands/HRANDFIELD_COUNT_WITHVALUES.ts @@ -1,4 +1,3 @@ -import { transformReplyTuples } from './generic-transformers'; import { transformArguments as transformHRandFieldCountArguments } from './HRANDFIELD_COUNT'; export { FIRST_KEY_INDEX } from './HRANDFIELD_COUNT'; @@ -10,4 +9,4 @@ export function transformArguments(key: string, count: number): Array { ]; } -export const transformReply = transformReplyTuples; +export { transformReplyTuples as transformReply } from './generic-transformers'; diff --git a/lib/commands/HSETNX.ts b/lib/commands/HSETNX.ts index 0eef8752529..83112f8945e 100644 --- a/lib/commands/HSETNX.ts +++ b/lib/commands/HSETNX.ts @@ -1,9 +1,7 @@ -import { transformReplyBoolean } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, field: string, value: string): Array { return ['HSETNX', key, field, value]; } -export const transformReply = transformReplyBoolean; +export { transformReplyBoolean as transformReply } from './generic-transformers'; diff --git a/lib/commands/MOVE.ts b/lib/commands/MOVE.ts index 74bb88c5e74..93896a63054 100644 --- a/lib/commands/MOVE.ts +++ b/lib/commands/MOVE.ts @@ -1,7 +1,5 @@ -import { transformReplyBoolean } from './generic-transformers'; - export function transformArguments(key: string, db: number): Array { return ['MOVE', key, db.toString()]; } -export const transformReply = transformReplyBoolean; \ No newline at end of file +export { transformReplyBoolean as transformReply } from './generic-transformers'; diff --git a/lib/commands/MSETNX.ts b/lib/commands/MSETNX.ts index c9c8c840374..fb7b028bc25 100644 --- a/lib/commands/MSETNX.ts +++ b/lib/commands/MSETNX.ts @@ -1,5 +1,3 @@ -import { transformReplyBoolean } 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 { return ['PERSIST', key]; } -export const transformReply = transformReplyBoolean; +export { transformReplyBoolean as transformReply } from './generic-transformers'; diff --git a/lib/commands/PEXPIRE.ts b/lib/commands/PEXPIRE.ts index d795f2fc0d0..f3b70279aa7 100644 --- a/lib/commands/PEXPIRE.ts +++ b/lib/commands/PEXPIRE.ts @@ -1,9 +1,7 @@ -import { transformReplyBoolean } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, milliseconds: number): Array { return ['PEXPIRE', key, milliseconds.toString()]; } -export const transformReply = transformReplyBoolean; +export { transformReplyBoolean as transformReply } from './generic-transformers'; diff --git a/lib/commands/PEXPIREAT.ts b/lib/commands/PEXPIREAT.ts index 91f38f88946..5dded48d278 100644 --- a/lib/commands/PEXPIREAT.ts +++ b/lib/commands/PEXPIREAT.ts @@ -1,4 +1,4 @@ -import { transformPXAT, transformReplyBoolean } from './generic-transformers'; +import { transformPXAT } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -10,4 +10,4 @@ export function transformArguments(key: string, millisecondsTimestamp: number | ]; } -export const transformReply = transformReplyBoolean; +export { transformReplyBoolean as transformReply } from './generic-transformers'; diff --git a/lib/commands/PFADD.ts b/lib/commands/PFADD.ts index 4328a18dfe5..e45e83c3ae0 100644 --- a/lib/commands/PFADD.ts +++ b/lib/commands/PFADD.ts @@ -1,5 +1,5 @@ import { RedisCommandArguments } from '.'; -import { pushVerdictArguments, transformReplyBoolean } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -7,4 +7,4 @@ export function transformArguments(key: string, element: string | Array) return pushVerdictArguments(['PFADD', key], element); } -export const transformReply = transformReplyBoolean; +export { transformReplyBoolean as transformReply } from './generic-transformers'; diff --git a/lib/commands/RENAMENX.ts b/lib/commands/RENAMENX.ts index 883d2ca2961..2cfec007741 100644 --- a/lib/commands/RENAMENX.ts +++ b/lib/commands/RENAMENX.ts @@ -1,9 +1,7 @@ -import { transformReplyBoolean } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, newKey: string): Array { return ['RENAMENX', key, newKey]; } -export const transformReply = transformReplyBoolean; +export { transformReplyBoolean as transformReply } from './generic-transformers'; diff --git a/lib/commands/SCRIPT_EXISTS.ts b/lib/commands/SCRIPT_EXISTS.ts index ee89f955e50..d4f65cfd72b 100644 --- a/lib/commands/SCRIPT_EXISTS.ts +++ b/lib/commands/SCRIPT_EXISTS.ts @@ -1,8 +1,8 @@ import { RedisCommandArguments } from '.'; -import { pushVerdictArguments, transformReplyBooleanArray } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export function transformArguments(sha1: string | Array): RedisCommandArguments { return pushVerdictArguments(['SCRIPT', 'EXISTS'], sha1); } -export const transformReply = transformReplyBooleanArray; +export { transformReplyBooleanArray as transformReply } from './generic-transformers'; diff --git a/lib/commands/SETNX.ts b/lib/commands/SETNX.ts index f0097836581..b45e93b0f7d 100644 --- a/lib/commands/SETNX.ts +++ b/lib/commands/SETNX.ts @@ -1,9 +1,7 @@ -import { transformReplyBoolean } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, value: string): Array { return ['SETNX', key, value]; } -export const transformReply = transformReplyBoolean; +export { transformReplyBoolean as transformReply } from './generic-transformers'; diff --git a/lib/commands/SISMEMBER.ts b/lib/commands/SISMEMBER.ts index 661410fce0d..d8c47a76a69 100644 --- a/lib/commands/SISMEMBER.ts +++ b/lib/commands/SISMEMBER.ts @@ -1,9 +1,7 @@ -import { transformReplyBoolean } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, member: string): Array { return ['SISMEMBER', key, member]; } -export const transformReply = transformReplyBoolean; +export { transformReplyBoolean as transformReply } from './generic-transformers'; diff --git a/lib/commands/SMISMEMBER.ts b/lib/commands/SMISMEMBER.ts index 07637a689b6..85b954bc3d7 100644 --- a/lib/commands/SMISMEMBER.ts +++ b/lib/commands/SMISMEMBER.ts @@ -1,9 +1,7 @@ -import { transformReplyBooleanArray } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(key: string, members: Array): Array { return ['SMISMEMBER', key, ...members]; } -export const transformReply = transformReplyBooleanArray; +export { transformReplyBooleanArray as transformReply } from './generic-transformers'; diff --git a/lib/commands/SMOVE.ts b/lib/commands/SMOVE.ts index f8922f6ca3f..7850b8f9ddc 100644 --- a/lib/commands/SMOVE.ts +++ b/lib/commands/SMOVE.ts @@ -1,9 +1,7 @@ -import { transformReplyBoolean } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export function transformArguments(source: string, destination: string, member: string): Array { return ['SMOVE', source, destination, member]; } -export const transformReply = transformReplyBoolean; +export { transformReplyBoolean as transformReply } from './generic-transformers'; diff --git a/lib/commands/XCLAIM.ts b/lib/commands/XCLAIM.ts index c5890a75797..c87d1551e86 100644 --- a/lib/commands/XCLAIM.ts +++ b/lib/commands/XCLAIM.ts @@ -1,4 +1,4 @@ -import { pushVerdictArguments, transformReplyStreamMessages } from './generic-transformers'; +import { pushVerdictArguments } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -43,4 +43,4 @@ export function transformArguments( return args; } -export const transformReply = transformReplyStreamMessages; +export { transformReplyStreamMessages as transformReply } from './generic-transformers'; diff --git a/lib/commands/XGROUP_CREATECONSUMER.ts b/lib/commands/XGROUP_CREATECONSUMER.ts index 395688706e2..f1a57e6fc42 100644 --- a/lib/commands/XGROUP_CREATECONSUMER.ts +++ b/lib/commands/XGROUP_CREATECONSUMER.ts @@ -1,9 +1,7 @@ -import { transformReplyBoolean } from './generic-transformers'; - export const FIRST_KEY_INDEX = 2; export function transformArguments(key: string, group: string, consumer: string): Array { return ['XGROUP', 'CREATECONSUMER', key, group, consumer]; } -export const transformReply = transformReplyBoolean; +export { transformReplyBoolean as transformReply } from './generic-transformers'; diff --git a/lib/commands/XGROUP_DESTROY.ts b/lib/commands/XGROUP_DESTROY.ts index 1fd25550c33..a4d67e5f4e5 100644 --- a/lib/commands/XGROUP_DESTROY.ts +++ b/lib/commands/XGROUP_DESTROY.ts @@ -1,9 +1,7 @@ -import { transformReplyBoolean } from './generic-transformers'; - export const FIRST_KEY_INDEX = 2; export function transformArguments(key: string, group: string): Array { return ['XGROUP', 'DESTROY', key, group]; } -export const transformReply = transformReplyBoolean; +export { transformReplyBoolean as transformReply } from './generic-transformers'; diff --git a/lib/commands/XPENDING_RANGE.ts b/lib/commands/XPENDING_RANGE.ts index c9e8d898e86..d0b45f0fabb 100644 --- a/lib/commands/XPENDING_RANGE.ts +++ b/lib/commands/XPENDING_RANGE.ts @@ -1,5 +1,3 @@ -import { transformReplyStreamMessages } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -24,7 +22,7 @@ export function transformArguments( } args.push(start, end, count.toString()); - + if (options?.consumer) { args.push(options.consumer); } @@ -32,4 +30,4 @@ export function transformArguments( return args; } -export const transformReply = transformReplyStreamMessages; +export { transformReplyStreamMessages as transformReply } from './generic-transformers'; diff --git a/lib/commands/XRANGE.ts b/lib/commands/XRANGE.ts index 2902d0743db..b357266c950 100644 --- a/lib/commands/XRANGE.ts +++ b/lib/commands/XRANGE.ts @@ -1,5 +1,3 @@ -import { transformReplyStreamMessages } from './generic-transformers'; - export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; @@ -18,4 +16,4 @@ export function transformArguments(key: string, start: string, end: string, opti return args; } -export const transformReply = transformReplyStreamMessages; +export { transformReplyStreamMessages as transformReply } from './generic-transformers'; diff --git a/lib/commands/XREAD.ts b/lib/commands/XREAD.ts index 1f4932837a2..00d8aa959ec 100644 --- a/lib/commands/XREAD.ts +++ b/lib/commands/XREAD.ts @@ -1,5 +1,3 @@ -import { transformReplyStreamsMessages } from './generic-transformers'; - export const FIRST_KEY_INDEX = (streams: Array | XReadStream): string => { return Array.isArray(streams) ? streams[0].key : streams.key; }; @@ -40,4 +38,4 @@ export function transformArguments(streams: Array | XReadStream, op return args; } -export const transformReply = transformReplyStreamsMessages; +export { transformReplyStreamsMessages as transformReply } from './generic-transformers'; diff --git a/lib/commands/XREADGROUP.ts b/lib/commands/XREADGROUP.ts index b01385e7c2f..6d329d377ff 100644 --- a/lib/commands/XREADGROUP.ts +++ b/lib/commands/XREADGROUP.ts @@ -1,5 +1,3 @@ -import { transformReplyStreamsMessages } from './generic-transformers'; - export interface XReadGroupStream { key: string; id: string; @@ -54,4 +52,4 @@ export function transformArguments( return args; } -export const transformReply = transformReplyStreamsMessages; +export { transformReplyStreamsMessages as transformReply } from './generic-transformers'; diff --git a/lib/commands/XREVRANGE.ts b/lib/commands/XREVRANGE.ts index a1fbbbc128a..db48856cdcc 100644 --- a/lib/commands/XREVRANGE.ts +++ b/lib/commands/XREVRANGE.ts @@ -1,5 +1,3 @@ -import { transformReplyStreamMessages } from './generic-transformers'; - interface XRangeRevOptions { COUNT?: number; } @@ -14,4 +12,4 @@ export function transformArguments(key: string, start: string, end: string, opti return args; } -export const transformReply = transformReplyStreamMessages; +export { transformReplyStreamMessages as transformReply } from './generic-transformers'; diff --git a/lib/commands/ZADD.ts b/lib/commands/ZADD.ts index 0e43ecaf508..69f01c8d534 100644 --- a/lib/commands/ZADD.ts +++ b/lib/commands/ZADD.ts @@ -1,4 +1,4 @@ -import { transformArgumentNumberInfinity, transformReplyNumberInfinity, ZMember } from './generic-transformers'; +import { transformArgumentNumberInfinity, ZMember } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -56,11 +56,11 @@ export function transformArguments(key: string, members: ZMember | Array): return pushVerdictArguments(['ZMSCORE', key], member); } -export const transformReply = transformReplyNumberInfinityNullArray; +export { transformReplyNumberInfinityNullArray as transformReply } from './generic-transformers'; diff --git a/lib/commands/ZPOPMAX_COUNT.ts b/lib/commands/ZPOPMAX_COUNT.ts index abfa8494ec4..abef32cca56 100644 --- a/lib/commands/ZPOPMAX_COUNT.ts +++ b/lib/commands/ZPOPMAX_COUNT.ts @@ -1,4 +1,3 @@ -import { transformReplySortedSetWithScores } from './generic-transformers'; import { transformArguments as transformZPopMaxArguments } from './ZPOPMAX'; export { FIRST_KEY_INDEX } from './ZPOPMAX'; @@ -10,4 +9,4 @@ export function transformArguments(key: string, count: number): Array { ]; } -export const transformReply = transformReplySortedSetWithScores; +export { transformReplySortedSetWithScores as transformReply } from './generic-transformers'; diff --git a/lib/commands/ZPOPMIN_COUNT.ts b/lib/commands/ZPOPMIN_COUNT.ts index e313b32dc8a..7d290ebfe37 100644 --- a/lib/commands/ZPOPMIN_COUNT.ts +++ b/lib/commands/ZPOPMIN_COUNT.ts @@ -1,4 +1,3 @@ -import { transformReplySortedSetWithScores } from './generic-transformers'; import { transformArguments as transformZPopMinArguments } from './ZPOPMIN'; export { FIRST_KEY_INDEX } from './ZPOPMIN'; @@ -10,4 +9,4 @@ export function transformArguments(key: string, count: number): Array { ]; } -export const transformReply = transformReplySortedSetWithScores; +export { transformReplySortedSetWithScores as transformReply } from './generic-transformers'; diff --git a/lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.ts b/lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.ts index 6d79f41c955..8f49b326ad1 100644 --- a/lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.ts +++ b/lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.ts @@ -1,4 +1,3 @@ -import { transformReplySortedSetWithScores } from './generic-transformers'; import { transformArguments as transformZRandMemberCountArguments } from './ZRANDMEMBER_COUNT'; export { FIRST_KEY_INDEX, IS_READ_ONLY } from './ZRANDMEMBER_COUNT'; @@ -10,4 +9,4 @@ export function transformArguments(...args: Parameters { return ['ZSCORE', key, member]; } -export const transformReply = transformReplyNumberInfinityNull; +export { transformReplyNumberInfinityNull as transformReply } from './generic-transformers'; diff --git a/lib/commands/ZUNION_WITHSCORES.ts b/lib/commands/ZUNION_WITHSCORES.ts index d361fd432b0..3b937341921 100644 --- a/lib/commands/ZUNION_WITHSCORES.ts +++ b/lib/commands/ZUNION_WITHSCORES.ts @@ -1,5 +1,4 @@ import { RedisCommandArguments } from '.'; -import { transformReplySortedSetWithScores } from './generic-transformers'; import { transformArguments as transformZUnionArguments } from './ZUNION'; export { FIRST_KEY_INDEX, IS_READ_ONLY } from './ZUNION'; @@ -11,4 +10,4 @@ export function transformArguments(...args: Parameters Date: Wed, 13 Oct 2021 13:37:57 -0400 Subject: [PATCH 044/112] move from "NodeRedis" to "Redis" --- README.md | 12 ++++++------ package.json | 16 +++------------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 073776535e6..23b183f540b 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@

- +

Node Redis

- - Coverage Status + + Coverage Status Downloads @@ -57,7 +57,7 @@ createClient({ }); ``` -You can also use discrete parameters, UNIX sockets, and even TLS to connect. Details can be found in in the [Wiki](https://github.com/NodeRedis/node-redis/wiki/lib.socket#RedisSocketOptions). +You can also use discrete parameters, UNIX sockets, and even TLS to connect. Details can be found in in the [Wiki](https://github.com/redis/node-redis/wiki/lib.socket#RedisSocketOptions). ### Redis Commands @@ -279,8 +279,8 @@ If you'd like to contribute, check out the [contributing guide](CONTRIBUTING.md) Thank you to all the people who already contributed to Node Redis! - - + + ## License diff --git a/package.json b/package.json index 7f8720f47bf..80bf7aa05a6 100644 --- a/package.json +++ b/package.json @@ -8,16 +8,6 @@ "pubsub" ], "author": "Matt Ranney ", - "contributors": [ - { - "name": "Mike Diarmid (Salakar)", - "url": "https://github.com/salakar" - }, - { - "name": "Ruben Bridgewater (BridgeAR)", - "url": "https://github.com/BridgeAR" - } - ], "license": "MIT", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -57,10 +47,10 @@ }, "repository": { "type": "git", - "url": "git://github.com/NodeRedis/node-redis.git" + "url": "git://github.com/redis/node-redis.git" }, "bugs": { - "url": "https://github.com/NodeRedis/node-redis/issues" + "url": "https://github.com/redis/node-redis/issues" }, - "homepage": "https://github.com/NodeRedis/node-redis" + "homepage": "https://github.com/redis/node-redis" } From 4b2ad9561646e3db4edfcb407d9be6ace281105b Mon Sep 17 00:00:00 2001 From: leibale Date: Thu, 14 Oct 2021 16:50:39 -0400 Subject: [PATCH 045/112] fix #1676 --- lib/client/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/client/index.ts b/lib/client/index.ts index 1a5384f509f..7c094e154f3 100644 --- a/lib/client/index.ts +++ b/lib/client/index.ts @@ -213,6 +213,7 @@ export default class RedisClient this.#tick(); }) .on('reconnecting', () => this.emit('reconnecting')) + .on('drain', () => this.#tick()) .on('end', () => this.emit('end')); } From 83ddbbfc0ac94ac65355ff6a2f34645528c9b864 Mon Sep 17 00:00:00 2001 From: leibale Date: Thu, 14 Oct 2021 16:50:48 -0400 Subject: [PATCH 046/112] update comments --- lib/cluster/cluster-slots.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/cluster/cluster-slots.ts b/lib/cluster/cluster-slots.ts index 63834d4b4ca..f65411d7974 100644 --- a/lib/cluster/cluster-slots.ts +++ b/lib/cluster/cluster-slots.ts @@ -69,7 +69,7 @@ export default class RedisClusterSlots): Promise { - // Override this.#slots and add not existing clients to this.#clientByKey + // Override this.#slots and add not existing clients to this.#nodeByUrl const promises: Array> = [], clientsInUse = new Set(); for (const master of masters) { @@ -88,7 +88,7 @@ export default class RedisClusterSlots Date: Tue, 19 Oct 2021 05:53:43 +0800 Subject: [PATCH 047/112] Auth before select database (#1679) * Auth before select database * fix #1681 Co-authored-by: leibale --- lib/client/index.spec.ts | 12 ++++++++++++ lib/client/index.ts | 32 ++++++++++++++++++++++++++------ lib/client/socket.ts | 17 +++++++++++++++-- lib/test-utils.ts | 11 +++++++++-- 4 files changed, 62 insertions(+), 10 deletions(-) diff --git a/lib/client/index.spec.ts b/lib/client/index.spec.ts index e98814d0582..4d30e9be60b 100644 --- a/lib/client/index.spec.ts +++ b/lib/client/index.spec.ts @@ -119,6 +119,18 @@ describe('Client', () => { assert.equal(client.isOpen, false); }); + + itWithClient(TestRedisServers.PASSWORD, 'should execute AUTH before SELECT', async client => { + assert.equal( + (await client.clientInfo()).db, + 2 + ); + }, { + minimumRedisVersion: [6, 2], + clientOptions: { + database: 2 + } + }); }); describe('legacyMode', () => { diff --git a/lib/client/index.ts b/lib/client/index.ts index 7c094e154f3..8850574e716 100644 --- a/lib/client/index.ts +++ b/lib/client/index.ts @@ -177,24 +177,44 @@ export default class RedisClient #initiateSocket(): RedisSocket { const socketInitiator = async (): Promise => { - const v4Commands = this.#options?.legacyMode ? this.#v4 : this, - promises = []; + const promises = []; if (this.#selectedDB !== 0) { - promises.push(v4Commands.select(RedisClient.commandOptions({ asap: true }), this.#selectedDB)); + promises.push( + this.#queue.addCommand( + ['SELECT', this.#selectedDB.toString()], + { asap: true } + ) + ); } if (this.#options?.readonly) { - promises.push(v4Commands.readonly(RedisClient.commandOptions({ asap: true }))); + promises.push( + this.#queue.addCommand( + COMMANDS.READONLY.transformArguments(), + { asap: true } + ) + ); } if (this.#options?.username || this.#options?.password) { - promises.push(v4Commands.auth(RedisClient.commandOptions({ asap: true }), this.#options)); + promises.push( + this.#queue.addCommand( + COMMANDS.AUTH.transformArguments({ + username: this.#options.username, + password: this.#options.password ?? '' + }), + { asap: true } + ) + ); } const resubscribePromise = this.#queue.resubscribe(); if (resubscribePromise) { promises.push(resubscribePromise); + } + + if (promises.length) { this.#tick(); } @@ -410,7 +430,7 @@ export default class RedisClient quit = this.QUIT; #tick(): void { - if (!this.#socket.isSocketExists) { + if (!this.#socket.isSocketExists || this.#socket.writableNeedDrain) { return; } diff --git a/lib/client/socket.ts b/lib/client/socket.ts index ca48ad4d542..88ae03003aa 100644 --- a/lib/client/socket.ts +++ b/lib/client/socket.ts @@ -76,6 +76,14 @@ export default class RedisSocket extends EventEmitter { return !!this.#socket; } + // `writable.writableNeedDrain` was added in v15.2.0 and therefore can't be used + // https://nodejs.org/api/stream.html#stream_writable_writableneeddrain + #writableNeedDrain = false; + + get writableNeedDrain(): boolean { + return this.#writableNeedDrain; + } + constructor(initiator?: RedisSocketInitiator, options?: RedisSocketOptions) { super(); @@ -163,7 +171,10 @@ export default class RedisSocket extends EventEmitter { this.#onSocketError(new Error('Socket closed unexpectedly')); } }) - .on('drain', () => this.emit('drain')) + .on('drain', () => { + this.#writableNeedDrain = false; + this.emit('drain'); + }) .on('data', (data: Buffer) => this.emit('data', data)); resolve(socket); @@ -198,7 +209,9 @@ export default class RedisSocket extends EventEmitter { throw new ClientClosedError(); } - return this.#socket.write(toWrite); + const wasFullyWritten = this.#socket.write(toWrite); + this.#writableNeedDrain = !wasFullyWritten; + return wasFullyWritten; } async disconnect(ignoreIsOpen = false): Promise { diff --git a/lib/test-utils.ts b/lib/test-utils.ts index 978940ff93d..3b823ac6eed 100644 --- a/lib/test-utils.ts +++ b/lib/test-utils.ts @@ -284,16 +284,23 @@ export function describeHandleMinimumRedisVersion(minimumVersion: PartialRedisVe }); } +interface RedisClientTestOptions extends RedisTestOptions { + clientOptions?: RedisClientOptions<{}, {}>; +} + export function itWithClient( type: TestRedisServers, title: string, fn: (client: RedisClientType) => Promise, - options?: RedisTestOptions + options?: RedisClientTestOptions ): void { it(title, async function () { if (handleMinimumRedisVersion(this, options?.minimumRedisVersion)) return; - const client = RedisClient.create(TEST_REDIS_SERVERS[type]); + const client = RedisClient.create({ + ...TEST_REDIS_SERVERS[type], + ...options?.clientOptions + }); await client.connect(); From 26774f8fa3700623699d7f30361f4c5b7a699e1d Mon Sep 17 00:00:00 2001 From: Simon Prickett Date: Mon, 18 Oct 2021 23:20:00 +0100 Subject: [PATCH 048/112] Adds connect-as-acl-user example. (#1684) * Adds connect-as-acl-user example. * Adds blank line at end. * Set to private. * Adds examples folder to npmignore. --- .npmignore | 1 + .../connect-as-acl-user.js | 32 +++++ examples/package-lock.json | 110 ++++++++++++++++++ examples/package.json | 14 +++ 4 files changed, 157 insertions(+) create mode 100644 examples/connect-as-acl-user/connect-as-acl-user.js create mode 100644 examples/package-lock.json create mode 100644 examples/package.json diff --git a/.npmignore b/.npmignore index e3fc1a7731d..7e7bb32b111 100644 --- a/.npmignore +++ b/.npmignore @@ -16,3 +16,4 @@ lib/ index.ts *.spec.* dist/lib/test-utils.* +examples/ diff --git a/examples/connect-as-acl-user/connect-as-acl-user.js b/examples/connect-as-acl-user/connect-as-acl-user.js new file mode 100644 index 00000000000..20e3c4c3caf --- /dev/null +++ b/examples/connect-as-acl-user/connect-as-acl-user.js @@ -0,0 +1,32 @@ +// Connect to Redis 6.x as an ACL user. Attempt to run a command +// that the user is allowed to execute, and a command that the +// user is not allowed to execute. + +// Create the test user in redis-cli with this command: +// acl setuser testuser on >testpassword +ping + +import { createClient } from 'redis'; + +const connectWithACLUser = async () => { + const client = createClient({ + url: 'redis://testuser:testpassword@127.0.0.1:6379' + }); + + await client.connect(); + + // Returns PONG + console.log(`Response from PING command: ${await client.ping()}`); + + try { + // This will error as this user is not allowed to run this command... + console.log(`Response from GET command: ${await client.get('somekey')}`); + } catch (e) { + console.log(`GET command failed: ${e.message}`); + } + + await client.quit(); +} + + +connectWithACLUser(); + diff --git a/examples/package-lock.json b/examples/package-lock.json new file mode 100644 index 00000000000..07eff138d1f --- /dev/null +++ b/examples/package-lock.json @@ -0,0 +1,110 @@ +{ + "name": "node-redis-examples", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "node-redis-examples", + "version": "1.0.0", + "dependencies": { + "redis": "next" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz", + "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/generic-pool": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz", + "integrity": "sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/redis": { + "version": "4.0.0-rc.3", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.0.0-rc.3.tgz", + "integrity": "sha512-yvijGYWp3aOvqpFgqovUWLWSdHgjUEtScqJmjTfUXj/4kEHuSW2TERFQelIBnrGeKh8//eYlLpCFKCjDYT4NQw==", + "dependencies": { + "cluster-key-slot": "1.1.0", + "generic-pool": "3.8.2", + "redis-parser": "3.0.0", + "yallist": "4.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + }, + "dependencies": { + "cluster-key-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz", + "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==" + }, + "generic-pool": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz", + "integrity": "sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==" + }, + "redis": { + "version": "4.0.0-rc.3", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.0.0-rc.3.tgz", + "integrity": "sha512-yvijGYWp3aOvqpFgqovUWLWSdHgjUEtScqJmjTfUXj/4kEHuSW2TERFQelIBnrGeKh8//eYlLpCFKCjDYT4NQw==", + "requires": { + "cluster-key-slot": "1.1.0", + "generic-pool": "3.8.2", + "redis-parser": "3.0.0", + "yallist": "4.0.0" + } + }, + "redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=" + }, + "redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", + "requires": { + "redis-errors": "^1.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/examples/package.json b/examples/package.json new file mode 100644 index 00000000000..69fff5b5413 --- /dev/null +++ b/examples/package.json @@ -0,0 +1,14 @@ +{ + "name": "node-redis-examples", + "version": "1.0.0", + "description": "node-redis 4 example script", + "main": "index.js", + "private": true, + "scripts": { + }, + "type": "module", + "dependencies": { + "redis": "next" + } +} + From 293a0288b597a31522e63877a2f402ae6a4ab348 Mon Sep 17 00:00:00 2001 From: Simon Prickett Date: Mon, 18 Oct 2021 23:22:01 +0100 Subject: [PATCH 049/112] Adds Apple .DS_Store file to .gitignore (#1685) * Adds Apple .DS_Store file. * Add .DS_Store to .npmignore too Co-authored-by: Leibale Eidelman --- .gitignore | 1 + .npmignore | 1 + 2 files changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 0bdff14c7ff..8d752019aa0 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ dist/ coverage/ dump.rdb documentation/ +.DS_Store diff --git a/.npmignore b/.npmignore index 7e7bb32b111..115395e3fbb 100644 --- a/.npmignore +++ b/.npmignore @@ -16,4 +16,5 @@ lib/ index.ts *.spec.* dist/lib/test-utils.* +.DS_Store examples/ From 55cfee5d323cbbb594965fb1bc52138a2fae3804 Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 18 Oct 2021 18:23:50 -0400 Subject: [PATCH 050/112] move examples --- examples/{connect-as-acl-user => }/connect-as-acl-user.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/{connect-as-acl-user => }/connect-as-acl-user.js (100%) diff --git a/examples/connect-as-acl-user/connect-as-acl-user.js b/examples/connect-as-acl-user.js similarity index 100% rename from examples/connect-as-acl-user/connect-as-acl-user.js rename to examples/connect-as-acl-user.js From ae264ffb0f59a08759761d4a2fe7d711d7d57fe6 Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 18 Oct 2021 20:22:00 -0400 Subject: [PATCH 051/112] clean some tests --- lib/client/index.spec.ts | 64 +++++++++++++++------------------------- lib/test-utils.ts | 14 ++++----- 2 files changed, 30 insertions(+), 48 deletions(-) diff --git a/lib/client/index.spec.ts b/lib/client/index.spec.ts index 4d30e9be60b..2f14e8eecd7 100644 --- a/lib/client/index.spec.ts +++ b/lib/client/index.spec.ts @@ -339,24 +339,18 @@ describe('Client', () => { ); }); - it('with script', async () => { - const client = RedisClient.create({ + itWithClient(TestRedisServers.OPEN, 'with script', async client => { + assert.deepEqual( + await client.multi() + .square(2) + .exec(), + [4] + ); + }, { + clientOptions: { scripts: { square: SQUARE_SCRIPT } - }); - - await client.connect(); - - try { - assert.deepEqual( - await client.multi() - .square(2) - .exec(), - [4] - ); - } finally { - await client.disconnect(); } }); @@ -389,27 +383,26 @@ describe('Client', () => { }); }); - it('scripts', async () => { - const client = RedisClient.create({ + itWithClient(TestRedisServers.OPEN, 'scripts', async client => { + assert.equal( + await client.square(2), + 4 + ); + }, { + clientOptions: { scripts: { square: SQUARE_SCRIPT } - }); - - await client.connect(); - - try { - assert.equal( - await client.square(2), - 4 - ); - } finally { - await client.disconnect(); } }); - it('modules', async () => { - const client = RedisClient.create({ + itWithClient(TestRedisServers.OPEN, 'modules', async client => { + assert.equal( + await client.module.echo('message'), + 'message' + ); + }, { + clientOptions: { modules: { module: { echo: { @@ -422,17 +415,6 @@ describe('Client', () => { } } } - }); - - await client.connect(); - - try { - assert.equal( - await client.module.echo('message'), - 'message' - ); - } finally { - await client.disconnect(); } }); diff --git a/lib/test-utils.ts b/lib/test-utils.ts index 3b823ac6eed..42eb9df500b 100644 --- a/lib/test-utils.ts +++ b/lib/test-utils.ts @@ -52,13 +52,13 @@ export enum TestRedisServers { PASSWORD } -export const TEST_REDIS_SERVERS: Record> = {}; +export const TEST_REDIS_SERVERS: Record, 'modules' | 'scripts'>> = {}; export enum TestRedisClusters { OPEN } -export const TEST_REDIS_CLUSTERES: Record> = {}; +export const TEST_REDIS_CLUSTERES: Record, 'modules' | 'scripts'>> = {}; let port = 6379; @@ -284,15 +284,15 @@ export function describeHandleMinimumRedisVersion(minimumVersion: PartialRedisVe }); } -interface RedisClientTestOptions extends RedisTestOptions { - clientOptions?: RedisClientOptions<{}, {}>; +interface RedisClientTestOptions extends RedisTestOptions { + clientOptions?: RedisClientOptions; } -export function itWithClient( +export function itWithClient( type: TestRedisServers, title: string, - fn: (client: RedisClientType) => Promise, - options?: RedisClientTestOptions + fn: (client: RedisClientType) => Promise, + options?: RedisClientTestOptions ): void { it(title, async function () { if (handleMinimumRedisVersion(this, options?.minimumRedisVersion)) return; From e3ebda1041c90df3840601115e78d7a00b2131e0 Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 18 Oct 2021 20:34:00 -0400 Subject: [PATCH 052/112] clean code --- lib/client/index.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/client/index.ts b/lib/client/index.ts index 8850574e716..7026142c2fe 100644 --- a/lib/client/index.ts +++ b/lib/client/index.ts @@ -216,9 +216,8 @@ export default class RedisClient if (promises.length) { this.#tick(); + await Promise.all(promises); } - - await Promise.all(promises); }; return new RedisSocket(socketInitiator, this.#options?.socket) @@ -318,9 +317,9 @@ export default class RedisClient } // using `#sendCommand` cause `sendCommand` is overwritten in legacy mode - async #sendCommand(args: RedisCommandArguments, options?: ClientCommandOptions, bufferMode?: boolean): Promise { + #sendCommand(args: RedisCommandArguments, options?: ClientCommandOptions, bufferMode?: boolean): Promise { if (!this.#socket.isOpen) { - throw new ClientClosedError(); + return Promise.reject(new ClientClosedError()); } if (options?.isolated) { @@ -334,7 +333,7 @@ export default class RedisClient const promise = this.#queue.addCommand(args, options, bufferMode); this.#tick(); - return await promise; + return promise; } async scriptsExecutor(script: RedisScript, args: Array): Promise> { From a5eb16595f44781db9d99e99ad0a42b6cecd459b Mon Sep 17 00:00:00 2001 From: Simon Prickett Date: Tue, 19 Oct 2021 14:33:00 +0100 Subject: [PATCH 053/112] Adds examples table of contents and contribution guidelines. (#1686) --- examples/README.md | 60 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 examples/README.md diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 00000000000..d1e3b73a054 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,60 @@ +# Node Redis: Examples + +This folder contains example scripts showing how to use Node Redis in different scenarios. + +|File Name |Description | +|------------------------|------------------------------------| +|`connect-as-acl-user.js`|Connect to Redis 6 using an ACL user| + +## Contributing + +We'd love to see more examples here. If you have an idea that you'd like to see included here, submit a Pull Request and we'll be sure to review it! Don't forget to check out our [contributing guide](../CONTRIBUTING.md). + +### Coding Guidelines for Examples + +When adding a new example, please follow these guidelines: + +* Add your code in a single JavaScript file per example, directly in the `examples` folder +* Do not introduce other dependencies in your example +* Give your `.js` file a meaningful name using `-` separators e.g. `adding-to-a-stream.js` +* Indent your code using 2 spaces +* Use the single line `//` comment style and comment your code +* Add a comment at the top of your `.js` file describing what your example does +* Add a comment at the top of your `.js` file describing any Redis commands that need to be run to set up data for your example (try and keep this minimal) +* Use semicolons +* Use `async` and `await` +* Use single quotes, `'hello'` not `"hello"` +* Place your example code in a single `async` function where possible, named according to the file name e.g. `add-to-stream.js` would contain `const addtoStream = async () => { ... };`, and call this function at the end of the file e.g. `addToStream();` +* Unless your example requires a connection string, assume Redis is on the default localhost port 6379 with no password +* Use meaningful example data, let's not use `foo`, `bar`, `baz` etc! +* Leave on empty line at the end of your `.js` file +* Update this `README.md` file to add your example to the table + +Use [connect-as-acl-user.js](connect-as-acl-user.js) as a guide to develop a well formatted example script. + +### Example Template + +Here's a starter template for adding a new example, imagine this is stored in `do-something.js`: + +```javascript +// This comment should describe what the example does +// and can extend to multiple lines. + +// Set up the data in redis-cli using these commands: +// + +import { createClient } from 'redis'; + +const doSomething = async () => { + const client = createClient(); + + await client.connect(); + + // Add your example code here... + + await client.quit(); +} + + +doSomething(); +``` \ No newline at end of file From 46aad787ebc8635d43f96564aade2d0cbc84a804 Mon Sep 17 00:00:00 2001 From: Simon Prickett Date: Tue, 19 Oct 2021 21:13:35 +0100 Subject: [PATCH 054/112] Updated examples to use named functions. (#1687) * Updated examples to user named functions. * Update README.md Co-authored-by: Leibale Eidelman --- examples/README.md | 11 +++++------ examples/connect-as-acl-user.js | 4 +--- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/examples/README.md b/examples/README.md index d1e3b73a054..25b87683330 100644 --- a/examples/README.md +++ b/examples/README.md @@ -2,9 +2,9 @@ This folder contains example scripts showing how to use Node Redis in different scenarios. -|File Name |Description | -|------------------------|------------------------------------| -|`connect-as-acl-user.js`|Connect to Redis 6 using an ACL user| +| File Name | Description | +|--------------------------|--------------------------------------| +| `connect-as-acl-user.js` | Connect to Redis 6 using an ACL user | ## Contributing @@ -45,7 +45,7 @@ Here's a starter template for adding a new example, imagine this is stored in `d import { createClient } from 'redis'; -const doSomething = async () => { +async function doSomething() { const client = createClient(); await client.connect(); @@ -55,6 +55,5 @@ const doSomething = async () => { await client.quit(); } - doSomething(); -``` \ No newline at end of file +``` diff --git a/examples/connect-as-acl-user.js b/examples/connect-as-acl-user.js index 20e3c4c3caf..26e1e443b0a 100644 --- a/examples/connect-as-acl-user.js +++ b/examples/connect-as-acl-user.js @@ -7,7 +7,7 @@ import { createClient } from 'redis'; -const connectWithACLUser = async () => { +async function connectWithACLUser() { const client = createClient({ url: 'redis://testuser:testpassword@127.0.0.1:6379' }); @@ -27,6 +27,4 @@ const connectWithACLUser = async () => { await client.quit(); } - connectWithACLUser(); - From 2a7a7c1c2e484950ceb57497f786658dacf19127 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 19 Oct 2021 16:20:02 -0400 Subject: [PATCH 055/112] update docs, add 6.0.x to the tests matrix, add eslint, npm update, fix some commands, fix some types Co-authored-by: Simon Prickett --- .eslintrc.json | 12 + .github/workflows/tests.yml | 2 +- README.md | 61 +- SECURITY.md | 6 +- docs/clustering.md | 54 + lib/client/commands-queue.ts | 9 +- lib/client/commands.ts | 2 +- lib/client/index.spec.ts | 5 +- lib/client/index.ts | 31 +- lib/client/multi-command.ts | 6 +- lib/client/socket.ts | 1 - lib/cluster/index.ts | 17 +- lib/cluster/multi-command.ts | 6 +- lib/commands/COMMAND_COUNT.ts | 2 +- lib/commands/COMMAND_GETKEYS.ts | 2 +- lib/commands/SET.ts | 52 +- package-lock.json | 2105 +++++++++++++++++++++++++------ package.json | 12 +- 18 files changed, 1894 insertions(+), 491 deletions(-) create mode 100644 .eslintrc.json create mode 100644 docs/clustering.md diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 00000000000..9378001252c --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,12 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "plugins": [ + "@typescript-eslint" + ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" + ] + } diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 557d4f452dc..7ef80685d56 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,7 +13,7 @@ jobs: fail-fast: false matrix: node-version: [12.x, 14.x, 16.x] - redis-version: [5.x, 6.x] + redis-version: [5.x, 6.0.x, 6.2.x] steps: - uses: actions/checkout@v2.3.4 diff --git a/README.md b/README.md index 23b183f540b..63fe9d2a522 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ createClient({ }); ``` -You can also use discrete parameters, UNIX sockets, and even TLS to connect. Details can be found in in the [Wiki](https://github.com/redis/node-redis/wiki/lib.socket#RedisSocketOptions). +You can also use discrete parameters, UNIX sockets, and even TLS to connect. Details can be found in the [client configuration guide](./docs/client-configuration.md). ### Redis Commands @@ -227,32 +227,34 @@ import { createClient, defineScript } from 'redis'; })(); ``` -### Cluster +### Disconnecting -Connecting to a cluster is a bit different. Create the client by specifying some (or all) of the nodes in your cluster and then use it like a non-clustered client: +There are two functions that disconnect a client from the Redis server. In most scenarios you should use `.quit()` to ensure that pending commands are sent to Redis before closing a connection. -```typescript -import { createCluster } from 'redis'; +#### `.QUIT()`/`.quit()` -(async () => { - const cluster = createCluster({ - rootNodes: [ - { - url: 'redis://10.0.0.1:30001' - }, - { - url: 'redis://10.0.0.2:30002' - } - ] - }); +Gracefully close a client's connection to Redis, by sending the [`QUIT`](https://redis.io/commands/quit) command to the server. Before quitting, the client executes any remaining commands in its queue, and will receive replies from Redis for each of them. + +```typescript +const [ping, get, quit] = await Promise.all([ + client.ping(), + client.get('key'), + client.quit() +]); // ['PONG', null, 'OK'] + +try { + await client.get('key'); +} catch (err) { + // ClosedClient Error +} +``` - cluster.on('error', (err) => console.log('Redis Cluster Error', err)); +#### `.disconnect()` - await cluster.connect(); +Forcibly close a client's connection to Redis immediately. Calling `disconnect` will not send further pending commands to the Redis server, or wait for or parse outstanding responses. - await cluster.set('key', 'value'); - const value = await cluster.get('key'); -})(); +```typescript +await client.disconnect(); ``` ### Auto-Pipelining @@ -273,6 +275,23 @@ await Promise.all([ ]); ``` +### Clustering + +Check out the [Clustering Guide](./docs/clustering.md) when using Node Redis to connect to a Redis Cluster. + +## Supported Redis versions + +Node Redis is supported with the following versions of Redis: + +| Version | Supported | +|---------|--------------------| +| 6.2.z | :heavy_check_mark: | +| 6.0.z | :heavy_check_mark: | +| 5.y.z | :heavy_check_mark: | +| < 5.0 | :x: | + +> Node Redis should work with older versions of Redis, but it is not fully tested and we cannot offer support. + ## Contributing If you'd like to contribute, check out the [contributing guide](CONTRIBUTING.md). diff --git a/SECURITY.md b/SECURITY.md index 0839a123c96..f96aa68dc12 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -5,9 +5,9 @@ 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: | +|---------|--------------------| +| 4.0.z | :heavy_check_mark: | +| 3.1.z | :heavy_check_mark: | | < 3.1 | :x: | ## Reporting a Vulnerability diff --git a/docs/clustering.md b/docs/clustering.md new file mode 100644 index 00000000000..028ebea81d5 --- /dev/null +++ b/docs/clustering.md @@ -0,0 +1,54 @@ +# Clustering + +## Basic Example + +Connecting to a cluster is a bit different. Create the client by specifying some (or all) of the nodes in your cluster and then use it like a regular client instance: + +```typescript +import { createCluster } from 'redis'; + +(async () => { + const cluster = createCluster({ + rootNodes: [ + { + url: 'redis://10.0.0.1:30001' + }, + { + url: 'redis://10.0.0.2:30002' + } + ] + }); + + cluster.on('error', (err) => console.log('Redis Cluster Error', err)); + + await cluster.connect(); + + await cluster.set('key', 'value'); + const value = await cluster.get('key'); +})(); +``` + +## `createCluster` configuration + +> See the [client configuration](./client-configuration.md) page for the `rootNodes` and `defaults` configuration schemas. + +| Property | Default | Description | +|------------------------|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| rootNodes | | An array of root nodes that are part of the cluster, which will be used to get the cluster topology. Each element in the array is a client configuration object. There is no need to specify every node in the cluster, 3 should be enough to reliably connect and obtain the cluster configuration from the server | +| defaults | | The default configuration values for every client in the cluster. Use this for example when specifying an ACL user to connect with | +| useReplicas | `false` | When `true`, distribute load by executing readonly commands (such as `GET`, `GEOSEARCH`, etc.) across all cluster nodes. When `false`, only use master nodes | +| maxCommandRedirections | `16` | The maximum number of times a command will be redirected due to `MOVED` or `ASK` errors | | + +## Command Routing + +### Commands that operate on Redis Keys + +Commands such as `GET`, `SET`, etc. will be routed by the first key, for instance `MGET 1 2 3` will be routed by the key `1`. + +### [Server Commands][https://redis.io/commands#server] + +Admin commands such as `MEMORY STATS`, `FLUSHALL`, etc. are not attached to the cluster, and should be executed on a specific node using `.getSlot()` or `.getAllMasters()`. + +### "Forwarded Commands" + +Some commands (e.g. `PUBLISH`) are forwarded to other cluster nodes by the Redis server. The client will send these commands to a random node in order to spread the load across the cluster. diff --git a/lib/client/commands-queue.ts b/lib/client/commands-queue.ts index 791c7638bad..c07e582238c 100644 --- a/lib/client/commands-queue.ts +++ b/lib/client/commands-queue.ts @@ -6,20 +6,20 @@ import { RedisCommandRawReply } from '../commands'; export interface QueueCommandOptions { asap?: boolean; chainId?: symbol; - signal?: any; // TODO: `AbortSignal` type is incorrect + signal?: AbortSignal; } interface CommandWaitingToBeSent extends CommandWaitingForReply { args: Array; chainId?: symbol; abort?: { - signal: any; // TODO: `AbortSignal` type is incorrect + signal: AbortSignal; listener(): void; }; } interface CommandWaitingForReply { - resolve(reply?: any): void; + resolve(reply?: unknown): void; reject(err: Error): void; channelsCounter?: number; bufferMode?: boolean; @@ -135,7 +135,8 @@ export default class RedisCommandsQueue { signal: options.signal, listener }; - options.signal.addEventListener('abort', listener, { + // AbortSignal type is incorrent + (options.signal as any).addEventListener('abort', listener, { once: true }); } diff --git a/lib/client/commands.ts b/lib/client/commands.ts index c34f34be4fa..de901152f11 100644 --- a/lib/client/commands.ts +++ b/lib/client/commands.ts @@ -229,5 +229,5 @@ export default { UNWATCH, unwatch: UNWATCH, WAIT, - wait: WAIT, + wait: WAIT }; diff --git a/lib/client/index.spec.ts b/lib/client/index.spec.ts index 2f14e8eecd7..3e1bbd6aad4 100644 --- a/lib/client/index.spec.ts +++ b/lib/client/index.spec.ts @@ -611,8 +611,9 @@ describe('Client', () => { const promise = assert.rejects(client.connect(), ConnectionTimeoutError), start = process.hrtime.bigint(); - // block the event loop for 1ms, to make sure the connection will timeout - while (process.hrtime.bigint() - start < 1_000_000) {} + while (process.hrtime.bigint() - start < 1_000_000) { + // block the event loop for 1ms, to make sure the connection will timeout + } await promise; } catch (err) { diff --git a/lib/client/index.ts b/lib/client/index.ts index 7026142c2fe..123c3f543f6 100644 --- a/lib/client/index.ts +++ b/lib/client/index.ts @@ -34,16 +34,16 @@ type WithCommands = { }; export type WithModules = { - [P in keyof M]: { + [P in keyof M as M[P] extends never ? never : P]: { [C in keyof M[P]]: RedisClientCommandSignature; }; }; export type WithScripts = { - [P in keyof S]: RedisClientCommandSignature; + [P in keyof S as S[P] extends never ? never : P]: RedisClientCommandSignature; }; -export type RedisClientType = +export type RedisClientType, S extends RedisScripts = Record> = RedisClient & WithCommands & WithModules & WithScripts; export type InstantiableRedisClient = @@ -53,12 +53,14 @@ export interface ClientCommandOptions extends QueueCommandOptions { isolated?: boolean; } +type ClientLegacyCallback = (err: Error | null, reply?: RedisCommandRawReply) => void; + export default class RedisClient extends EventEmitter { static commandOptions(options: ClientCommandOptions): CommandOptions { return commandOptions(options); } - static extend(plugins?: RedisPlugins): InstantiableRedisClient { + static extend, S extends RedisScripts = Record>(plugins?: RedisPlugins): InstantiableRedisClient { const Client = extendWithModulesAndScripts({ BaseClass: RedisClient, modules: plugins?.modules, @@ -74,14 +76,14 @@ export default class RedisClient return Client; } - static create(options?: RedisClientOptions): RedisClientType { + static create, S extends RedisScripts = Record>(options?: RedisClientOptions): RedisClientType { return new (RedisClient.extend(options))(options); } - static parseURL(url: string): RedisClientOptions<{}, {}> { + static parseURL(url: string): RedisClientOptions, Record> { // https://www.iana.org/assignments/uri-schemes/prov/redis const { hostname, port, protocol, username, password, pathname } = new URL(url), - parsed: RedisClientOptions<{}, {}> = { + parsed: RedisClientOptions, Record> = { socket: { host: hostname } @@ -245,10 +247,12 @@ export default class RedisClient (this as any).#v4.sendCommand = this.#sendCommand.bind(this); (this as any).sendCommand = (...args: Array): void => { - const callback = typeof args[args.length - 1] === 'function' ? args[args.length - 1] as Function : undefined, + const callback = typeof args[args.length - 1] === 'function' ? + args[args.length - 1] as ClientLegacyCallback : + undefined, actualArgs = !callback ? args : args.slice(0, -1); this.#sendCommand(actualArgs.flat() as Array) - .then((reply: unknown) => { + .then((reply: RedisCommandRawReply) => { if (!callback) return; // https://github.com/NodeRedis/node-redis#commands:~:text=minimal%20parsing @@ -435,17 +439,12 @@ export default class RedisClient this.#socket.cork(); - while (true) { + while (!this.#socket.writableNeedDrain) { const args = this.#queue.getCommandToSend(); if (args === undefined) break; - let writeResult; for (const toWrite of encodeCommand(args)) { - writeResult = this.#socket.write(toWrite); - } - - if (!writeResult) { - break; + this.#socket.write(toWrite); } } } diff --git a/lib/client/multi-command.ts b/lib/client/multi-command.ts index ba02c2b9aa8..e4b2c165c8f 100644 --- a/lib/client/multi-command.ts +++ b/lib/client/multi-command.ts @@ -11,16 +11,16 @@ type WithCommands = { }; type WithModules = { - [P in keyof M]: { + [P in keyof M as M[P] extends never ? never : P]: { [C in keyof M[P]]: RedisClientMultiCommandSignature; }; }; type WithScripts = { - [P in keyof S]: RedisClientMultiCommandSignature + [P in keyof S as S[P] extends never ? never : P]: RedisClientMultiCommandSignature }; -export type RedisClientMultiCommandType = +export type RedisClientMultiCommandType, S extends RedisScripts = Record> = RedisClientMultiCommand & WithCommands & WithModules & WithScripts; export type RedisClientMultiExecutor = (queue: Array, chainId?: symbol) => Promise>; diff --git a/lib/client/socket.ts b/lib/client/socket.ts index 88ae03003aa..d5309483979 100644 --- a/lib/client/socket.ts +++ b/lib/client/socket.ts @@ -234,7 +234,6 @@ export default class RedisSocket extends EventEmitter { this.#isOpen = false; - try { await fn(); await this.disconnect(true); diff --git a/lib/cluster/index.ts b/lib/cluster/index.ts index aeaabecae35..fcf6d4754bb 100644 --- a/lib/cluster/index.ts +++ b/lib/cluster/index.ts @@ -1,5 +1,5 @@ import COMMANDS from './commands'; -import { RedisCommand, RedisCommandArguments, RedisCommandReply, RedisModules, RedisScript, RedisScripts } from '../commands'; +import { RedisCommand, RedisCommandArguments, RedisCommandReply, RedisModules, RedisPlugins, RedisScript, RedisScripts } from '../commands'; import { ClientCommandOptions, RedisClientCommandSignature, RedisClientOptions, RedisClientType, WithModules, WithScripts } from '../client'; import RedisClusterSlots, { ClusterNode } from './cluster-slots'; import { extendWithModulesAndScripts, transformCommandArguments, transformCommandReply, extendWithCommands } from '../commander'; @@ -7,14 +7,9 @@ import { EventEmitter } from 'events'; import RedisClusterMultiCommand, { RedisClusterMultiCommandType } from './multi-command'; import { RedisMultiQueuedCommand } from '../multi-command'; -export type RedisClusterClientOptions = Omit, 'modules' | 'scripts'>; +export type RedisClusterClientOptions = Omit, Record>, 'modules' | 'scripts'>; -export interface RedisClusterPlugins { - modules?: M; - scripts?: S; -} - -export interface RedisClusterOptions extends RedisClusterPlugins { +export interface RedisClusterOptions extends RedisPlugins { rootNodes: Array; defaults?: Partial; useReplicas?: boolean; @@ -25,10 +20,10 @@ type WithCommands = { [P in keyof typeof COMMANDS]: RedisClientCommandSignature<(typeof COMMANDS)[P]>; }; -export type RedisClusterType = +export type RedisClusterType, S extends RedisScripts = Record> = RedisCluster & WithCommands & WithModules & WithScripts; -export default class RedisCluster extends EventEmitter { +export default class RedisCluster, S extends RedisScripts = Record> extends EventEmitter { static extractFirstKey(command: RedisCommand, originalArgs: Array, redisArgs: RedisCommandArguments): string | Buffer | undefined { if (command.FIRST_KEY_INDEX === undefined) { return undefined; @@ -39,7 +34,7 @@ export default class RedisCluster(options?: RedisClusterOptions): RedisClusterType { + static create, S extends RedisScripts = Record>(options?: RedisClusterOptions): RedisClusterType { return new (extendWithModulesAndScripts({ BaseClass: RedisCluster, modules: options?.modules, diff --git a/lib/cluster/multi-command.ts b/lib/cluster/multi-command.ts index 8ffd39a90e0..8a798ca9092 100644 --- a/lib/cluster/multi-command.ts +++ b/lib/cluster/multi-command.ts @@ -12,16 +12,16 @@ type WithCommands = { }; type WithModules = { - [P in keyof M]: { + [P in keyof M as M[P] extends never ? never : P]: { [C in keyof M[P]]: RedisClusterMultiCommandSignature; }; }; type WithScripts = { - [P in keyof S]: RedisClusterMultiCommandSignature + [P in keyof S as S[P] extends never ? never : P]: RedisClusterMultiCommandSignature }; -export type RedisClusterMultiCommandType = +export type RedisClusterMultiCommandType, S extends RedisScripts = Record> = RedisClusterMultiCommand & WithCommands & WithModules & WithScripts; export type RedisClusterMultiExecutor = (queue: Array, firstKey?: string | Buffer, chainId?: symbol) => Promise>; diff --git a/lib/commands/COMMAND_COUNT.ts b/lib/commands/COMMAND_COUNT.ts index 5b8283bcc66..34c6a088da6 100644 --- a/lib/commands/COMMAND_COUNT.ts +++ b/lib/commands/COMMAND_COUNT.ts @@ -6,4 +6,4 @@ export function transformArguments(): RedisCommandArguments { return ['COMMAND', 'COUNT']; } -declare function transformReply(): number; +export declare function transformReply(): number; diff --git a/lib/commands/COMMAND_GETKEYS.ts b/lib/commands/COMMAND_GETKEYS.ts index caf342088fb..1c38515aef9 100644 --- a/lib/commands/COMMAND_GETKEYS.ts +++ b/lib/commands/COMMAND_GETKEYS.ts @@ -6,4 +6,4 @@ export function transformArguments(args: Array): RedisCommandArguments { return ['COMMAND', 'GETKEYS', ...args]; } -declare function transformReply(): Array; +export declare function transformReply(): Array; diff --git a/lib/commands/SET.ts b/lib/commands/SET.ts index b19a1b2c5c2..fdc7eef1986 100644 --- a/lib/commands/SET.ts +++ b/lib/commands/SET.ts @@ -2,43 +2,27 @@ import { RedisCommandArguments } from '.'; export const FIRST_KEY_INDEX = 1; -interface EX { - EX: number; -} - -interface PX { - PX: number -} +type MaximumOneOf = + K extends keyof T ? { [P in K]?: T[K] } & Partial, never>> : never; -interface EXAT { +type SetTTL = MaximumOneOf<{ + EX: number; + PX: number; EXAT: number; -} - -interface PXAT { PXAT: number; -} - -interface KEEPTTL { KEEPTTL: true; -} +}>; -type SetTTL = EX | PX | EXAT | PXAT | KEEPTTL | {}; - -interface NX { +type SetGuards = MaximumOneOf<{ NX: true; -} - -interface XX { XX: true; -} - -type SetGuards = NX | XX | {}; +}>; interface SetCommonOptions { - GET: true + GET?: true; } -type SetOptions = SetTTL & SetGuards & (SetCommonOptions | {}); +type SetOptions = SetTTL & SetGuards & SetCommonOptions; export function transformArguments(key: string | Buffer, value: string | Buffer, options?: SetOptions): RedisCommandArguments { const args = ['SET', key, value]; @@ -47,25 +31,25 @@ export function transformArguments(key: string | Buffer, value: string | Buffer, return args; } - if ('EX' in options) { + if (options.EX) { args.push('EX', options.EX.toString()); - } else if ('PX' in options) { + } else if (options.PX) { args.push('PX', options.PX.toString()); - } else if ('EXAT' in options) { + } else if (options.EXAT) { args.push('EXAT', options.EXAT.toString()); - } else if ('PXAT' in options) { + } else if (options.PXAT) { args.push('PXAT', options.PXAT.toString()); - } else if ((options).KEEPTTL) { + } else if (options.KEEPTTL) { args.push('KEEPTTL'); } - if ((options).NX) { + if (options.NX) { args.push('NX'); - } else if ((options).XX) { + } else if (options.XX) { args.push('XX'); } - if ((options).GET) { + if (options.GET) { args.push('GET'); } diff --git a/package-lock.json b/package-lock.json index f47208d6c9d..520aedc3278 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,20 +18,23 @@ "@istanbuljs/nyc-config-typescript": "^1.0.1", "@tsconfig/node12": "^1.0.9", "@types/mocha": "^9.0.0", - "@types/node": "^16.10.3", + "@types/node": "^16.11.1", "@types/sinon": "^10.0.4", "@types/which": "^2.0.1", "@types/yallist": "^4.0.1", - "mocha": "^9.1.2", + "@typescript-eslint/eslint-plugin": "^5.1.0", + "@typescript-eslint/parser": "^5.1.0", + "eslint": "^8.0.1", + "mocha": "^9.1.3", "nyc": "^15.1.0", "release-it": "^14.11.6", "sinon": "^11.1.2", "source-map-support": "^0.5.20", "ts-node": "^10.3.0", - "typedoc": "^0.22.5", + "typedoc": "^0.22.6", "typedoc-github-wiki-theme": "^0.6.0", "typedoc-plugin-markdown": "^3.11.3", - "typescript": "^4.4.3", + "typescript": "^4.4.4", "which": "^2.0.2" }, "engines": { @@ -89,6 +92,15 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/generator": { "version": "7.15.8", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", @@ -121,6 +133,15 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-function-name": { "version": "7.15.4", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", @@ -416,6 +437,15 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { "version": "7.15.6", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", @@ -450,6 +480,77 @@ "node": ">=12" } }, + "node_modules/@eslint/eslintrc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.3.tgz", + "integrity": "sha512-DHI1wDPoKCBPoLZA3qDR91+3te/wDSc1YhKg3jR8NxKKRJq2hwHwcWv31cSwSYvIBrmbENoYMWcenW8uproQqg==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.0.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", + "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, "node_modules/@iarna/toml": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", @@ -546,6 +647,15 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@istanbuljs/nyc-config-typescript": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.1.tgz", @@ -840,6 +950,12 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, "node_modules/@types/keyv": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", @@ -856,9 +972,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.10.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.3.tgz", - "integrity": "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ==", + "version": "16.11.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.1.tgz", + "integrity": "sha512-PYGcJHL9mwl1Ek3PLiYgyEKtwTMmkMw4vbiyz/ps3pfdRYLVv+SN7qHVAImrjdAXxgluDEw6Ph4lyv+m9UpRmA==", "dev": true }, "node_modules/@types/parse-json": { @@ -897,6 +1013,163 @@ "integrity": "sha512-G3FNJfaYtN8URU6wd6+uwFI62KO79j7n3XTYcwcFncP8gkfoi0b821GoVVt0oqKVnCqKYOMNKIGpakPoFhzAGA==", "dev": true }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.1.0.tgz", + "integrity": "sha512-bekODL3Tqf36Yz8u+ilha4zGxL9mdB6LIsIoMAvvC5FAuWo4NpZYXtCbv7B2CeR1LhI/lLtLk+q4tbtxuoVuCg==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "5.1.0", + "@typescript-eslint/scope-manager": "5.1.0", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.1.0.tgz", + "integrity": "sha512-ovE9qUiZMOMgxQAESZsdBT+EXIfx/YUYAbwGUI6V03amFdOOxI9c6kitkgRvLkJaLusgMZ2xBhss+tQ0Y1HWxA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.1.0", + "@typescript-eslint/types": "5.1.0", + "@typescript-eslint/typescript-estree": "5.1.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.1.0.tgz", + "integrity": "sha512-vx1P+mhCtYw3+bRHmbalq/VKP2Y3gnzNgxGxfEWc6OFpuEL7iQdAeq11Ke3Rhy8NjgB+AHsIWEwni3e+Y7djKA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.1.0", + "@typescript-eslint/types": "5.1.0", + "@typescript-eslint/typescript-estree": "5.1.0", + "debug": "^4.3.2" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.1.0.tgz", + "integrity": "sha512-yYlyVjvn5lvwCL37i4hPsa1s0ORsjkauhTqbb8MnpvUs7xykmcjGqwlNZ2Q5QpoqkJ1odlM2bqHqJwa28qV6Tw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.1.0", + "@typescript-eslint/visitor-keys": "5.1.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.1.0.tgz", + "integrity": "sha512-sEwNINVxcB4ZgC6Fe6rUyMlvsB2jvVdgxjZEjQUQVlaSPMNamDOwO6/TB98kFt4sYYfNhdhTPBEQqNQZjMMswA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.1.0.tgz", + "integrity": "sha512-SSz+l9YrIIsW4s0ZqaEfnjl156XQ4VRmJsbA0ZE1XkXrD3cRpzuZSVCyqeCMR3EBjF27IisWakbBDGhGNIOvfQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.1.0", + "@typescript-eslint/visitor-keys": "5.1.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.1.0.tgz", + "integrity": "sha512-uqNXepKBg81JVwjuqAxYrXa1Ql/YDzM+8g/pS+TCPxba0wZttl8m5DkrasbfnmJGHs4lQ2jTbcZ5azGhI7kK+w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.1.0", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -915,6 +1188,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -937,6 +1219,22 @@ "node": ">=8" } }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -1159,18 +1457,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1200,16 +1486,16 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", - "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.4.tgz", + "integrity": "sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ==", "dev": true, "dependencies": { - "caniuse-lite": "^1.0.30001264", - "electron-to-chromium": "^1.3.857", + "caniuse-lite": "^1.0.30001265", + "electron-to-chromium": "^1.3.867", "escalade": "^3.1.1", - "node-releases": "^1.1.77", - "picocolors": "^0.2.1" + "node-releases": "^2.0.0", + "picocolors": "^1.0.0" }, "bin": { "browserslist": "cli.js" @@ -1341,9 +1627,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001265", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", - "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", + "version": "1.0.30001269", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001269.tgz", + "integrity": "sha512-UOy8okEVs48MyHYgV+RdW1Oiudl1H6KolybD6ZquD0VcrPSgj25omXO1S7rDydjpqaISCwA8Pyx+jUQKZwWO5w==", "dev": true, "funding": { "type": "opencollective", @@ -1366,18 +1652,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -1405,6 +1679,18 @@ "fsevents": "~2.3.2" } }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/ci-info": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", @@ -1632,12 +1918,6 @@ } } }, - "node_modules/debug/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/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -1692,6 +1972,12 @@ "node": ">=4.0.0" } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "node_modules/default-require-extensions": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", @@ -1771,6 +2057,18 @@ "node": ">=8" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -1790,9 +2088,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.3.864", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.864.tgz", - "integrity": "sha512-v4rbad8GO6/yVI92WOeU9Wgxc4NA0n4f6P1FvZTY+jyY7JHEhw3bduYu60v3Q1h81Cg6eo4ApZrFPuycwd5hGw==", + "version": "1.3.872", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.872.tgz", + "integrity": "sha512-qG96atLFY0agKyEETiBFNhpRLSXGSXOBuhXWpbkYqrLKKASpRyRBUtfkn0ZjIf/yXfA7FA4nScVOMpXSHFlUCQ==", "dev": true }, "node_modules/emoji-regex": { @@ -1810,6 +2108,18 @@ "once": "^1.4.0" } }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -1855,6 +2165,155 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.0.1.tgz", + "integrity": "sha512-LsgcwZgQ72vZ+SMp4K6pAnk2yFDWL7Ti4pJaRvsZ0Hsw2h8ZjUIW38a9AFn2cZXdBMlScMFYYgsSp4ttFI/0bA==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.0.3", + "@humanwhocodes/config-array": "^0.6.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^6.0.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.2.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", + "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", + "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/espree": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", + "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", + "dev": true, + "dependencies": { + "acorn": "^8.5.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -1868,6 +2327,66 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -1905,6 +2424,12 @@ "node": ">=4" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, "node_modules/fast-glob": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", @@ -1921,6 +2446,30 @@ "node": ">=8" } }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "node_modules/fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -1954,6 +2503,18 @@ "node": ">=0.8.0" } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -2017,6 +2578,25 @@ "flat": "cli.js" } }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, "node_modules/foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -2090,6 +2670,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "node_modules/generic-pool": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz", @@ -2191,15 +2777,15 @@ } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, "node_modules/global-dirs": { @@ -2218,12 +2804,18 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globby": { @@ -2374,6 +2966,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -2486,23 +3087,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/import-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-from/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, "engines": { "node": ">=8" } @@ -2624,9 +3225,9 @@ } }, "node_modules/is-core-module": { - "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==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -2841,9 +3442,9 @@ "dev": true }, "node_modules/istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, "engines": { "node": ">=8" @@ -2876,6 +3477,15 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/istanbul-lib-processinfo": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", @@ -2908,22 +3518,10 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -2931,7 +3529,7 @@ "source-map": "^0.6.1" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { @@ -2944,9 +3542,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.3.tgz", - "integrity": "sha512-0i77ZFLsb9U3DHi22WzmIngVzfoyxxbQcZRqlF3KoKmCJGq9nhFHoGi8FqBztN2rE8w6hURnZghetn0xpkVb6A==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", + "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -2998,6 +3596,18 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "node_modules/json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -3046,6 +3656,19 @@ "node": ">=8" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", @@ -3085,6 +3708,12 @@ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -3111,20 +3740,17 @@ } }, "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "yallist": "^3.0.2" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/lru-cache/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "node_modules/lunr": { "version": "2.3.9", "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", @@ -3158,6 +3784,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -3262,9 +3897,9 @@ "dev": true }, "node_modules/mocha": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz", - "integrity": "sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", + "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", "dev": true, "dependencies": { "@ungap/promise-all-settled": "1.1.2", @@ -3304,12 +3939,33 @@ "url": "https://opencollective.com/mochajs" } }, - "node_modules/ms": { + "node_modules/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "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/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", @@ -3328,6 +3984,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -3393,9 +4055,9 @@ } }, "node_modules/node-releases": { - "version": "1.1.77", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", - "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.0.tgz", + "integrity": "sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA==", "dev": true }, "node_modules/normalize-path": { @@ -3535,6 +4197,15 @@ "node": ">=8" } }, + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/nyc/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -3632,6 +4303,21 @@ "lru-cache": "^5.1.1" } }, + "node_modules/onigasm/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/onigasm/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, "node_modules/open": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", @@ -3648,6 +4334,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -3952,6 +4655,15 @@ "node": ">=0.10.0" } }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -4058,9 +4770,9 @@ } }, "node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "node_modules/picomatch": { @@ -4139,6 +4851,15 @@ "node": ">=8" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", @@ -4160,6 +4881,15 @@ "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", @@ -4176,6 +4906,15 @@ "once": "^1.3.1" } }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/pupa": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", @@ -4349,6 +5088,18 @@ "node": ">=4" } }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, "node_modules/registry-auth-token": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", @@ -4416,33 +5167,6 @@ "node": ">=10" } }, - "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", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/release-it/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/release-it/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -4508,12 +5232,12 @@ "dev": true }, "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/responselike": { @@ -4626,12 +5350,18 @@ "dev": true }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/semver-diff": { @@ -4646,6 +5376,15 @@ "node": ">=8" } }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", @@ -4700,9 +5439,9 @@ } }, "node_modules/shiki": { - "version": "0.9.11", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.11.tgz", - "integrity": "sha512-tjruNTLFhU0hruCPoJP0y+B9LKOmcqUhTpxn7pcJB3fa+04gFChuEmxmrUfOJ7ZO6Jd+HwMnDHgY3lv3Tqonuw==", + "version": "0.9.12", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.12.tgz", + "integrity": "sha512-VXcROdldv0/Qu0w2XvzU4IrvTeBNs/Kj/FCmtcEXGz7Tic/veQzliJj6tEiAgoKianhQstpYmbPDStHU5Opqcw==", "dev": true, "dependencies": { "jsonc-parser": "^3.0.0", @@ -4748,18 +5487,6 @@ "url": "https://opencollective.com/sinon" } }, - "node_modules/sinon/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -4924,18 +5651,15 @@ } }, "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=8" } }, "node_modules/test-exclude": { @@ -4952,6 +5676,12 @@ "node": ">=8" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -5053,15 +5783,48 @@ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "engines": { - "node": ">=0.3.1" + "node": ">=0.3.1" + } + }, + "node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -5072,12 +5835,15 @@ } }, "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typedarray-to-buffer": { @@ -5090,9 +5856,9 @@ } }, "node_modules/typedoc": { - "version": "0.22.5", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.5.tgz", - "integrity": "sha512-KFrWGU1iKiTGw0RcyjLNYDmhd7uICU14HgBNPmFKY/sT4Pm/fraaLyWyisst9vGTUAKxqibqoDITR7+ZcAkhHg==", + "version": "0.22.6", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.6.tgz", + "integrity": "sha512-ePbJqOaz0GNkU2ehRwFwBpLD4Gp6m7jbJfHysXmDdjVKc1g8DFJ83r/LOZ9TZrkC661vgpoIY3FjSPEtUilHNA==", "dev": true, "dependencies": { "glob": "^7.2.0", @@ -5154,9 +5920,9 @@ } }, "node_modules/typescript": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", - "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", + "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -5243,31 +6009,13 @@ "is-ci": "bin.js" } }, - "node_modules/update-notifier/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/update-notifier/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "punycode": "^2.1.0" } }, "node_modules/url-join": { @@ -5304,6 +6052,12 @@ "uuid": "bin/uuid" } }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, "node_modules/vscode-textmate": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", @@ -5430,6 +6184,15 @@ "node": ">=8.12.0" } }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -5634,6 +6397,14 @@ "json5": "^2.1.2", "semver": "^6.3.0", "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "@babel/generator": { @@ -5657,6 +6428,14 @@ "@babel/helper-validator-option": "^7.14.5", "browserslist": "^4.16.6", "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "@babel/helper-function-name": { @@ -5885,6 +6664,14 @@ "@babel/types": "^7.15.4", "debug": "^4.1.0", "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } } }, "@babel/types": { @@ -5912,6 +6699,67 @@ "@cspotcode/source-map-consumer": "0.8.0" } }, + "@eslint/eslintrc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.3.tgz", + "integrity": "sha512-DHI1wDPoKCBPoLZA3qDR91+3te/wDSc1YhKg3jR8NxKKRJq2hwHwcWv31cSwSYvIBrmbENoYMWcenW8uproQqg==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.0.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", + "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, "@iarna/toml": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", @@ -5986,6 +6834,12 @@ "requires": { "p-limit": "^2.2.0" } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true } } }, @@ -6246,6 +7100,12 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, "@types/keyv": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", @@ -6262,9 +7122,9 @@ "dev": true }, "@types/node": { - "version": "16.10.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.10.3.tgz", - "integrity": "sha512-ho3Ruq+fFnBrZhUYI46n/bV2GjwzSkwuT4dTf0GkuNFmnb8nq4ny2z9JEVemFi6bdEJanHLlYfy9c6FN9B9McQ==", + "version": "16.11.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.1.tgz", + "integrity": "sha512-PYGcJHL9mwl1Ek3PLiYgyEKtwTMmkMw4vbiyz/ps3pfdRYLVv+SN7qHVAImrjdAXxgluDEw6Ph4lyv+m9UpRmA==", "dev": true }, "@types/parse-json": { @@ -6303,6 +7163,89 @@ "integrity": "sha512-G3FNJfaYtN8URU6wd6+uwFI62KO79j7n3XTYcwcFncP8gkfoi0b821GoVVt0oqKVnCqKYOMNKIGpakPoFhzAGA==", "dev": true }, + "@typescript-eslint/eslint-plugin": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.1.0.tgz", + "integrity": "sha512-bekODL3Tqf36Yz8u+ilha4zGxL9mdB6LIsIoMAvvC5FAuWo4NpZYXtCbv7B2CeR1LhI/lLtLk+q4tbtxuoVuCg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.1.0", + "@typescript-eslint/scope-manager": "5.1.0", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.1.0.tgz", + "integrity": "sha512-ovE9qUiZMOMgxQAESZsdBT+EXIfx/YUYAbwGUI6V03amFdOOxI9c6kitkgRvLkJaLusgMZ2xBhss+tQ0Y1HWxA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.1.0", + "@typescript-eslint/types": "5.1.0", + "@typescript-eslint/typescript-estree": "5.1.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.1.0.tgz", + "integrity": "sha512-vx1P+mhCtYw3+bRHmbalq/VKP2Y3gnzNgxGxfEWc6OFpuEL7iQdAeq11Ke3Rhy8NjgB+AHsIWEwni3e+Y7djKA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.1.0", + "@typescript-eslint/types": "5.1.0", + "@typescript-eslint/typescript-estree": "5.1.0", + "debug": "^4.3.2" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.1.0.tgz", + "integrity": "sha512-yYlyVjvn5lvwCL37i4hPsa1s0ORsjkauhTqbb8MnpvUs7xykmcjGqwlNZ2Q5QpoqkJ1odlM2bqHqJwa28qV6Tw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.1.0", + "@typescript-eslint/visitor-keys": "5.1.0" + } + }, + "@typescript-eslint/types": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.1.0.tgz", + "integrity": "sha512-sEwNINVxcB4ZgC6Fe6rUyMlvsB2jvVdgxjZEjQUQVlaSPMNamDOwO6/TB98kFt4sYYfNhdhTPBEQqNQZjMMswA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.1.0.tgz", + "integrity": "sha512-SSz+l9YrIIsW4s0ZqaEfnjl156XQ4VRmJsbA0ZE1XkXrD3cRpzuZSVCyqeCMR3EBjF27IisWakbBDGhGNIOvfQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.1.0", + "@typescript-eslint/visitor-keys": "5.1.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.1.0.tgz", + "integrity": "sha512-uqNXepKBg81JVwjuqAxYrXa1Ql/YDzM+8g/pS+TCPxba0wZttl8m5DkrasbfnmJGHs4lQ2jTbcZ5azGhI7kK+w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.1.0", + "eslint-visitor-keys": "^3.0.0" + } + }, "@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -6315,6 +7258,13 @@ "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", "dev": true }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -6331,6 +7281,18 @@ "indent-string": "^4.0.0" } }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -6492,12 +7454,6 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true } } }, @@ -6527,16 +7483,16 @@ "dev": true }, "browserslist": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.3.tgz", - "integrity": "sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==", + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.4.tgz", + "integrity": "sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001264", - "electron-to-chromium": "^1.3.857", + "caniuse-lite": "^1.0.30001265", + "electron-to-chromium": "^1.3.867", "escalade": "^3.1.1", - "node-releases": "^1.1.77", - "picocolors": "^0.2.1" + "node-releases": "^2.0.0", + "picocolors": "^1.0.0" } }, "buffer": { @@ -6622,9 +7578,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001265", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz", - "integrity": "sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==", + "version": "1.0.30001269", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001269.tgz", + "integrity": "sha512-UOy8okEVs48MyHYgV+RdW1Oiudl1H6KolybD6ZquD0VcrPSgj25omXO1S7rDydjpqaISCwA8Pyx+jUQKZwWO5w==", "dev": true }, "chalk": { @@ -6635,17 +7591,6 @@ "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "chardet": { @@ -6668,6 +7613,17 @@ "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } } }, "ci-info": { @@ -6842,14 +7798,6 @@ "dev": true, "requires": { "ms": "2.1.2" - }, - "dependencies": { - "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 - } } }, "decamelize": { @@ -6887,6 +7835,12 @@ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "default-require-extensions": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", @@ -6948,6 +7902,15 @@ "path-type": "^4.0.0" } }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -6964,9 +7927,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.864", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.864.tgz", - "integrity": "sha512-v4rbad8GO6/yVI92WOeU9Wgxc4NA0n4f6P1FvZTY+jyY7JHEhw3bduYu60v3Q1h81Cg6eo4ApZrFPuycwd5hGw==", + "version": "1.3.872", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.872.tgz", + "integrity": "sha512-qG96atLFY0agKyEETiBFNhpRLSXGSXOBuhXWpbkYqrLKKASpRyRBUtfkn0ZjIf/yXfA7FA4nScVOMpXSHFlUCQ==", "dev": true }, "emoji-regex": { @@ -6984,6 +7947,15 @@ "once": "^1.4.0" } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -7017,12 +7989,172 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, + "eslint": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.0.1.tgz", + "integrity": "sha512-LsgcwZgQ72vZ+SMp4K6pAnk2yFDWL7Ti4pJaRvsZ0Hsw2h8ZjUIW38a9AFn2cZXdBMlScMFYYgsSp4ttFI/0bA==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.0.3", + "@humanwhocodes/config-array": "^0.6.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^6.0.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.2.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-scope": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", + "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", + "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", + "dev": true + }, + "espree": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", + "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", + "dev": true, + "requires": { + "acorn": "^8.5.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.0.0" + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -7051,6 +8183,12 @@ "tmp": "^0.0.33" } }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, "fast-glob": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", @@ -7062,8 +8200,31 @@ "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } } }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -7090,6 +8251,15 @@ } } }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -7132,6 +8302,22 @@ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, "foreground-child": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", @@ -7178,6 +8364,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, "generic-pool": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz", @@ -7252,12 +8444,12 @@ } }, "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "requires": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" } }, "global-dirs": { @@ -7270,10 +8462,13 @@ } }, "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } }, "globby": { "version": "11.0.4", @@ -7376,6 +8571,14 @@ "requires": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } } }, "he": { @@ -7450,14 +8653,6 @@ "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } } }, "import-from": { @@ -7467,6 +8662,14 @@ "dev": true, "requires": { "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } } }, "import-lazy": { @@ -7562,9 +8765,9 @@ } }, "is-core-module": { - "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==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", "dev": true, "requires": { "has": "^1.0.3" @@ -7710,9 +8913,9 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", - "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, "istanbul-lib-hook": { @@ -7734,6 +8937,14 @@ "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "istanbul-lib-processinfo": { @@ -7760,23 +8971,12 @@ "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "requires": { "debug": "^4.1.1", @@ -7793,9 +8993,9 @@ } }, "istanbul-reports": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.3.tgz", - "integrity": "sha512-0i77ZFLsb9U3DHi22WzmIngVzfoyxxbQcZRqlF3KoKmCJGq9nhFHoGi8FqBztN2rE8w6hURnZghetn0xpkVb6A==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", + "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -7835,6 +9035,18 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json5": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", @@ -7874,6 +9086,16 @@ "package-json": "^6.3.0" } }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, "lines-and-columns": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", @@ -7907,6 +9129,12 @@ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -7924,20 +9152,12 @@ "dev": true }, "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { - "yallist": "^3.0.2" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } + "yallist": "^4.0.0" } }, "lunr": { @@ -7959,6 +9179,14 @@ "dev": true, "requires": { "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "make-error": { @@ -8038,9 +9266,9 @@ "dev": true }, "mocha": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz", - "integrity": "sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", + "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", @@ -8067,12 +9295,29 @@ "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "mute-stream": { @@ -8087,6 +9332,12 @@ "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", "dev": true }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -8142,9 +9393,9 @@ } }, "node-releases": { - "version": "1.1.77", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", - "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.0.tgz", + "integrity": "sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA==", "dev": true }, "normalize-path": { @@ -8251,6 +9502,12 @@ "p-limit": "^2.2.0" } }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -8330,6 +9587,23 @@ "dev": true, "requires": { "lru-cache": "^5.1.1" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } } }, "open": { @@ -8342,6 +9616,20 @@ "is-wsl": "^2.1.1" } }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, "ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -8573,6 +9861,12 @@ "dev": true } } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, @@ -8661,9 +9955,9 @@ "dev": true }, "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "picomatch": { @@ -8720,6 +10014,12 @@ } } }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, "prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", @@ -8735,6 +10035,12 @@ "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", @@ -8751,6 +10057,12 @@ "once": "^1.3.1" } }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, "pupa": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", @@ -8870,6 +10182,12 @@ "redis-errors": "^1.0.0" } }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, "registry-auth-token": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", @@ -8925,24 +10243,6 @@ "yargs-parser": "20.2.9" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -8995,9 +10295,9 @@ "dev": true }, "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "responselike": { @@ -9077,10 +10377,13 @@ "dev": true }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "semver-diff": { "version": "3.1.1", @@ -9089,6 +10392,14 @@ "dev": true, "requires": { "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "serialize-javascript": { @@ -9133,9 +10444,9 @@ } }, "shiki": { - "version": "0.9.11", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.11.tgz", - "integrity": "sha512-tjruNTLFhU0hruCPoJP0y+B9LKOmcqUhTpxn7pcJB3fa+04gFChuEmxmrUfOJ7ZO6Jd+HwMnDHgY3lv3Tqonuw==", + "version": "0.9.12", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.12.tgz", + "integrity": "sha512-VXcROdldv0/Qu0w2XvzU4IrvTeBNs/Kj/FCmtcEXGz7Tic/veQzliJj6tEiAgoKianhQstpYmbPDStHU5Opqcw==", "dev": true, "requires": { "jsonc-parser": "^3.0.0", @@ -9172,17 +10483,6 @@ "diff": "^5.0.0", "nise": "^5.1.0", "supports-color": "^7.2.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "slash": { @@ -9303,9 +10603,9 @@ "dev": true }, "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" @@ -9322,6 +10622,12 @@ "minimatch": "^3.0.4" } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -9398,6 +10704,32 @@ "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", "dev": true }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -9405,9 +10737,9 @@ "dev": true }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, "typedarray-to-buffer": { @@ -9420,9 +10752,9 @@ } }, "typedoc": { - "version": "0.22.5", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.5.tgz", - "integrity": "sha512-KFrWGU1iKiTGw0RcyjLNYDmhd7uICU14HgBNPmFKY/sT4Pm/fraaLyWyisst9vGTUAKxqibqoDITR7+ZcAkhHg==", + "version": "0.22.6", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.6.tgz", + "integrity": "sha512-ePbJqOaz0GNkU2ehRwFwBpLD4Gp6m7jbJfHysXmDdjVKc1g8DFJ83r/LOZ9TZrkC661vgpoIY3FjSPEtUilHNA==", "dev": true, "requires": { "glob": "^7.2.0", @@ -9465,9 +10797,9 @@ } }, "typescript": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", - "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", + "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", "dev": true }, "uglify-js": { @@ -9528,27 +10860,18 @@ "requires": { "ci-info": "^2.0.0" } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } } } }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "url-join": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", @@ -9576,6 +10899,12 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, "vscode-textmate": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", @@ -9674,6 +11003,12 @@ } } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/package.json b/package.json index 80bf7aa05a6..beddb1f86df 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "scripts": { "test": "nyc -r text-summary -r html mocha -r source-map-support/register -r ts-node/register './lib/**/*.spec.ts'", "build": "tsc", + "lint": "eslint ./*.ts ./lib/**/*.ts", "documentation": "typedoc" }, "dependencies": { @@ -26,20 +27,23 @@ "@istanbuljs/nyc-config-typescript": "^1.0.1", "@tsconfig/node12": "^1.0.9", "@types/mocha": "^9.0.0", - "@types/node": "^16.10.3", + "@types/node": "^16.11.1", "@types/sinon": "^10.0.4", "@types/which": "^2.0.1", "@types/yallist": "^4.0.1", - "mocha": "^9.1.2", + "@typescript-eslint/eslint-plugin": "^5.1.0", + "@typescript-eslint/parser": "^5.1.0", + "eslint": "^8.0.1", + "mocha": "^9.1.3", "nyc": "^15.1.0", "release-it": "^14.11.6", "sinon": "^11.1.2", "source-map-support": "^0.5.20", "ts-node": "^10.3.0", - "typedoc": "^0.22.5", + "typedoc": "^0.22.6", "typedoc-github-wiki-theme": "^0.6.0", "typedoc-plugin-markdown": "^3.11.3", - "typescript": "^4.4.3", + "typescript": "^4.4.4", "which": "^2.0.2" }, "engines": { From 5be091f7a1c6725a560d75ca705212bce5fe806a Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 19 Oct 2021 16:29:42 -0400 Subject: [PATCH 056/112] fix tests with redis 6.0.x --- lib/client/index.spec.ts | 15 ++++++++++----- lib/commands/ACL_GETUSER.spec.ts | 4 ++-- lib/commands/HELLO.spec.ts | 2 ++ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/lib/client/index.spec.ts b/lib/client/index.spec.ts index 3e1bbd6aad4..3e57ff3dcf8 100644 --- a/lib/client/index.spec.ts +++ b/lib/client/index.spec.ts @@ -108,13 +108,18 @@ describe('Client', () => { password: 'wrongpassword' }); + let message; + if (isRedisVersionGreaterThan([6, 2])) { + message = 'WRONGPASS invalid username-password pair or user is disabled.'; + } else if (isRedisVersionGreaterThan([6])) { + message = 'WRONGPASS invalid username-password pair'; + } else { + message = 'ERR invalid password'; + } + await assert.rejects( client.connect(), - { - message: isRedisVersionGreaterThan([6]) ? - 'WRONGPASS invalid username-password pair or user is disabled.' : - 'ERR invalid password' - } + { message } ); assert.equal(client.isOpen, false); diff --git a/lib/commands/ACL_GETUSER.spec.ts b/lib/commands/ACL_GETUSER.spec.ts index c43cdc364ae..6bd04033836 100644 --- a/lib/commands/ACL_GETUSER.spec.ts +++ b/lib/commands/ACL_GETUSER.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { describeHandleMinimumRedisVersion, itWithClient, TestRedisServers } from '../test-utils'; +import { describeHandleMinimumRedisVersion, isRedisVersionGreaterThan, itWithClient, TestRedisServers } from '../test-utils'; import { transformArguments } from './ACL_GETUSER'; describe('ACL GETUSER', () => { @@ -20,7 +20,7 @@ describe('ACL GETUSER', () => { passwords: [], commands: '+@all', keys: ['*'], - channels: ['*'] + channels: isRedisVersionGreaterThan([6, 2]) ? ['*'] : undefined } ); }); diff --git a/lib/commands/HELLO.spec.ts b/lib/commands/HELLO.spec.ts index 7642f739d92..db4604afead 100644 --- a/lib/commands/HELLO.spec.ts +++ b/lib/commands/HELLO.spec.ts @@ -73,5 +73,7 @@ describe('HELLO', () => { modules: [] } ); + }, { + minimumRedisVersion: [6, 2] }); }); From 9f32ae728d803aff6e1bacfb198b069a863d3f52 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 19 Oct 2021 16:32:49 -0400 Subject: [PATCH 057/112] fix ACL GETUSER test --- lib/commands/ACL_GETUSER.spec.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/commands/ACL_GETUSER.spec.ts b/lib/commands/ACL_GETUSER.spec.ts index 6bd04033836..35997610f5c 100644 --- a/lib/commands/ACL_GETUSER.spec.ts +++ b/lib/commands/ACL_GETUSER.spec.ts @@ -16,11 +16,15 @@ describe('ACL GETUSER', () => { assert.deepEqual( await client.aclGetUser('default'), { - flags: ['on', 'allkeys', 'allchannels', 'allcommands', 'nopass'], passwords: [], commands: '+@all', keys: ['*'], - channels: isRedisVersionGreaterThan([6, 2]) ? ['*'] : undefined + ...(isRedisVersionGreaterThan([6, 2]) ? { + flags: ['on', 'allkeys', 'allchannels', 'allcommands', 'nopass'], + channels: ['*'] + } : { + flags: ['on', 'allkeys', 'allcommands', 'nopass'] + }) } ); }); From dd85537c5875ec20342ce03b84dcf2629c70c2d5 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 19 Oct 2021 17:14:31 -0400 Subject: [PATCH 058/112] fix client.quit and client.disconnect --- lib/client/index.spec.ts | 32 +++++++++++++++++++++++++++++--- lib/client/index.ts | 11 +++++++---- lib/client/socket.ts | 1 + lib/errors.ts | 6 ++++++ 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/lib/client/index.spec.ts b/lib/client/index.spec.ts index 3e57ff3dcf8..bdfebed5758 100644 --- a/lib/client/index.spec.ts +++ b/lib/client/index.spec.ts @@ -2,7 +2,7 @@ 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 '.'; -import { AbortError, ClientClosedError, ConnectionTimeoutError, WatchError } from '../errors'; +import { AbortError, ClientClosedError, ConnectionTimeoutError, DisconnectsClientError, WatchError } from '../errors'; import { defineScript } from '../lua-script'; import { spy } from 'sinon'; import { RedisNetSocketOptions } from '../client/socket'; @@ -636,10 +636,36 @@ describe('Client', () => { await client.connect(); try { - const quitPromise = client.quit(); + const pingPromise = client.ping(), + quitPromise = client.quit(); + assert.equal(client.isOpen, false); + + const [ping] = await Promise.all([ + pingPromise, + assert.doesNotReject(quitPromise), + assert.rejects(client.ping(), ClientClosedError) + ]); + + assert.equal(ping, 'PONG'); + } finally { + if (client.isOpen) { + await client.disconnect(); + } + } + }); + + it('client.disconnect', async () => { + const client = RedisClient.create(TEST_REDIS_SERVERS[TestRedisServers.OPEN]); + + await client.connect(); + + try { + const pingPromise = client.ping(), + disconnectPromise = client.disconnect(); assert.equal(client.isOpen, false); await Promise.all([ - quitPromise, + assert.rejects(pingPromise, DisconnectsClientError), + assert.doesNotReject(disconnectPromise), assert.rejects(client.ping(), ClientClosedError) ]); } finally { diff --git a/lib/client/index.ts b/lib/client/index.ts index 123c3f543f6..a76a56ace79 100644 --- a/lib/client/index.ts +++ b/lib/client/index.ts @@ -11,7 +11,7 @@ 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, DisconnectsClientError } from '../errors'; import { URL } from 'url'; export interface RedisClientOptions extends RedisPlugins { @@ -424,9 +424,12 @@ export default class RedisClient QUIT(): Promise { return this.#socket.quit(() => { - const promise = this.#queue.addCommand(['QUIT']); + const quitPromise = this.#queue.addCommand(['QUIT']); this.#tick(); - return promise; + return Promise.all([ + quitPromise, + this.#destroyIsolationPool() + ]); }); } @@ -519,7 +522,7 @@ export default class RedisClient } async disconnect(): Promise { - this.#queue.flushAll(new Error('Disconnecting')); + this.#queue.flushAll(new DisconnectsClientError()); await Promise.all([ this.#socket.disconnect(), this.#destroyIsolationPool() diff --git a/lib/client/socket.ts b/lib/client/socket.ts index d5309483979..923d14dffd5 100644 --- a/lib/client/socket.ts +++ b/lib/client/socket.ts @@ -222,6 +222,7 @@ export default class RedisSocket extends EventEmitter { } this.#socket.end(); + this.#socket.removeAllListeners('data'); await EventEmitter.once(this.#socket, 'end'); this.#socket = undefined; this.emit('end'); diff --git a/lib/errors.ts b/lib/errors.ts index 86a65587cf5..3f5fe40c201 100644 --- a/lib/errors.ts +++ b/lib/errors.ts @@ -21,3 +21,9 @@ export class ClientClosedError extends Error { super('The client is closed'); } } + +export class DisconnectsClientError extends Error { + constructor() { + super('Disconnects client'); + } +} From 6fc631781a97e5d3a53af580b24d4a38dff1e99b Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 19 Oct 2021 17:16:51 -0400 Subject: [PATCH 059/112] fix ACL GETUSER --- lib/commands/ACL_GETUSER.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/commands/ACL_GETUSER.spec.ts b/lib/commands/ACL_GETUSER.spec.ts index 35997610f5c..e3446162da9 100644 --- a/lib/commands/ACL_GETUSER.spec.ts +++ b/lib/commands/ACL_GETUSER.spec.ts @@ -23,7 +23,8 @@ describe('ACL GETUSER', () => { flags: ['on', 'allkeys', 'allchannels', 'allcommands', 'nopass'], channels: ['*'] } : { - flags: ['on', 'allkeys', 'allcommands', 'nopass'] + flags: ['on', 'allkeys', 'allcommands', 'nopass'], + channels: undefined }) } ); From dec504851eb26d234bcd4237914c40e099ae2083 Mon Sep 17 00:00:00 2001 From: Simon Prickett Date: Thu, 21 Oct 2021 21:48:29 +0100 Subject: [PATCH 060/112] Adds TypeScript note and corrects a typo. --- examples/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/README.md b/examples/README.md index 25b87683330..ecb84a69f80 100644 --- a/examples/README.md +++ b/examples/README.md @@ -14,20 +14,20 @@ We'd love to see more examples here. If you have an idea that you'd like to see When adding a new example, please follow these guidelines: -* Add your code in a single JavaScript file per example, directly in the `examples` folder +* Add your code in a single JavaScript or TypeScript file per example, directly in the `examples` folder * Do not introduce other dependencies in your example -* Give your `.js` file a meaningful name using `-` separators e.g. `adding-to-a-stream.js` +* Give your `.js` file a meaningful name using `-` separators e.g. `adding-to-a-stream.js` / `adding-to-a-stream.ts` * Indent your code using 2 spaces * Use the single line `//` comment style and comment your code -* Add a comment at the top of your `.js` file describing what your example does -* Add a comment at the top of your `.js` file describing any Redis commands that need to be run to set up data for your example (try and keep this minimal) +* Add a comment at the top of your `.js` / `.ts` file describing what your example does +* Add a comment at the top of your `.js` / `.ts` file describing any Redis commands that need to be run to set up data for your example (try and keep this minimal) * Use semicolons * Use `async` and `await` * Use single quotes, `'hello'` not `"hello"` * Place your example code in a single `async` function where possible, named according to the file name e.g. `add-to-stream.js` would contain `const addtoStream = async () => { ... };`, and call this function at the end of the file e.g. `addToStream();` * Unless your example requires a connection string, assume Redis is on the default localhost port 6379 with no password * Use meaningful example data, let's not use `foo`, `bar`, `baz` etc! -* Leave on empty line at the end of your `.js` file +* Leave an empty line at the end of your `.js` file * Update this `README.md` file to add your example to the table Use [connect-as-acl-user.js](connect-as-acl-user.js) as a guide to develop a well formatted example script. From d06ecc77435b69fa544bd918f585a202e2a0714d Mon Sep 17 00:00:00 2001 From: Suze Shardlow Date: Fri, 22 Oct 2021 19:57:02 +0100 Subject: [PATCH 061/112] Fixes a bug in the Scan Iterator section. (#1694) --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 63fe9d2a522..3b73d543c34 100644 --- a/README.md +++ b/README.md @@ -181,9 +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 { field, value } of client.hScanIterator('hash')) {} +for await (const member of client.sScanIterator('set')) {} +for await (const { score, member } of client.zScanIterator('sorted-set')) {} ``` You can override the default options by providing a configuration object: From 55391557ca8cac4de420cf9c854b2a9c22d8c074 Mon Sep 17 00:00:00 2001 From: Simon Prickett Date: Mon, 25 Oct 2021 22:53:22 +0100 Subject: [PATCH 062/112] Made examples use local version. --- examples/README.md | 12 ++++ examples/package-lock.json | 125 +++++++++++++++---------------------- examples/package.json | 2 +- 3 files changed, 64 insertions(+), 75 deletions(-) diff --git a/examples/README.md b/examples/README.md index ecb84a69f80..6d5d2a1f2e8 100644 --- a/examples/README.md +++ b/examples/README.md @@ -10,6 +10,18 @@ This folder contains example scripts showing how to use Node Redis in different We'd love to see more examples here. If you have an idea that you'd like to see included here, submit a Pull Request and we'll be sure to review it! Don't forget to check out our [contributing guide](../CONTRIBUTING.md). +## Setup + +To set up the examples folder so that you can run an example / develop one of your own: + +``` +$ git clone https://github.com/redis/node-redis.git +$ cd node-redis +$ npm install && npm run build +$ cd examples +$ npm install +``` + ### Coding Guidelines for Examples When adding a new example, please follow these guidelines: diff --git a/examples/package-lock.json b/examples/package-lock.json index 07eff138d1f..e99b7b2184c 100644 --- a/examples/package-lock.json +++ b/examples/package-lock.json @@ -8,103 +8,80 @@ "name": "node-redis-examples", "version": "1.0.0", "dependencies": { - "redis": "next" + "redis": "../" } }, - "node_modules/cluster-key-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz", - "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/generic-pool": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz", - "integrity": "sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/redis": { + "..": { "version": "4.0.0-rc.3", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.0.0-rc.3.tgz", - "integrity": "sha512-yvijGYWp3aOvqpFgqovUWLWSdHgjUEtScqJmjTfUXj/4kEHuSW2TERFQelIBnrGeKh8//eYlLpCFKCjDYT4NQw==", + "license": "MIT", "dependencies": { "cluster-key-slot": "1.1.0", "generic-pool": "3.8.2", "redis-parser": "3.0.0", "yallist": "4.0.0" }, - "engines": { - "node": ">=12" - } - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", - "dependencies": { - "redis-errors": "^1.0.0" + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@tsconfig/node12": "^1.0.9", + "@types/mocha": "^9.0.0", + "@types/node": "^16.11.1", + "@types/sinon": "^10.0.4", + "@types/which": "^2.0.1", + "@types/yallist": "^4.0.1", + "@typescript-eslint/eslint-plugin": "^5.1.0", + "@typescript-eslint/parser": "^5.1.0", + "eslint": "^8.0.1", + "mocha": "^9.1.3", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "sinon": "^11.1.2", + "source-map-support": "^0.5.20", + "ts-node": "^10.3.0", + "typedoc": "^0.22.6", + "typedoc-github-wiki-theme": "^0.6.0", + "typedoc-plugin-markdown": "^3.11.3", + "typescript": "^4.4.4", + "which": "^2.0.2" }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "node_modules/redis": { + "resolved": "..", + "link": true } }, "dependencies": { - "cluster-key-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz", - "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==" - }, - "generic-pool": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz", - "integrity": "sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==" - }, "redis": { - "version": "4.0.0-rc.3", - "resolved": "https://registry.npmjs.org/redis/-/redis-4.0.0-rc.3.tgz", - "integrity": "sha512-yvijGYWp3aOvqpFgqovUWLWSdHgjUEtScqJmjTfUXj/4kEHuSW2TERFQelIBnrGeKh8//eYlLpCFKCjDYT4NQw==", + "version": "file:..", "requires": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@tsconfig/node12": "^1.0.9", + "@types/mocha": "^9.0.0", + "@types/node": "^16.11.1", + "@types/sinon": "^10.0.4", + "@types/which": "^2.0.1", + "@types/yallist": "^4.0.1", + "@typescript-eslint/eslint-plugin": "^5.1.0", + "@typescript-eslint/parser": "^5.1.0", "cluster-key-slot": "1.1.0", + "eslint": "^8.0.1", "generic-pool": "3.8.2", + "mocha": "^9.1.3", + "nyc": "^15.1.0", "redis-parser": "3.0.0", + "release-it": "^14.11.6", + "sinon": "^11.1.2", + "source-map-support": "^0.5.20", + "ts-node": "^10.3.0", + "typedoc": "^0.22.6", + "typedoc-github-wiki-theme": "^0.6.0", + "typedoc-plugin-markdown": "^3.11.3", + "typescript": "^4.4.4", + "which": "^2.0.2", "yallist": "4.0.0" } - }, - "redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=" - }, - "redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", - "requires": { - "redis-errors": "^1.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } } diff --git a/examples/package.json b/examples/package.json index 69fff5b5413..4963094b0ba 100644 --- a/examples/package.json +++ b/examples/package.json @@ -8,7 +8,7 @@ }, "type": "module", "dependencies": { - "redis": "next" + "redis": "../" } } From 9a4ac34f185f91c275c071637742c70bf5c0a56b Mon Sep 17 00:00:00 2001 From: Joshua T Date: Tue, 26 Oct 2021 04:01:19 +0530 Subject: [PATCH 063/112] Add `lua-multi-incr.js` example (#1692) Also fix syntax error in the lua example in the README Closes #1689. --- README.md | 4 ++-- examples/README.md | 7 ++++--- examples/lua-multi-incr.js | 31 +++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 examples/lua-multi-incr.js diff --git a/README.md b/README.md index 3b73d543c34..97ad01df834 100644 --- a/README.md +++ b/README.md @@ -209,9 +209,9 @@ import { createClient, defineScript } from 'redis'; add: defineScript({ NUMBER_OF_KEYS: 1, SCRIPT: - "local val = redis.pcall('GET', KEYS[1]);' + 'return val + ARGV[1];", + "local val = redis.pcall('GET', KEYS[1]);" + "return val + ARGV[1];", transformArguments(key: string, toAdd: number): Array { - return [key, number.toString()]; + return [key, toAdd.toString()]; }, transformReply(reply: number): number { return reply; diff --git a/examples/README.md b/examples/README.md index 6d5d2a1f2e8..92f31d4468e 100644 --- a/examples/README.md +++ b/examples/README.md @@ -2,9 +2,10 @@ This folder contains example scripts showing how to use Node Redis in different scenarios. -| File Name | Description | -|--------------------------|--------------------------------------| -| `connect-as-acl-user.js` | Connect to Redis 6 using an ACL user | +| File Name | Description | +| ------------------------ | ----------------------------------------------------------------------------- | +| `connect-as-acl-user.js` | Connect to Redis 6 using an ACL user | +| `lua-multi-incr.js` | Define a custom lua script that allows you to perform INCRBY on multiple keys | ## Contributing diff --git a/examples/lua-multi-incr.js b/examples/lua-multi-incr.js new file mode 100644 index 00000000000..ec433c27ea2 --- /dev/null +++ b/examples/lua-multi-incr.js @@ -0,0 +1,31 @@ +// Define a custome lua script that accepts two keys and an amount to +// increment each of them by + +import { createClient, defineScript } from 'redis'; + +async function luaMultiIncr() { + const client = createClient({ + scripts: { + mincr: defineScript({ + NUMBER_OF_KEYS: 2, + SCRIPT: + 'return {' + + 'redis.pcall("INCRBY", KEYS[1], ARGV[1]),' + + 'redis.pcall("INCRBY", KEYS[2], ARGV[1])' + + '}', + transformArguments(key1, key2, increment) { + return [key1, key2, increment.toString()]; + }, + }), + }, + }); + + await client.connect(); + + await client.set('mykey', '5'); + console.log(await client.mincr('mykey', 'myotherkey', 10)); // [ 15, 10 ] + + await client.quit(); +} + +luaMultiIncr(); From 9c3c42f11372047fe9ebac0f26e13bf08ca9d563 Mon Sep 17 00:00:00 2001 From: Aditya Rastogi Date: Tue, 26 Oct 2021 04:13:47 +0530 Subject: [PATCH 064/112] Add(examples): Create an example for blPop & lPush (#1696) * Add(examples): Create an example for blPop & lPush Signed-off-by: Aditya Rastogi * Update(examples): fix case, add timeout, update readme Signed-off-by: Aditya Rastogi Closes #1693. --- examples/README.md | 7 ++++--- examples/blocking-list-pop.js | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 examples/blocking-list-pop.js diff --git a/examples/README.md b/examples/README.md index 92f31d4468e..353fa552192 100644 --- a/examples/README.md +++ b/examples/README.md @@ -2,9 +2,10 @@ This folder contains example scripts showing how to use Node Redis in different scenarios. -| File Name | Description | -| ------------------------ | ----------------------------------------------------------------------------- | -| `connect-as-acl-user.js` | Connect to Redis 6 using an ACL user | +| File Name | Description | +|--------------------------|--------------------------------------| +| `connect-as-acl-user.js` | Connect to Redis 6 using an ACL user | +| `blocking-list-pop.js` | Block until an element is pushed to a list | | `lua-multi-incr.js` | Define a custom lua script that allows you to perform INCRBY on multiple keys | ## Contributing diff --git a/examples/blocking-list-pop.js b/examples/blocking-list-pop.js new file mode 100644 index 00000000000..59dde3274a3 --- /dev/null +++ b/examples/blocking-list-pop.js @@ -0,0 +1,32 @@ +// This example shows how to use the blocking LPUSH command. + +// This code shows how to run with isolation the blPop Command to block the script while waiting for a value to be pushed to the list. +// The script will be blocked until the LPUSH command is executed. +// After which we log the list and quit the client. + +import { createClient, commandOptions } from 'redis'; + +async function blockingListPop() { + const client = createClient(); + + await client.connect(); + + const keyName = 'keyName'; + + const blpopPromise = client.blPop( + commandOptions({ isolated: true }), + keyName, + 0 + ); + + await client.lPush(keyName, 'value'); + + await blpopPromise; + + console.log('blpopPromise resolved'); + console.log(keyName); + + await client.quit(); +} + +blockingListPop(); From fdffa2383fb74671fe96491ecd83eaf7c64e956c Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Wed, 27 Oct 2021 04:52:19 +0530 Subject: [PATCH 065/112] Add command-with-modifiers.js example (#1695) * Adds TypeScript note and corrects a typo. * Adds command-with-modifiers example. (redis#1688) * Adds command-with-modifiers example. (redis#1688) * Adds command-with-modifiers example. (redis#1688) * Removed callbacks. Co-authored-by: Simon Prickett Closes #1688. --- examples/README.md | 11 +++++----- examples/command-with-modifiers.js | 32 ++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 examples/command-with-modifiers.js diff --git a/examples/README.md b/examples/README.md index 353fa552192..07cbf8b3737 100644 --- a/examples/README.md +++ b/examples/README.md @@ -2,11 +2,12 @@ This folder contains example scripts showing how to use Node Redis in different scenarios. -| File Name | Description | -|--------------------------|--------------------------------------| -| `connect-as-acl-user.js` | Connect to Redis 6 using an ACL user | -| `blocking-list-pop.js` | Block until an element is pushed to a list | -| `lua-multi-incr.js` | Define a custom lua script that allows you to perform INCRBY on multiple keys | +| File Name | Description | +|-----------------------------|--------------------------------------| +| `connect-as-acl-user.js` | Connect to Redis 6 using an ACL user | +| `blocking-list-pop.js` | Block until an element is pushed to a list | +| `lua-multi-incr.js` | Define a custom lua script that allows you to perform INCRBY on multiple keys | +| `command-with-modifiers.js` | Define a script that allows to run a command with several modifiers | ## Contributing diff --git a/examples/command-with-modifiers.js b/examples/command-with-modifiers.js new file mode 100644 index 00000000000..2932aec0d64 --- /dev/null +++ b/examples/command-with-modifiers.js @@ -0,0 +1,32 @@ +// Define a custom script that shows example of SET command +// with several modifiers. + +import { createClient } from 'redis'; + +async function commandWithModifiers() { + const client = createClient(); + + await client.connect(); + await client.del('mykey'); + + let result = await client.set('mykey', 'myvalue', { + EX: 60, + GET: true + } + ); + + console.log(result); //nil + + result = await client.set('mykey', 'newvalue', { + EX: 60, + GET: true + } + ); + + console.log(result); //myvalue + + await client.quit(); +} + +commandWithModifiers(); + From d409120e5be6e96a3d5d6efef1e4532f48b45182 Mon Sep 17 00:00:00 2001 From: Kalki Date: Thu, 28 Oct 2021 02:24:12 +0530 Subject: [PATCH 066/112] Issue # 1697 FIX - creates an example script that shows how to use the SSCAN iterator (#1699) * #1697 fix for set scan example * adds the js file * adds comment * Minor layout and comment adjustment. Co-authored-by: srawat2 Co-authored-by: Simon Prickett Closes #1697. --- examples/README.md | 1 + examples/set-scan.js | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 examples/set-scan.js diff --git a/examples/README.md b/examples/README.md index 07cbf8b3737..2b8fbec9277 100644 --- a/examples/README.md +++ b/examples/README.md @@ -8,6 +8,7 @@ This folder contains example scripts showing how to use Node Redis in different | `blocking-list-pop.js` | Block until an element is pushed to a list | | `lua-multi-incr.js` | Define a custom lua script that allows you to perform INCRBY on multiple keys | | `command-with-modifiers.js` | Define a script that allows to run a command with several modifiers | +| `set-scan.js` | An example script that shows how to use the SSCAN iterator functionality | ## Contributing diff --git a/examples/set-scan.js b/examples/set-scan.js new file mode 100644 index 00000000000..3cca05b152d --- /dev/null +++ b/examples/set-scan.js @@ -0,0 +1,19 @@ +// An example script that shows how to use the SSCAN iterator functionality to retrieve the contents of a Redis set. +// Create the set in redis-cli with this command: +// sadd setName a b c d e f g h i j k l m n o p q + +import { createClient } from 'redis'; + +async function setScan() { + const client = createClient(); + await client.connect(); + + const setName = 'setName'; + for await (const member of client.sScanIterator(setName)) { + console.log(member); + } + + await client.quit(); +} + +setScan(); From f6f9b3dccd4152d221f0d9bba4bbe512f4a30629 Mon Sep 17 00:00:00 2001 From: Leibale Eidelman Date: Sun, 31 Oct 2021 21:09:51 -0400 Subject: [PATCH 067/112] fix #1706 - HSET return type should be number --- lib/commands/HSET.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/commands/HSET.ts b/lib/commands/HSET.ts index 1d4acd6c018..4c60b91ad89 100644 --- a/lib/commands/HSET.ts +++ b/lib/commands/HSET.ts @@ -46,4 +46,4 @@ function pushObject(args: Array, object: HSETObject): void { } } -export declare function transformReply(): string; +export declare function transformReply(): number; From 5cff3320d2213c504695f694d7b742df3f5e11c9 Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 1 Nov 2021 11:30:25 -0400 Subject: [PATCH 068/112] use dockers for tests, fix some bugs --- .eslintrc.json | 5 +- .github/workflows/tests.yml | 10 +- .nycrc.json | 2 +- README.md | 2 +- docs/clustering.md | 2 +- lib/client/commands-queue.ts | 8 +- lib/client/index.spec.ts | 474 ++++----- lib/client/index.ts | 26 +- lib/client/socket.spec.ts | 2 +- lib/client/socket.ts | 73 +- lib/cluster/index.spec.ts | 57 +- lib/commands/ACL_CAT.spec.ts | 4 +- lib/commands/ACL_DELUSER.spec.ts | 8 +- lib/commands/ACL_GENPASS.spec.ts | 4 +- lib/commands/ACL_GETUSER.spec.ts | 10 +- lib/commands/ACL_LIST.spec.ts | 4 +- lib/commands/ACL_LOAD.spec.ts | 4 +- lib/commands/ACL_LOG.spec.ts | 4 +- lib/commands/ACL_LOG_RESET.spec.ts | 4 +- lib/commands/ACL_SAVE.spec.ts | 4 +- lib/commands/ACL_SETUSER.spec.ts | 4 +- lib/commands/ACL_USERS.spec.ts | 4 +- lib/commands/ACL_WHOAMI.spec.ts | 4 +- lib/commands/APPEND.spec.ts | 2 +- lib/commands/BITCOUNT.spec.ts | 6 +- lib/commands/BITFIELD.spec.ts | 6 +- lib/commands/BITOP.spec.ts | 10 +- lib/commands/BITPOS.spec.ts | 10 +- lib/commands/BLMOVE.spec.ts | 12 +- lib/commands/BLPOP.spec.ts | 10 +- lib/commands/BRPOP.spec.ts | 10 +- lib/commands/BRPOPLPUSH.spec.ts | 10 +- lib/commands/BZPOPMAX.spec.ts | 6 +- lib/commands/BZPOPMIN.spec.ts | 6 +- lib/commands/CLIENT_ID.spec.ts | 6 +- lib/commands/CLUSTER_SLOTS.spec.ts | 2 +- lib/commands/COMMAND.spec.ts | 23 +- lib/commands/COMMAND_COUNT.spec.ts | 6 +- lib/commands/COMMAND_GETKEYS.spec.ts | 6 +- lib/commands/COMMAND_INFO.spec.ts | 42 +- lib/commands/COPY.spec.ts | 8 +- lib/commands/DBSIZE.spec.ts | 6 +- lib/commands/DECR.spec.ts | 6 +- lib/commands/DECRBY.spec.ts | 6 +- lib/commands/DEL.spec.ts | 6 +- lib/commands/DUMP.spec.ts | 6 +- lib/commands/ECHO.spec.ts | 6 +- lib/commands/EVAL.spec.ts | 10 +- lib/commands/EXISTS.spec.ts | 6 +- lib/commands/EXPIRE.spec.ts | 6 +- lib/commands/EXPIREAT.spec.ts | 8 +- lib/commands/FLUSHALL.spec.ts | 6 +- lib/commands/FLUSHDB.spec.ts | 6 +- lib/commands/GEOADD.spec.ts | 10 +- lib/commands/GEODIST.spec.ts | 14 +- lib/commands/GEOHASH.spec.ts | 10 +- lib/commands/GEOPOS.spec.ts | 14 +- lib/commands/GEOSEARCH.spec.ts | 12 +- lib/commands/GEOSEARCHSTORE.spec.ts | 12 +- lib/commands/GEOSEARCH_WITH.spec.ts | 14 +- lib/commands/GET.spec.ts | 10 +- lib/commands/GETBIT.spec.ts | 10 +- lib/commands/GETDEL.spec.ts | 13 +- lib/commands/GETEX.spec.ts | 12 +- lib/commands/GETRANGE.spec.ts | 11 +- lib/commands/GETSET.spec.ts | 10 +- lib/commands/GET_BUFFER.spec.ts | 10 +- lib/commands/HDEL.spec.ts | 6 +- lib/commands/HELLO.spec.ts | 29 +- lib/commands/HEXISTS.spec.ts | 6 +- lib/commands/HGET.spec.ts | 6 +- lib/commands/HGETALL.spec.ts | 6 +- lib/commands/HINCRBY.spec.ts | 6 +- lib/commands/HINCRBYFLOAT.spec.ts | 6 +- lib/commands/HKEYS.spec.ts | 6 +- lib/commands/HLEN.spec.ts | 6 +- lib/commands/HMGET.spec.ts | 6 +- lib/commands/HRANDFIELD.spec.ts | 8 +- lib/commands/HRANDFIELD_COUNT.spec.ts | 8 +- .../HRANDFIELD_COUNT_WITHVALUES.spec.ts | 8 +- lib/commands/HSCAN.spec.ts | 6 +- lib/commands/HSET.spec.ts | 10 +- lib/commands/HSETNX.spec.ts | 6 +- lib/commands/HSTRLEN.spec.ts | 6 +- lib/commands/HVALS.spec.ts | 6 +- lib/commands/INCR.spec.ts | 6 +- lib/commands/INCRBY.spec.ts | 6 +- lib/commands/INCRBYFLOAT.spec.ts | 6 +- lib/commands/KEYS.spec.ts | 6 +- lib/commands/LASTSAVE.spec.ts | 6 +- lib/commands/LINDEX.spec.ts | 10 +- lib/commands/LINSERT.spec.ts | 10 +- lib/commands/LLEN.spec.ts | 10 +- lib/commands/LMOVE.spec.ts | 12 +- lib/commands/LOLWUT.spec.ts | 7 +- lib/commands/LPOP.spec.ts | 10 +- lib/commands/LPOP_COUNT.spec.ts | 12 +- lib/commands/LPOS.spec.ts | 12 +- lib/commands/LPOS_COUNT.spec.ts | 12 +- lib/commands/LPUSH.spec.ts | 10 +- lib/commands/LPUSHX.spec.ts | 10 +- lib/commands/LRANGE.spec.ts | 10 +- lib/commands/LREM.spec.ts | 10 +- lib/commands/LSET.spec.ts | 10 +- lib/commands/LTRIM.spec.ts | 10 +- lib/commands/LTRIM.ts | 2 +- lib/commands/MEMORY_DOCTOR.spec.ts | 6 +- lib/commands/MEMORY_MALLOC-STATS.spec.ts | 6 +- lib/commands/MEMORY_PURGE.spec.ts | 6 +- lib/commands/MEMORY_USAGE.spec.ts | 6 +- lib/commands/MGET.spec.ts | 10 +- lib/commands/MOVE.spec.ts | 6 +- lib/commands/MSET.spec.ts | 10 +- lib/commands/MSETNX.spec.ts | 10 +- lib/commands/PERSIST.spec.ts | 6 +- lib/commands/PEXPIRE.spec.ts | 6 +- lib/commands/PEXPIREAT.spec.ts | 8 +- lib/commands/PFADD.spec.ts | 6 +- lib/commands/PFCOUNT.spec.ts | 6 +- lib/commands/PFMERGE.spec.ts | 6 +- lib/commands/PING.spec.ts | 6 +- lib/commands/PSETEX.spec.ts | 10 +- lib/commands/PTTL.spec.ts | 6 +- lib/commands/PUBLISH.spec.ts | 6 +- lib/commands/PUBSUB_CHANNELS.spec.ts | 6 +- lib/commands/PUBSUB_NUMPAT.spec.ts | 6 +- lib/commands/PUBSUB_NUMSUB.spec.ts | 6 +- lib/commands/RANDOMKEY.spec.ts | 6 +- lib/commands/RENAME.spec.ts | 6 +- lib/commands/RENAMENX.spec.ts | 6 +- lib/commands/ROLE.spec.ts | 6 +- lib/commands/RPOP.spec.ts | 10 +- lib/commands/RPOPLPUSH.spec.ts | 10 +- lib/commands/RPOP_COUNT.spec.ts | 12 +- lib/commands/RPUSH.spec.ts | 10 +- lib/commands/RPUSHX.spec.ts | 10 +- lib/commands/SADD.spec.ts | 6 +- lib/commands/SCAN.spec.ts | 6 +- lib/commands/SCARD.spec.ts | 6 +- lib/commands/SCRIPT_DEBUG.spec.ts | 6 +- lib/commands/SCRIPT_EXISTS.spec.ts | 6 +- lib/commands/SCRIPT_FLUSH.spec.ts | 6 +- lib/commands/SCRIPT_LOAD.spec.ts | 6 +- lib/commands/SDIFF.spec.ts | 6 +- lib/commands/SDIFFSTORE.spec.ts | 6 +- lib/commands/SET.spec.ts | 13 +- lib/commands/SETBIT.spec.ts | 10 +- lib/commands/SETEX.spec.ts | 10 +- lib/commands/SETNX .spec.ts | 10 +- lib/commands/SETRANGE.spec.ts | 10 +- lib/commands/SINTER.spec.ts | 6 +- lib/commands/SINTERSTORE.spec.ts | 6 +- lib/commands/SISMEMBER.spec.ts | 8 +- lib/commands/SMEMBERS.spec.ts | 6 +- lib/commands/SMISMEMBER.spec.ts | 8 +- lib/commands/SMOVE.spec.ts | 6 +- lib/commands/SORT.spec.ts | 8 +- lib/commands/SPOP.spec.ts | 6 +- lib/commands/SRANDMEMBER.spec.ts | 6 +- lib/commands/SRANDMEMBER_COUNT.spec.ts | 6 +- lib/commands/SREM.spec.ts | 6 +- lib/commands/SSCAN.spec.ts | 6 +- lib/commands/STRLEN.spec.ts | 10 +- lib/commands/SUNION.spec.ts | 6 +- lib/commands/SUNIONSTORE.spec.ts | 6 +- lib/commands/SWAPDB.spec.ts | 6 +- lib/commands/TIME.spec.ts | 6 +- lib/commands/TOUCH.spec.ts | 6 +- lib/commands/TTL.spec.ts | 6 +- lib/commands/TYPE.spec.ts | 6 +- lib/commands/UNLINK.spec.ts | 6 +- lib/commands/UNWATCH.spec.ts | 6 +- lib/commands/WAIT.spec.ts | 6 +- lib/commands/XACK.spec.ts | 6 +- lib/commands/XADD.spec.ts | 8 +- lib/commands/XAUTOCLAIM.spec.ts | 10 +- lib/commands/XAUTOCLAIM_JUSTID.spec.ts | 8 +- lib/commands/XCLAIM.spec.ts | 8 +- lib/commands/XCLAIM_JUSTID.spec.ts | 8 +- lib/commands/XDEL.spec.ts | 6 +- lib/commands/XGROUP_CREATE.spec.ts | 6 +- lib/commands/XGROUP_CREATECONSUMER.spec.ts | 10 +- lib/commands/XGROUP_DELCONSUMER.spec.ts | 8 +- lib/commands/XGROUP_DESTROY.spec.ts | 8 +- lib/commands/XGROUP_SETID.spec.ts | 6 +- lib/commands/XINFO_CONSUMERS.spec.ts | 8 +- lib/commands/XINFO_GROUPS.spec.ts | 8 +- lib/commands/XINFO_STREAM.spec.ts | 6 +- lib/commands/XLEN.spec.ts | 6 +- lib/commands/XPENDING.spec.ts | 6 +- lib/commands/XPENDING_RANGE.spec.ts | 10 +- lib/commands/XRANGE.spec.ts | 8 +- lib/commands/XREAD.spec.ts | 10 +- lib/commands/XREADGROUP.spec.ts | 44 +- lib/commands/XREVRANGE.spec.ts | 8 +- lib/commands/XTRIM.spec.ts | 6 +- lib/commands/ZADD.spec.ts | 6 +- lib/commands/ZCARD.spec.ts | 6 +- lib/commands/ZCOUNT.spec.ts | 6 +- lib/commands/ZDIFF.spec.ts | 8 +- lib/commands/ZDIFFSTORE.spec.ts | 8 +- lib/commands/ZDIFF_WITHSCORES.spec.ts | 8 +- lib/commands/ZINCRBY.spec.ts | 6 +- lib/commands/ZINTER.spec.ts | 10 +- lib/commands/ZINTERSTORE.spec.ts | 6 +- lib/commands/ZINTER_WITHSCORES.spec.ts | 8 +- lib/commands/ZLEXCOUNT.spec.ts | 6 +- lib/commands/ZMSCORE.spec.ts | 8 +- lib/commands/ZPOPMAX.spec.ts | 10 +- lib/commands/ZPOPMAX_COUNT.spec.ts | 6 +- lib/commands/ZPOPMIN.spec.ts | 10 +- lib/commands/ZPOPMIN_COUNT.spec.ts | 6 +- lib/commands/ZRANDMEMBER.spec.ts | 8 +- lib/commands/ZRANDMEMBER_COUNT.spec.ts | 8 +- .../ZRANDMEMBER_COUNT_WITHSCORES.spec.ts | 8 +- lib/commands/ZRANGE.spec.ts | 6 +- lib/commands/ZRANGEBYLEX.spec.ts | 6 +- lib/commands/ZRANGEBYSCORE.spec.ts | 6 +- lib/commands/ZRANGEBYSCORE_WITHSCORES.spec.ts | 6 +- lib/commands/ZRANGESTORE.spec.ts | 9 +- lib/commands/ZRANGE_WITHSCORES.spec.ts | 6 +- lib/commands/ZRANK.spec.ts | 6 +- lib/commands/ZREM.spec.ts | 6 +- lib/commands/ZREMRANGEBYLEX.spec.ts | 6 +- lib/commands/ZREMRANGEBYRANK.spec.ts | 6 +- lib/commands/ZREMRANGEBYSCORE.spec.ts | 6 +- lib/commands/ZREVRANK.spec.ts | 6 +- lib/commands/ZSCAN.spec.ts | 6 +- lib/commands/ZSCORE.spec.ts | 6 +- lib/commands/ZUNION.spec.ts | 8 +- lib/commands/ZUNIONSTORE.spec.ts | 6 +- lib/commands/ZUNION_WITHSCORES.spec.ts | 8 +- lib/commands/generic-transformers.spec.ts | 2 +- lib/errors.ts | 6 + lib/test-utils.ts | 384 -------- lib/test-utils/dockers.ts | 215 ++++ lib/test-utils/index.ts | 49 + lib/test-utils/test-utils.ts | 175 ++++ package-lock.json | 915 +++++++++--------- package.json | 18 +- 240 files changed, 2124 insertions(+), 2046 deletions(-) delete mode 100644 lib/test-utils.ts create mode 100644 lib/test-utils/dockers.ts create mode 100644 lib/test-utils/index.ts create mode 100644 lib/test-utils/test-utils.ts diff --git a/.eslintrc.json b/.eslintrc.json index 9378001252c..4536bc31338 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -8,5 +8,8 @@ "eslint:recommended", "plugin:@typescript-eslint/eslint-recommended", "plugin:@typescript-eslint/recommended" - ] + ], + "rules": { + "semi": [2, "always"] + } } diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 7ef80685d56..b6b2dd050eb 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,7 +13,7 @@ jobs: fail-fast: false matrix: node-version: [12.x, 14.x, 16.x] - redis-version: [5.x, 6.0.x, 6.2.x] + redis-version: [5, 6.0, 6.2] steps: - uses: actions/checkout@v2.3.4 @@ -25,17 +25,11 @@ jobs: with: node-version: ${{ matrix.node-version }} - - name: Setup Redis - uses: shogo82148/actions-setup-redis@v1.12.0 - with: - redis-version: ${{ matrix.redis-version }} - auto-start: "false" - - name: Install Packages run: npm ci - name: Run Tests - run: npm run test + run: npm run test -- --forbid-only --redis-version=${{ matrix.redis-version }} - name: Generate lcov run: ./node_modules/.bin/nyc report -r lcov diff --git a/.nycrc.json b/.nycrc.json index 925d954248c..918b308a898 100644 --- a/.nycrc.json +++ b/.nycrc.json @@ -1,4 +1,4 @@ { "extends": "@istanbuljs/nyc-config-typescript", - "exclude": ["**/*.spec.ts", "lib/test-utils.ts"] + "exclude": ["**/*.spec.ts", "lib/test-utils/**/*.ts"] } \ No newline at end of file diff --git a/README.md b/README.md index 97ad01df834..9fe9e70a253 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,7 @@ This pattern works especially well for blocking commands—such as `BLPOP` and ` ```typescript import { commandOptions } from 'redis'; -const blPopPromise = client.blPop(commandOptions({ isolated: true }), 'key'); +const blPopPromise = client.blPop(commandOptions({ isolated: true }), 'key', 0); await client.lPush('key', ['1', '2']); diff --git a/docs/clustering.md b/docs/clustering.md index 028ebea81d5..a84dc3b1aa4 100644 --- a/docs/clustering.md +++ b/docs/clustering.md @@ -45,7 +45,7 @@ import { createCluster } from 'redis'; Commands such as `GET`, `SET`, etc. will be routed by the first key, for instance `MGET 1 2 3` will be routed by the key `1`. -### [Server Commands][https://redis.io/commands#server] +### [Server Commands](https://redis.io/commands#server) Admin commands such as `MEMORY STATS`, `FLUSHALL`, etc. are not attached to the cluster, and should be executed on a specific node using `.getSlot()` or `.getAllMasters()`. diff --git a/lib/client/commands-queue.ts b/lib/client/commands-queue.ts index c07e582238c..4e2a66c606e 100644 --- a/lib/client/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 { RedisCommandRawReply } from '../commands'; +import { RedisCommandArguments, RedisCommandRawReply } from '../commands'; export interface QueueCommandOptions { asap?: boolean; @@ -10,7 +10,7 @@ export interface QueueCommandOptions { } interface CommandWaitingToBeSent extends CommandWaitingForReply { - args: Array; + args: RedisCommandArguments; chainId?: symbol; abort?: { signal: AbortSignal; @@ -107,7 +107,7 @@ export default class RedisCommandsQueue { this.#maxLength = maxLength; } - addCommand(args: Array, options?: QueueCommandOptions, bufferMode?: boolean): Promise { + addCommand(args: RedisCommandArguments, 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) { @@ -247,7 +247,7 @@ export default class RedisCommandsQueue { ]); } - getCommandToSend(): Array | undefined { + getCommandToSend(): RedisCommandArguments | undefined { const toSend = this.#waitingToBeSent.shift(); if (toSend) { diff --git a/lib/client/index.spec.ts b/lib/client/index.spec.ts index bdfebed5758..51dded18b1f 100644 --- a/lib/client/index.spec.ts +++ b/lib/client/index.spec.ts @@ -1,11 +1,12 @@ -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 '.'; -import { AbortError, ClientClosedError, ConnectionTimeoutError, DisconnectsClientError, WatchError } from '../errors'; +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL, waitTillBeenCalled } from '../test-utils'; +import RedisClient, { RedisClientType } from '.'; +import { RedisClientMultiCommandType } from './multi-command'; +import { RedisCommandArguments, RedisCommandRawReply, RedisModules, RedisScripts } from '../commands'; +import { AbortError, ClientClosedError, ConnectionTimeoutError, DisconnectsClientError, SocketClosedUnexpectedlyError, WatchError } from '../errors'; import { defineScript } from '../lua-script'; import { spy } from 'sinon'; -import { RedisNetSocketOptions } from '../client/socket'; +import { once } from 'events'; export const SQUARE_SCRIPT = defineScript({ NUMBER_OF_KEYS: 0, @@ -75,43 +76,21 @@ describe('Client', () => { } ); }); - - it('createClient with url', async () => { - const client = RedisClient.create({ - url: `redis://localhost:${(TEST_REDIS_SERVERS[TestRedisServers.OPEN].socket as RedisNetSocketOptions)!.port!.toString()}/1` - }); - - await client.connect(); - - try { - assert.equal( - await client.ping(), - 'PONG' - ); - } finally { - await client.disconnect(); - } - }) }); describe('authentication', () => { - itWithClient(TestRedisServers.PASSWORD, 'Client should be authenticated', async client => { + testUtils.testWithClient('Client should be authenticated', async client => { assert.equal( await client.ping(), 'PONG' ); - }); - - it('should not retry connecting if failed due to wrong auth', async () => { - const client = RedisClient.create({ - ...TEST_REDIS_SERVERS[TestRedisServers.PASSWORD], - password: 'wrongpassword' - }); + }, GLOBAL.SERVERS.PASSWORD); + testUtils.testWithClient('should not retry connecting if failed due to wrong auth', async client => { let message; - if (isRedisVersionGreaterThan([6, 2])) { + if (testUtils.isVersionGreaterThan([6, 2])) { message = 'WRONGPASS invalid username-password pair or user is disabled.'; - } else if (isRedisVersionGreaterThan([6])) { + } else if (testUtils.isVersionGreaterThan([6])) { message = 'WRONGPASS invalid username-password pair'; } else { message = 'ERR invalid password'; @@ -123,173 +102,216 @@ describe('Client', () => { ); assert.equal(client.isOpen, false); + }, { + ...GLOBAL.SERVERS.PASSWORD, + clientOptions: { + password: 'wrongpassword' + }, + disableClientSetup: true }); - itWithClient(TestRedisServers.PASSWORD, 'should execute AUTH before SELECT', async client => { + testUtils.testWithClient('should execute AUTH before SELECT', async client => { assert.equal( (await client.clientInfo()).db, 2 ); }, { - minimumRedisVersion: [6, 2], + ...GLOBAL.SERVERS.PASSWORD, clientOptions: { + ...GLOBAL.SERVERS.PASSWORD.clientOptions, database: 2 - } + }, + minimumDockerVersion: [6, 2] }); }); describe('legacyMode', () => { - const client = RedisClient.create({ - ...TEST_REDIS_SERVERS[TestRedisServers.OPEN], - scripts: { - square: SQUARE_SCRIPT - }, - legacyMode: true - }); - - before(() => client.connect()); - afterEach(() => client.v4.flushAll()); - after(() => client.disconnect()); - - it('client.sendCommand should call the callback', done => { - (client as any).sendCommand('PING', (err?: Error, reply?: string) => { - if (err) { - return done(err); - } + function sendCommandAsync(client: RedisClientType, args: RedisCommandArguments): Promise { + return new Promise((resolve, reject) => { + (client as any).sendCommand(args, (err: Error | undefined, reply: RedisCommandRawReply) => { + if (err) return reject(err); - try { - assert.equal(reply, 'PONG'); - done(); - } catch (err) { - done(err); - } + resolve(reply); + }); }); + } + + testUtils.testWithClient('client.sendCommand should call the callback', async client => { + assert.equal( + await sendCommandAsync(client, ['PING']), + 'PONG' + ); + }, { + ...GLOBAL.SERVERS.OPEN, + clientOptions: { + legacyMode: true + } }); - it('client.sendCommand should work without callback', async () => { - (client as any).sendCommand('PING'); + testUtils.testWithClient('client.sendCommand should work without callback', async client => { + client.sendCommand(['PING']); await client.v4.ping(); // make sure the first command was replied + }, { + ...GLOBAL.SERVERS.OPEN, + clientOptions: { + legacyMode: true + } }); - it('client.v4.sendCommand should return a promise', async () => { + testUtils.testWithClient('client.v4.sendCommand should return a promise', async client => { assert.equal( await client.v4.sendCommand(['PING']), 'PONG' ); + }, { + ...GLOBAL.SERVERS.OPEN, + clientOptions: { + legacyMode: true + } }); - it('client.{command} should accept vardict arguments', done => { - (client as any).set('a', 'b', (err?: Error, reply?: string) => { - if (err) { - return done(err); - } + function setAsync(client: RedisClientType, ...args: Array): Promise { + return new Promise((resolve, reject) => { + (client as any).set(...args, (err: Error | undefined, reply: RedisCommandRawReply) => { + if (err) return reject(err); - try { - assert.equal(reply, 'OK'); - done(); - } catch (err) { - done(err); - } + resolve(reply); + }); }); - }); - - it('client.{command} should accept arguments array', done => { - (client as any).set(['a', 'b'], (err?: Error, reply?: string) => { - if (err) { - return done(err); - } + } - try { - assert.equal(reply, 'OK'); - done(); - } catch (err) { - done(err); - } - }); + testUtils.testWithClient('client.{command} should accept vardict arguments', async client => { + assert.equal( + await setAsync(client, 'a', 'b'), + 'OK' + ); + }, { + ...GLOBAL.SERVERS.OPEN, + clientOptions: { + legacyMode: true + } }); - it('client.{command} should accept mix of strings and array of strings', done => { - (client as any).set(['a'], 'b', ['XX'], (err?: Error, reply?: string) => { - if (err) { - return done(err); - } + testUtils.testWithClient('client.{command} should accept arguments array', async client => { + assert.equal( + await setAsync(client, ['a', 'b']), + 'OK' + ); + }, { + ...GLOBAL.SERVERS.OPEN, + clientOptions: { + legacyMode: true + } + }); - try { - assert.equal(reply, null); - done(); - } catch (err) { - done(err); - } - }); + testUtils.testWithClient('client.{command} should accept mix of strings and array of strings', async client => { + assert.equal( + await setAsync(client, ['a'], 'b', ['XX']), + null + ); + }, { + ...GLOBAL.SERVERS.OPEN, + clientOptions: { + legacyMode: true + } }); - it('client.multi.ping.exec should call the callback', done => { - (client as any).multi() - .ping() - .exec((err?: Error, reply?: string) => { - if (err) { - return done(err); - } + function multiExecAsync(multi: RedisClientMultiCommandType): Promise> { + return new Promise((resolve, reject) => { + (multi as any).exec((err: Error | undefined, replies: Array) => { + if (err) return reject(err); - try { - assert.deepEqual(reply, ['PONG']); - done(); - } catch (err) { - done(err); - } + resolve(replies); }); + }); + } + + testUtils.testWithClient('client.multi.ping.exec should call the callback', async client => { + assert.deepEqual( + await multiExecAsync( + client.multi().ping() + ), + ['PONG'] + ); + }, { + ...GLOBAL.SERVERS.OPEN, + clientOptions: { + legacyMode: true + } }); - it('client.multi.ping.exec should work without callback', async () => { - (client as any).multi() + testUtils.testWithClient('client.multi.ping.exec should call the callback', async client => { + client.multi() .ping() .exec(); await client.v4.ping(); // make sure the first command was replied + }, { + ...GLOBAL.SERVERS.OPEN, + clientOptions: { + legacyMode: true + } }); - it('client.multi.ping.v4.ping.v4.exec should return a promise', async () => { + testUtils.testWithClient('client.multi.ping.v4.ping.v4.exec should return a promise', async client => { assert.deepEqual( - await ((client as any).multi() + await client.multi() .ping() .v4.ping() - .v4.exec()), + .v4.exec(), ['PONG', 'PONG'] ); + }, { + ...GLOBAL.SERVERS.OPEN, + clientOptions: { + legacyMode: true + } }); - it('client.{script} should return a promise', async () => { - assert.equal(await client.square(2), 4); + testUtils.testWithClient('client.{script} should return a promise', async client => { + assert.equal( + await client.square(2), + 4 + ); + }, { + ...GLOBAL.SERVERS.OPEN, + clientOptions: { + legacyMode: true, + scripts: { + square: SQUARE_SCRIPT + } + } }); }); describe('events', () => { - it('connect, ready, end', async () => { - const client = RedisClient.create(TEST_REDIS_SERVERS[TestRedisServers.OPEN]); - + testUtils.testWithClient('connect, ready, end', async client => { await Promise.all([ - client.connect(), once(client, 'connect'), - once(client, 'ready') + once(client, 'ready'), + client.connect() ]); await Promise.all([ - client.disconnect(), - once(client, 'end') + once(client, 'end'), + client.disconnect() ]); + }, { + ...GLOBAL.SERVERS.OPEN, + disableClientSetup: true }); }); describe('sendCommand', () => { - itWithClient(TestRedisServers.OPEN, 'PING', async client => { + testUtils.testWithClient('PING', async client => { assert.equal(await client.sendCommand(['PING']), 'PONG'); - }); + }, GLOBAL.SERVERS.OPEN); - itWithClient(TestRedisServers.OPEN, 'bufferMode', async client => { + testUtils.testWithClient('bufferMode', async client => { assert.deepEqual( await client.sendCommand(['PING'], undefined, true), Buffer.from('PONG') ); - }); + }, GLOBAL.SERVERS.OPEN); describe('AbortController', () => { before(function () { @@ -298,13 +320,13 @@ describe('Client', () => { } }); - itWithClient(TestRedisServers.OPEN, 'success', async client => { + testUtils.testWithClient('success', async client => { await client.sendCommand(['PING'], { signal: new AbortController().signal }); - }); + }, GLOBAL.SERVERS.OPEN); - itWithClient(TestRedisServers.OPEN, 'AbortError', client => { + testUtils.testWithClient('AbortError', client => { const controller = new AbortController(); controller.abort(); @@ -314,12 +336,12 @@ describe('Client', () => { }), AbortError ); - }); + }, GLOBAL.SERVERS.OPEN); }); }); describe('multi', () => { - itWithClient(TestRedisServers.OPEN, 'simple', async client => { + testUtils.testWithClient('simple', async client => { assert.deepEqual( await client.multi() .ping() @@ -328,23 +350,19 @@ describe('Client', () => { .exec(), ['PONG', 'OK', 'value'] ); - }); - - itWithClient(TestRedisServers.OPEN, 'should reject the whole chain on error', client => { - client.on('error', () => { - // ignore errors - }); + }, GLOBAL.SERVERS.OPEN); + testUtils.testWithClient('should reject the whole chain on error', client => { return assert.rejects( client.multi() .ping() - .addCommand(['DEBUG', 'RESTART']) + .addCommand(['INVALID COMMAND']) .ping() .exec() ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithClient(TestRedisServers.OPEN, 'with script', async client => { + testUtils.testWithClient('with script', async client => { assert.deepEqual( await client.multi() .square(2) @@ -352,6 +370,7 @@ describe('Client', () => { [4] ); }, { + ...GLOBAL.SERVERS.OPEN, clientOptions: { scripts: { square: SQUARE_SCRIPT @@ -359,7 +378,7 @@ describe('Client', () => { } }); - itWithClient(TestRedisServers.OPEN, 'WatchError', async client => { + testUtils.testWithClient('WatchError', async client => { await client.watch('key'); await client.set( @@ -376,24 +395,25 @@ describe('Client', () => { .exec(), WatchError ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithClient(TestRedisServers.OPEN, 'execAsPipeline', async client => { + testUtils.testWithClient('execAsPipeline', async client => { assert.deepEqual( await client.multi() .ping() .exec(true), ['PONG'] ); - }); + }, GLOBAL.SERVERS.OPEN); }); - itWithClient(TestRedisServers.OPEN, 'scripts', async client => { + testUtils.testWithClient('scripts', async client => { assert.equal( await client.square(2), 4 ); }, { + ...GLOBAL.SERVERS.OPEN, clientOptions: { scripts: { square: SQUARE_SCRIPT @@ -401,12 +421,13 @@ describe('Client', () => { } }); - itWithClient(TestRedisServers.OPEN, 'modules', async client => { + testUtils.testWithClient('modules', async client => { assert.equal( await client.module.echo('message'), 'message' ); }, { + ...GLOBAL.SERVERS.OPEN, clientOptions: { modules: { module: { @@ -423,7 +444,7 @@ describe('Client', () => { } }); - itWithClient(TestRedisServers.OPEN, 'executeIsolated', async client => { + testUtils.testWithClient('executeIsolated', async client => { await client.sendCommand(['CLIENT', 'SETNAME', 'client']); assert.equal( @@ -432,35 +453,35 @@ describe('Client', () => { ), null ); - }); - - itWithClient(TestRedisServers.OPEN, 'should reconnect after DEBUG RESTART', async client => { - client.on('error', () => { - // ignore errors - }); - - await client.sendCommand(['CLIENT', 'SETNAME', 'client']); - await assert.rejects(client.sendCommand(['DEBUG', 'RESTART'])); - assert.ok(await client.sendCommand(['CLIENT', 'GETNAME']) === null); - }); + }, GLOBAL.SERVERS.OPEN); + + async function killClient(client: RedisClientType): Promise { + const onceErrorPromise = once(client, 'error'); + await client.sendCommand(['QUIT']); + await Promise.all([ + onceErrorPromise, + assert.rejects(client.ping(), SocketClosedUnexpectedlyError) + ]); + } - itWithClient(TestRedisServers.OPEN, 'should SELECT db after reconnection', async client => { - client.on('error', () => { - // ignore errors - }); + testUtils.testWithClient('should reconnect when socket disconnects', async client => { + await killClient(client); + await assert.doesNotReject(client.ping()); + }, GLOBAL.SERVERS.OPEN); + testUtils.testWithClient('should remember selected db', async client => { await client.select(1); - await assert.rejects(client.sendCommand(['DEBUG', 'RESTART'])); + await killClient(client); assert.equal( (await client.clientInfo()).db, 1 ); }, { - // because of CLIENT INFO - minimumRedisVersion: [6, 2] + ...GLOBAL.SERVERS.OPEN, + minimumDockerVersion: [6, 2] // CLIENT INFO }); - itWithClient(TestRedisServers.OPEN, 'scanIterator', async client => { + testUtils.testWithClient('scanIterator', async client => { const promises = [], keys = new Set(); for (let i = 0; i < 100; i++) { @@ -477,9 +498,9 @@ describe('Client', () => { } assert.deepEqual(keys, results); - }); + }, GLOBAL.SERVERS.OPEN); - itWithClient(TestRedisServers.OPEN, 'hScanIterator', async client => { + testUtils.testWithClient('hScanIterator', async client => { const hash: Record = {}; for (let i = 0; i < 100; i++) { hash[i.toString()] = i.toString(); @@ -493,9 +514,9 @@ describe('Client', () => { } assert.deepEqual(hash, results); - }); + }, GLOBAL.SERVERS.OPEN); - itWithClient(TestRedisServers.OPEN, 'sScanIterator', async client => { + testUtils.testWithClient('sScanIterator', async client => { const members = new Set(); for (let i = 0; i < 100; i++) { members.add(i.toString()); @@ -509,9 +530,9 @@ describe('Client', () => { } assert.deepEqual(members, results); - }); + }, GLOBAL.SERVERS.OPEN); - itWithClient(TestRedisServers.OPEN, 'zScanIterator', async client => { + testUtils.testWithClient('zScanIterator', async client => { const members = []; for (let i = 0; i < 100; i++) { members.push({ @@ -537,9 +558,9 @@ describe('Client', () => { [...map.entries()].sort(sort), members.map(member => [member.value, member.score]).sort(sort) ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithClient(TestRedisServers.OPEN, 'PubSub', async publisher => { + testUtils.testWithClient('PubSub', async publisher => { const subscriber = publisher.duplicate(); await subscriber.connect(); @@ -602,76 +623,59 @@ describe('Client', () => { } finally { await subscriber.disconnect(); } - }); + }, GLOBAL.SERVERS.OPEN); - it('ConnectionTimeoutError', async () => { - const client = RedisClient.create({ - socket: { - ...TEST_REDIS_SERVERS[TestRedisServers.OPEN], - connectTimeout: 1 - } - }); - - try { - const promise = assert.rejects(client.connect(), ConnectionTimeoutError), - start = process.hrtime.bigint(); + testUtils.testWithClient('ConnectionTimeoutError', async client => { + const promise = assert.rejects(client.connect(), ConnectionTimeoutError), + start = process.hrtime.bigint(); - while (process.hrtime.bigint() - start < 1_000_000) { - // block the event loop for 1ms, to make sure the connection will timeout - } + while (process.hrtime.bigint() - start < 1_000_000) { + // block the event loop for 1ms, to make sure the connection will timeout + } - await promise; - } catch (err) { - if (err instanceof AssertionError) { - await client.disconnect(); + await promise; + }, { + ...GLOBAL.SERVERS.OPEN, + clientOptions: { + socket: { + connectTimeout: 1 } - - throw err; - } + }, + disableClientSetup: true }); - it('client.quit', async () => { - const client = RedisClient.create(TEST_REDIS_SERVERS[TestRedisServers.OPEN]); - + testUtils.testWithClient('client.quit', async client => { await client.connect(); - try { - const pingPromise = client.ping(), - quitPromise = client.quit(); - assert.equal(client.isOpen, false); + const pingPromise = client.ping(), + quitPromise = client.quit(); + assert.equal(client.isOpen, false); - const [ping] = await Promise.all([ - pingPromise, - assert.doesNotReject(quitPromise), - assert.rejects(client.ping(), ClientClosedError) - ]); + const [ping] = await Promise.all([ + pingPromise, + assert.doesNotReject(quitPromise), + assert.rejects(client.ping(), ClientClosedError) + ]); - assert.equal(ping, 'PONG'); - } finally { - if (client.isOpen) { - await client.disconnect(); - } - } + assert.equal(ping, 'PONG'); + }, { + ...GLOBAL.SERVERS.OPEN, + disableClientSetup: true }); - it('client.disconnect', async () => { - const client = RedisClient.create(TEST_REDIS_SERVERS[TestRedisServers.OPEN]); - + testUtils.testWithClient('client.disconnect', async client => { await client.connect(); - try { - const pingPromise = client.ping(), - disconnectPromise = client.disconnect(); - assert.equal(client.isOpen, false); - await Promise.all([ - assert.rejects(pingPromise, DisconnectsClientError), - assert.doesNotReject(disconnectPromise), - assert.rejects(client.ping(), ClientClosedError) - ]); - } finally { - if (client.isOpen) { - await client.disconnect(); - } - } + const pingPromise = client.ping(), + disconnectPromise = client.disconnect(); + assert.equal(client.isOpen, false); + await Promise.all([ + assert.rejects(pingPromise, DisconnectsClientError), + assert.doesNotReject(disconnectPromise), + assert.rejects(client.ping(), ClientClosedError) + ]); + }, { + ...GLOBAL.SERVERS.OPEN, + disableClientSetup: true }); }); diff --git a/lib/client/index.ts b/lib/client/index.ts index a76a56ace79..40499cbf7c0 100644 --- a/lib/client/index.ts +++ b/lib/client/index.ts @@ -9,7 +9,7 @@ import { CommandOptions, commandOptions, isCommandOptions } from '../command-opt 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 { extendWithCommands, extendWithModulesAndScripts, transformCommandArguments, transformCommandReply } from '../commander'; import { Pool, Options as PoolOptions, createPool } from 'generic-pool'; import { ClientClosedError, DisconnectsClientError } from '../errors'; import { URL } from 'url'; @@ -217,7 +217,7 @@ export default class RedisClient } if (promises.length) { - this.#tick(); + this.#tick(true); await Promise.all(promises); } }; @@ -435,8 +435,8 @@ export default class RedisClient quit = this.QUIT; - #tick(): void { - if (!this.#socket.isSocketExists || this.#socket.writableNeedDrain) { + #tick(force = false): void { + if (this.#socket.writableNeedDrain || (!force && !this.#socket.isReady)) { return; } @@ -446,9 +446,7 @@ export default class RedisClient const args = this.#queue.getCommandToSend(); if (args === undefined) break; - for (const toWrite of encodeCommand(args)) { - this.#socket.write(toWrite); - } + this.#socket.writeCommand(args); } } @@ -485,7 +483,7 @@ export default class RedisClient for (const key of reply.keys) { yield key; } - } while (cursor !== 0) + } while (cursor !== 0); } async* hScanIterator(key: string, options?: ScanOptions): AsyncIterable { @@ -496,7 +494,7 @@ export default class RedisClient for (const tuple of reply.tuples) { yield tuple; } - } while (cursor !== 0) + } while (cursor !== 0); } async* sScanIterator(key: string, options?: ScanOptions): AsyncIterable { @@ -507,7 +505,7 @@ export default class RedisClient for (const member of reply.members) { yield member; } - } while (cursor !== 0) + } while (cursor !== 0); } async* zScanIterator(key: string, options?: ScanOptions): AsyncIterable { @@ -518,15 +516,13 @@ export default class RedisClient for (const member of reply.members) { yield member; } - } while (cursor !== 0) + } while (cursor !== 0); } async disconnect(): Promise { this.#queue.flushAll(new DisconnectsClientError()); - await Promise.all([ - this.#socket.disconnect(), - this.#destroyIsolationPool() - ]); + this.#socket.disconnect(); + await this.#destroyIsolationPool(); } async #destroyIsolationPool(): Promise { diff --git a/lib/client/socket.spec.ts b/lib/client/socket.spec.ts index 11c02d0885c..263320bbf72 100644 --- a/lib/client/socket.spec.ts +++ b/lib/client/socket.spec.ts @@ -33,6 +33,6 @@ describe('Socket', () => { return assert.rejects(socket.connect(), { message: '50' }); - }) + }); }); }); diff --git a/lib/client/socket.ts b/lib/client/socket.ts index 923d14dffd5..3a816604718 100644 --- a/lib/client/socket.ts +++ b/lib/client/socket.ts @@ -1,7 +1,9 @@ import EventEmitter from 'events'; import net from 'net'; import tls from 'tls'; -import { ConnectionTimeoutError, ClientClosedError } from '../errors'; +import { encodeCommand } from '../commander'; +import { RedisCommandArguments } from '../commands'; +import { ConnectionTimeoutError, ClientClosedError, SocketClosedUnexpectedlyError } from '../errors'; import { promiseTimeout } from '../utils'; export interface RedisSocketCommonOptions { @@ -72,8 +74,10 @@ export default class RedisSocket extends EventEmitter { return this.#isOpen; } - get isSocketExists(): boolean { - return !!this.#socket; + #isReady = false; + + get isReady(): boolean { + return this.#isReady; } // `writable.writableNeedDrain` was added in v15.2.0 and therefore can't be used @@ -93,33 +97,39 @@ export default class RedisSocket extends EventEmitter { async connect(): Promise { if (this.#isOpen) { - throw new Error('Socket is connection/connecting'); + throw new Error('Socket already opened'); } - this.#isOpen = true; - - try { - await this.#connect(); - } catch (err) { - this.#isOpen = false; - throw err; - } + return this.#connect(); } async #connect(hadError?: boolean): Promise { + this.#isOpen = true; this.#socket = await this.#retryConnection(0, hadError); + this.#writableNeedDrain = false; + + if (!this.#isOpen) { + this.disconnect(); + return; + } + this.emit('connect'); if (this.#initiator) { try { await this.#initiator(); } catch (err) { - this.#socket.end(); + this.#socket.destroy(); this.#socket = undefined; + this.#isOpen = false; throw err; } + + if (!this.#isOpen) return; } + this.#isReady = true; + this.emit('ready'); } @@ -168,7 +178,7 @@ export default class RedisSocket extends EventEmitter { .once('error', (err: Error) => this.#onSocketError(err)) .once('close', hadError => { if (!hadError && this.#isOpen) { - this.#onSocketError(new Error('Socket closed unexpectedly')); + this.#onSocketError(new SocketClosedUnexpectedlyError()); } }) .on('drain', () => { @@ -197,33 +207,32 @@ export default class RedisSocket extends EventEmitter { } #onSocketError(err: Error): void { - this.#socket = undefined; + this.#isReady = false; this.emit('error', err); - this.#connect(true) - .catch(err => this.emit('error', err)); + this.#connect(true).catch(() => { + // the error was already emitted, silently ignore it + }); } - write(toWrite: string | Buffer): boolean { + writeCommand(args: RedisCommandArguments): void { if (!this.#socket) { throw new ClientClosedError(); } - const wasFullyWritten = this.#socket.write(toWrite); - this.#writableNeedDrain = !wasFullyWritten; - return wasFullyWritten; + for (const toWrite of encodeCommand(args)) { + this.#writableNeedDrain = !this.#socket.write(toWrite); + } } - async disconnect(ignoreIsOpen = false): Promise { - if ((!ignoreIsOpen && !this.#isOpen) || !this.#socket) { + disconnect(): void { + if (!this.#socket) { throw new ClientClosedError(); } else { - this.#isOpen = false; + this.#isOpen = this.#isReady = false; } - this.#socket.end(); - this.#socket.removeAllListeners('data'); - await EventEmitter.once(this.#socket, 'end'); + this.#socket.destroy(); this.#socket = undefined; this.emit('end'); } @@ -234,14 +243,8 @@ export default class RedisSocket extends EventEmitter { } this.#isOpen = false; - - try { - await fn(); - await this.disconnect(true); - } catch (err) { - this.#isOpen = true; - throw err; - } + await fn(); + this.disconnect(); } #isCorked = false; diff --git a/lib/cluster/index.spec.ts b/lib/cluster/index.spec.ts index f2227395385..66319460f63 100644 --- a/lib/cluster/index.spec.ts +++ b/lib/cluster/index.spec.ts @@ -1,17 +1,11 @@ import { strict as assert } from 'assert'; -import RedisCluster from '.'; -import { defineScript } from '../lua-script'; -import { itWithCluster, itWithDedicatedCluster, TestRedisClusters, TEST_REDIS_CLUSTERES } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import calculateSlot from 'cluster-key-slot'; import { ClusterSlotStates } from '../commands/CLUSTER_SETSLOT'; +import { SQUARE_SCRIPT } from '../client/index.spec'; describe('Cluster', () => { - it('sendCommand', async () => { - const cluster = RedisCluster.create({ - ...TEST_REDIS_CLUSTERES[TestRedisClusters.OPEN], - useReplicas: true - }); - + testUtils.testWithCluster('sendCommand', async cluster => { await cluster.connect(); try { @@ -26,9 +20,9 @@ describe('Cluster', () => { } finally { await cluster.disconnect(); } - }); + }, GLOBAL.CLUSTERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'multi', async cluster => { + testUtils.testWithCluster('multi', async cluster => { const key = 'key'; assert.deepEqual( await cluster.multi() @@ -37,40 +31,23 @@ describe('Cluster', () => { .exec(), ['OK', 'value'] ); - }); + }, GLOBAL.CLUSTERS.OPEN); - it('scripts', async () => { - const cluster = RedisCluster.create({ - ...TEST_REDIS_CLUSTERES[TestRedisClusters.OPEN], + testUtils.testWithCluster('scripts', async cluster => { + assert.equal( + await cluster.square(2), + 4 + ); + }, { + ...GLOBAL.CLUSTERS.OPEN, + clusterConfiguration: { scripts: { - add: defineScript({ - NUMBER_OF_KEYS: 0, - SCRIPT: 'return ARGV[1] + 1;', - transformArguments(number: number): Array { - assert.equal(number, 1); - return [number.toString()]; - }, - transformReply(reply: number): number { - assert.equal(reply, 2); - return reply; - } - }) + square: SQUARE_SCRIPT } - }); - - await cluster.connect(); - - try { - assert.equal( - await cluster.add(1), - 2 - ); - } finally { - await cluster.disconnect(); } }); - itWithDedicatedCluster('should handle live resharding', async cluster => { + testUtils.testWithCluster('should handle live resharding', async cluster => { const key = 'key', value = 'value'; await cluster.set(key, value); @@ -110,5 +87,7 @@ describe('Cluster', () => { await cluster.get(key), value ); + }, { + serverArguments: [] }); }); diff --git a/lib/commands/ACL_CAT.spec.ts b/lib/commands/ACL_CAT.spec.ts index 77ed1cb7a07..521871a1c6b 100644 --- a/lib/commands/ACL_CAT.spec.ts +++ b/lib/commands/ACL_CAT.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils from '../test-utils'; import { transformArguments } from './ACL_CAT'; describe('ACL CAT', () => { - describeHandleMinimumRedisVersion([6]); + testUtils.isVersionGreaterThanHook([6]); describe('transformArguments', () => { it('simple', () => { diff --git a/lib/commands/ACL_DELUSER.spec.ts b/lib/commands/ACL_DELUSER.spec.ts index c64e8db1965..5c5ea2fa2a3 100644 --- a/lib/commands/ACL_DELUSER.spec.ts +++ b/lib/commands/ACL_DELUSER.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { describeHandleMinimumRedisVersion, itWithClient, TestRedisServers } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ACL_DELUSER'; describe('ACL DELUSER', () => { - describeHandleMinimumRedisVersion([6]); + testUtils.isVersionGreaterThanHook([6]); describe('transformArguments', () => { it('string', () => { @@ -21,10 +21,10 @@ describe('ACL DELUSER', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.aclDelUser', async client => { + testUtils.testWithClient('client.aclDelUser', async client => { assert.equal( await client.aclDelUser('dosenotexists'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ACL_GENPASS.spec.ts b/lib/commands/ACL_GENPASS.spec.ts index a288a4f7142..3b2a022f972 100644 --- a/lib/commands/ACL_GENPASS.spec.ts +++ b/lib/commands/ACL_GENPASS.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils from '../test-utils'; import { transformArguments } from './ACL_GENPASS'; describe('ACL GENPASS', () => { - describeHandleMinimumRedisVersion([6]); + testUtils.isVersionGreaterThanHook([6]); describe('transformArguments', () => { it('simple', () => { diff --git a/lib/commands/ACL_GETUSER.spec.ts b/lib/commands/ACL_GETUSER.spec.ts index e3446162da9..fcc10768e61 100644 --- a/lib/commands/ACL_GETUSER.spec.ts +++ b/lib/commands/ACL_GETUSER.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { describeHandleMinimumRedisVersion, isRedisVersionGreaterThan, itWithClient, TestRedisServers } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ACL_GETUSER'; describe('ACL GETUSER', () => { - describeHandleMinimumRedisVersion([6]); + testUtils.isVersionGreaterThanHook([6]); it('transformArguments', () => { assert.deepEqual( @@ -12,14 +12,14 @@ describe('ACL GETUSER', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.aclGetUser', async client => { + testUtils.testWithClient('client.aclGetUser', async client => { assert.deepEqual( await client.aclGetUser('default'), { passwords: [], commands: '+@all', keys: ['*'], - ...(isRedisVersionGreaterThan([6, 2]) ? { + ...(testUtils.isVersionGreaterThan([6, 2]) ? { flags: ['on', 'allkeys', 'allchannels', 'allcommands', 'nopass'], channels: ['*'] } : { @@ -28,5 +28,5 @@ describe('ACL GETUSER', () => { }) } ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ACL_LIST.spec.ts b/lib/commands/ACL_LIST.spec.ts index ab6bae762f1..9f9156db7a2 100644 --- a/lib/commands/ACL_LIST.spec.ts +++ b/lib/commands/ACL_LIST.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils from '../test-utils'; import { transformArguments } from './ACL_LIST'; describe('ACL LIST', () => { - describeHandleMinimumRedisVersion([6]); + testUtils.isVersionGreaterThanHook([6]); it('transformArguments', () => { assert.deepEqual( diff --git a/lib/commands/ACL_LOAD.spec.ts b/lib/commands/ACL_LOAD.spec.ts index d173d7f1355..703d5eeb252 100644 --- a/lib/commands/ACL_LOAD.spec.ts +++ b/lib/commands/ACL_LOAD.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils from '../test-utils'; import { transformArguments } from './ACL_SAVE'; describe('ACL SAVE', () => { - describeHandleMinimumRedisVersion([6]); + testUtils.isVersionGreaterThanHook([6]); it('transformArguments', () => { assert.deepEqual( diff --git a/lib/commands/ACL_LOG.spec.ts b/lib/commands/ACL_LOG.spec.ts index 3ce76ce4563..a8296d31da6 100644 --- a/lib/commands/ACL_LOG.spec.ts +++ b/lib/commands/ACL_LOG.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils from '../test-utils'; import { transformArguments, transformReply } from './ACL_LOG'; describe('ACL LOG', () => { - describeHandleMinimumRedisVersion([6]); + testUtils.isVersionGreaterThanHook([6]); describe('transformArguments', () => { it('simple', () => { diff --git a/lib/commands/ACL_LOG_RESET.spec.ts b/lib/commands/ACL_LOG_RESET.spec.ts index 3f0e628d9f0..5d26e45d04f 100644 --- a/lib/commands/ACL_LOG_RESET.spec.ts +++ b/lib/commands/ACL_LOG_RESET.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils from '../test-utils'; import { transformArguments } from './ACL_LOG_RESET'; describe('ACL LOG RESET', () => { - describeHandleMinimumRedisVersion([6]); + testUtils.isVersionGreaterThanHook([6]); it('transformArguments', () => { assert.deepEqual( diff --git a/lib/commands/ACL_SAVE.spec.ts b/lib/commands/ACL_SAVE.spec.ts index b34c7bb0e6f..f4de312bb7a 100644 --- a/lib/commands/ACL_SAVE.spec.ts +++ b/lib/commands/ACL_SAVE.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils from '../test-utils'; import { transformArguments } from './ACL_LOAD'; describe('ACL LOAD', () => { - describeHandleMinimumRedisVersion([6]); + testUtils.isVersionGreaterThanHook([6]); it('transformArguments', () => { assert.deepEqual( diff --git a/lib/commands/ACL_SETUSER.spec.ts b/lib/commands/ACL_SETUSER.spec.ts index f3badfcdca8..9c8ea8a59e0 100644 --- a/lib/commands/ACL_SETUSER.spec.ts +++ b/lib/commands/ACL_SETUSER.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils from '../test-utils'; import { transformArguments } from './ACL_SETUSER'; describe('ACL SETUSER', () => { - describeHandleMinimumRedisVersion([6]); + testUtils.isVersionGreaterThanHook([6]); describe('transformArguments', () => { it('string', () => { diff --git a/lib/commands/ACL_USERS.spec.ts b/lib/commands/ACL_USERS.spec.ts index 14b76725fcd..35e06ce8494 100644 --- a/lib/commands/ACL_USERS.spec.ts +++ b/lib/commands/ACL_USERS.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils from '../test-utils'; import { transformArguments } from './ACL_USERS'; describe('ACL USERS', () => { - describeHandleMinimumRedisVersion([6]); + testUtils.isVersionGreaterThanHook([6]); it('transformArguments', () => { assert.deepEqual( diff --git a/lib/commands/ACL_WHOAMI.spec.ts b/lib/commands/ACL_WHOAMI.spec.ts index a933057ea9d..32eb327beea 100644 --- a/lib/commands/ACL_WHOAMI.spec.ts +++ b/lib/commands/ACL_WHOAMI.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils from '../test-utils'; import { transformArguments } from './ACL_WHOAMI'; describe('ACL WHOAMI', () => { - describeHandleMinimumRedisVersion([6]); + testUtils.isVersionGreaterThanHook([6]); it('transformArguments', () => { assert.deepEqual( diff --git a/lib/commands/APPEND.spec.ts b/lib/commands/APPEND.spec.ts index 283ab807956..23353866843 100644 --- a/lib/commands/APPEND.spec.ts +++ b/lib/commands/APPEND.spec.ts @@ -1,7 +1,7 @@ import { strict as assert } from 'assert'; import { transformArguments } from './APPEND'; -describe('AUTH', () => { +describe('APPEND', () => { it('transformArguments', () => { assert.deepEqual( transformArguments('key', 'value'), diff --git a/lib/commands/BITCOUNT.spec.ts b/lib/commands/BITCOUNT.spec.ts index bf4cf39cab6..8919957cf92 100644 --- a/lib/commands/BITCOUNT.spec.ts +++ b/lib/commands/BITCOUNT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './BITCOUNT'; describe('BITCOUNT', () => { @@ -22,10 +22,10 @@ describe('BITCOUNT', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.bitCount', async client => { + testUtils.testWithClient('client.bitCount', async client => { assert.equal( await client.bitCount('key'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/BITFIELD.spec.ts b/lib/commands/BITFIELD.spec.ts index 4d6d9d11c1a..93a5cb08a63 100644 --- a/lib/commands/BITFIELD.spec.ts +++ b/lib/commands/BITFIELD.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './BITFIELD'; describe('BITFIELD', () => { @@ -33,10 +33,10 @@ describe('BITFIELD', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.bitField', async client => { + testUtils.testWithClient('client.bitField', async client => { assert.deepEqual( await client.bitField('key', []), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/BITOP.spec.ts b/lib/commands/BITOP.spec.ts index aa863e5f2d2..554530d56f4 100644 --- a/lib/commands/BITOP.spec.ts +++ b/lib/commands/BITOP.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './BITOP'; describe('BITOP', () => { @@ -19,17 +19,17 @@ describe('BITOP', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.bitOp', async client => { + testUtils.testWithClient('client.bitOp', async client => { assert.equal( await client.bitOp('AND', 'destKey', 'key'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.bitOp', async cluster => { + testUtils.testWithCluster('cluster.bitOp', async cluster => { assert.equal( await cluster.bitOp('AND', '{tag}destKey', '{tag}key'), 0 ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/BITPOS.spec.ts b/lib/commands/BITPOS.spec.ts index ad08e708c54..354deea6195 100644 --- a/lib/commands/BITPOS.spec.ts +++ b/lib/commands/BITPOS.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './BITPOS'; describe('BITPOS', () => { @@ -26,17 +26,17 @@ describe('BITPOS', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.bitPos', async client => { + testUtils.testWithClient('client.bitPos', async client => { assert.equal( await client.bitPos('key', 1, 1), -1 ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.bitPos', async cluster => { + testUtils.testWithCluster('cluster.bitPos', async cluster => { assert.equal( await cluster.bitPos('key', 1, 1), -1 ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/BLMOVE.spec.ts b/lib/commands/BLMOVE.spec.ts index b942864758f..3b86c1ec91e 100644 --- a/lib/commands/BLMOVE.spec.ts +++ b/lib/commands/BLMOVE.spec.ts @@ -1,10 +1,10 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './BLMOVE'; import { commandOptions } from '../../index'; describe('BLMOVE', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); it('transformArguments', () => { assert.deepEqual( @@ -13,7 +13,7 @@ describe('BLMOVE', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.blMove', async client => { + testUtils.testWithClient('client.blMove', async client => { const [blMoveReply] = await Promise.all([ client.blMove(commandOptions({ isolated: true @@ -25,9 +25,9 @@ describe('BLMOVE', () => { blMoveReply, 'element' ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.blMove', async cluster => { + testUtils.testWithCluster('cluster.blMove', async cluster => { const [blMoveReply] = await Promise.all([ cluster.blMove(commandOptions({ isolated: true @@ -39,5 +39,5 @@ describe('BLMOVE', () => { blMoveReply, 'element' ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/BLPOP.spec.ts b/lib/commands/BLPOP.spec.ts index 651dd09eaf3..4b93c0b43b8 100644 --- a/lib/commands/BLPOP.spec.ts +++ b/lib/commands/BLPOP.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './BLPOP'; import { commandOptions } from '../../index'; @@ -39,7 +39,7 @@ describe('BLPOP', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.blPop', async client => { + testUtils.testWithClient('client.blPop', async client => { const [ blPopReply ] = await Promise.all([ client.blPop( commandOptions({ isolated: true }), @@ -56,9 +56,9 @@ describe('BLPOP', () => { element: 'element' } ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.blPop', async cluster => { + testUtils.testWithCluster('cluster.blPop', async cluster => { const [ blPopReply ] = await Promise.all([ cluster.blPop( commandOptions({ isolated: true }), @@ -75,5 +75,5 @@ describe('BLPOP', () => { element: 'element' } ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/BRPOP.spec.ts b/lib/commands/BRPOP.spec.ts index 9a7d0bbc37d..fc203e1abdf 100644 --- a/lib/commands/BRPOP.spec.ts +++ b/lib/commands/BRPOP.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './BRPOP'; import { commandOptions } from '../../index'; @@ -39,7 +39,7 @@ describe('BRPOP', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.brPop', async client => { + testUtils.testWithClient('client.brPop', async client => { const [ brPopReply ] = await Promise.all([ client.brPop( commandOptions({ isolated: true }), @@ -56,9 +56,9 @@ describe('BRPOP', () => { element: 'element' } ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.brPop', async cluster => { + testUtils.testWithCluster('cluster.brPop', async cluster => { const [ brPopReply ] = await Promise.all([ cluster.brPop( commandOptions({ isolated: true }), @@ -75,5 +75,5 @@ describe('BRPOP', () => { element: 'element' } ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/BRPOPLPUSH.spec.ts b/lib/commands/BRPOPLPUSH.spec.ts index 08bcf5e4d94..214af4553ac 100644 --- a/lib/commands/BRPOPLPUSH.spec.ts +++ b/lib/commands/BRPOPLPUSH.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './BRPOPLPUSH'; import { commandOptions } from '../../index'; @@ -11,7 +11,7 @@ describe('BRPOPLPUSH', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.brPopLPush', async client => { + testUtils.testWithClient('client.brPopLPush', async client => { const [ popReply ] = await Promise.all([ client.brPopLPush( commandOptions({ isolated: true }), @@ -26,9 +26,9 @@ describe('BRPOPLPUSH', () => { popReply, 'element' ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.brPopLPush', async cluster => { + testUtils.testWithCluster('cluster.brPopLPush', async cluster => { const [ popReply ] = await Promise.all([ cluster.brPopLPush( commandOptions({ isolated: true }), @@ -43,5 +43,5 @@ describe('BRPOPLPUSH', () => { popReply, 'element' ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/BZPOPMAX.spec.ts b/lib/commands/BZPOPMAX.spec.ts index 090dfba096d..e1c37478469 100644 --- a/lib/commands/BZPOPMAX.spec.ts +++ b/lib/commands/BZPOPMAX.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './BZPOPMAX'; import { commandOptions } from '../../index'; @@ -40,7 +40,7 @@ describe('BZPOPMAX', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.bzPopMax', async client => { + testUtils.testWithClient('client.bzPopMax', async client => { const [ bzPopMaxReply ] = await Promise.all([ client.bzPopMax( commandOptions({ isolated: true }), @@ -61,5 +61,5 @@ describe('BZPOPMAX', () => { score: 1 } ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/BZPOPMIN.spec.ts b/lib/commands/BZPOPMIN.spec.ts index 8b8977f9b3a..4cd1ec1b220 100644 --- a/lib/commands/BZPOPMIN.spec.ts +++ b/lib/commands/BZPOPMIN.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './BZPOPMIN'; import { commandOptions } from '../../index'; @@ -40,7 +40,7 @@ describe('BZPOPMIN', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.bzPopMin', async client => { + testUtils.testWithClient('client.bzPopMin', async client => { const [ bzPopMinReply ] = await Promise.all([ client.bzPopMin( commandOptions({ isolated: true }), @@ -61,5 +61,5 @@ describe('BZPOPMIN', () => { score: 1 } ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/CLIENT_ID.spec.ts b/lib/commands/CLIENT_ID.spec.ts index cb7dfd9f730..6792a8c31be 100644 --- a/lib/commands/CLIENT_ID.spec.ts +++ b/lib/commands/CLIENT_ID.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './CLIENT_ID'; describe('CLIENT ID', () => { @@ -10,10 +10,10 @@ describe('CLIENT ID', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.clientId', async client => { + testUtils.testWithClient('client.clientId', async client => { assert.equal( typeof (await client.clientId()), 'number' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/CLUSTER_SLOTS.spec.ts b/lib/commands/CLUSTER_SLOTS.spec.ts index ec6773bcdd4..6efbfe13ce1 100644 --- a/lib/commands/CLUSTER_SLOTS.spec.ts +++ b/lib/commands/CLUSTER_SLOTS.spec.ts @@ -71,6 +71,6 @@ describe('CLUSTER SLOTS', () => { id: '58e6e48d41228013e5d9c1c37c5060693925e97e' }] }] - ) + ); }); }); diff --git a/lib/commands/COMMAND.spec.ts b/lib/commands/COMMAND.spec.ts index 1f036dadc17..baad79845ab 100644 --- a/lib/commands/COMMAND.spec.ts +++ b/lib/commands/COMMAND.spec.ts @@ -1,7 +1,7 @@ import { strict as assert } from 'assert'; -import { itWithClient, TestRedisServers } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './COMMAND'; -import { CommandCategories, CommandFlags } from './generic-transformers'; +import { assertPingCommand } from './COMMAND_INFO.spec'; describe('COMMAND', () => { it('transformArguments', () => { @@ -11,20 +11,7 @@ describe('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] - }); + testUtils.testWithClient('client.command', async client => { + assertPingCommand((await client.command()).find(command => command.name === 'ping')); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/COMMAND_COUNT.spec.ts b/lib/commands/COMMAND_COUNT.spec.ts index 23e83c71cec..71482382f67 100644 --- a/lib/commands/COMMAND_COUNT.spec.ts +++ b/lib/commands/COMMAND_COUNT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './COMMAND_COUNT'; describe('COMMAND COUNT', () => { @@ -10,10 +10,10 @@ describe('COMMAND COUNT', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.commandCount', async client => { + testUtils.testWithClient('client.commandCount', async client => { assert.equal( typeof await client.commandCount(), 'number' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/COMMAND_GETKEYS.spec.ts b/lib/commands/COMMAND_GETKEYS.spec.ts index f2630db9afa..a92d032c5d6 100644 --- a/lib/commands/COMMAND_GETKEYS.spec.ts +++ b/lib/commands/COMMAND_GETKEYS.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './COMMAND_GETKEYS'; describe('COMMAND GETKEYS', () => { @@ -10,10 +10,10 @@ describe('COMMAND GETKEYS', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.commandGetKeys', async client => { + testUtils.testWithClient('client.commandGetKeys', async client => { assert.deepEqual( await client.commandGetKeys(['GET', 'key']), ['key'] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/COMMAND_INFO.spec.ts b/lib/commands/COMMAND_INFO.spec.ts index 59a61f6680a..3b2672dcb6b 100644 --- a/lib/commands/COMMAND_INFO.spec.ts +++ b/lib/commands/COMMAND_INFO.spec.ts @@ -1,7 +1,26 @@ import { strict as assert } from 'assert'; -import { itWithClient, TestRedisServers } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './COMMAND_INFO'; -import { CommandCategories, CommandFlags } from './generic-transformers'; +import { CommandCategories, CommandFlags, CommandReply } from './generic-transformers'; + +export function assertPingCommand(commandInfo: CommandReply | null | undefined): void { + assert.deepEqual( + commandInfo, + { + name: 'ping', + arity: -1, + flags: new Set([CommandFlags.STALE, CommandFlags.FAST]), + firstKeyIndex: 0, + lastKeyIndex: 0, + step: 0, + categories: new Set( + testUtils.isVersionGreaterThan([6]) ? + [CommandCategories.FAST, CommandCategories.CONNECTION] : + [] + ) + } + ); +} describe('COMMAND INFO', () => { it('transformArguments', () => { @@ -11,20 +30,7 @@ describe('COMMAND INFO', () => { ); }); - 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] - }); + testUtils.testWithClient('client.commandInfo', async client => { + assertPingCommand((await client.commandInfo(['PING']))[0]); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/COPY.spec.ts b/lib/commands/COPY.spec.ts index fb35be863ab..0d68e969cdb 100644 --- a/lib/commands/COPY.spec.ts +++ b/lib/commands/COPY.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './COPY'; describe('COPY', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); describe('transformArguments', () => { it('simple', () => { @@ -58,10 +58,10 @@ describe('COPY', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.copy', async client => { + testUtils.testWithClient('client.copy', async client => { assert.equal( await client.copy('source', 'destination'), false ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/DBSIZE.spec.ts b/lib/commands/DBSIZE.spec.ts index 36f591dbd29..a014a46e6e2 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 } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './DBSIZE'; describe('DBSIZE', () => { @@ -10,10 +10,10 @@ describe('DBSIZE', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.dbSize', async client => { + testUtils.testWithClient('client.dbSize', async client => { assert.equal( await client.dbSize(), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/DECR.spec.ts b/lib/commands/DECR.spec.ts index 5b4b4f0fd33..75e1205feda 100644 --- a/lib/commands/DECR.spec.ts +++ b/lib/commands/DECR.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './DECR'; describe('DECR', () => { @@ -10,10 +10,10 @@ describe('DECR', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.decr', async client => { + testUtils.testWithClient('client.decr', async client => { assert.equal( await client.decr('key'), -1 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/DECRBY.spec.ts b/lib/commands/DECRBY.spec.ts index 1c9ac69bb96..d2c23e94728 100644 --- a/lib/commands/DECRBY.spec.ts +++ b/lib/commands/DECRBY.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './DECRBY'; describe('DECRBY', () => { @@ -10,10 +10,10 @@ describe('DECRBY', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.decrBy', async client => { + testUtils.testWithClient('client.decrBy', async client => { assert.equal( await client.decrBy('key', 2), -2 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/DEL.spec.ts b/lib/commands/DEL.spec.ts index ec780de67a0..75a29a8f641 100644 --- a/lib/commands/DEL.spec.ts +++ b/lib/commands/DEL.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './DEL'; describe('DEL', () => { @@ -19,10 +19,10 @@ describe('DEL', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.del', async client => { + testUtils.testWithClient('client.del', async client => { assert.equal( await client.del('key'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/DUMP.spec.ts b/lib/commands/DUMP.spec.ts index e3f42c57578..aebbf4f3f7c 100644 --- a/lib/commands/DUMP.spec.ts +++ b/lib/commands/DUMP.spec.ts @@ -1,11 +1,11 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; describe('DUMP', () => { - itWithClient(TestRedisServers.OPEN, 'client.dump', async client => { + testUtils.testWithClient('client.dump', async client => { assert.equal( await client.dump('key'), null ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ECHO.spec.ts b/lib/commands/ECHO.spec.ts index d91b7373950..27f6b2a17d3 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 } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ECHO'; describe('ECHO', () => { @@ -10,10 +10,10 @@ describe('ECHO', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.echo', async client => { + testUtils.testWithClient('client.echo', async client => { assert.equal( await client.echo('message'), 'message' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/EVAL.spec.ts b/lib/commands/EVAL.spec.ts index 2be1aedf08a..7aa029362fd 100644 --- a/lib/commands/EVAL.spec.ts +++ b/lib/commands/EVAL.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './EVAL'; describe('EVAL', () => { @@ -13,17 +13,17 @@ describe('EVAL', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.eval', async client => { + testUtils.testWithClient('client.eval', async client => { assert.equal( await client.eval('return 1'), 1 ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.eval', async cluster => { + testUtils.testWithCluster('cluster.eval', async cluster => { assert.equal( await cluster.eval('return 1'), 1 ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/EXISTS.spec.ts b/lib/commands/EXISTS.spec.ts index 3cba44b563f..241a97c362e 100644 --- a/lib/commands/EXISTS.spec.ts +++ b/lib/commands/EXISTS.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './EXISTS'; describe('EXISTS', () => { @@ -19,10 +19,10 @@ describe('EXISTS', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.exists', async client => { + testUtils.testWithClient('client.exists', async client => { assert.equal( await client.exists('key'), false ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/EXPIRE.spec.ts b/lib/commands/EXPIRE.spec.ts index 6550532cab2..e2dc6e03123 100644 --- a/lib/commands/EXPIRE.spec.ts +++ b/lib/commands/EXPIRE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './EXPIRE'; describe('EXPIRE', () => { @@ -10,10 +10,10 @@ describe('EXPIRE', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.expire', async client => { + testUtils.testWithClient('client.expire', async client => { assert.equal( await client.expire('key', 0), false ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/EXPIREAT.spec.ts b/lib/commands/EXPIREAT.spec.ts index cefe9fa9b8b..1a11af1a735 100644 --- a/lib/commands/EXPIREAT.spec.ts +++ b/lib/commands/EXPIREAT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './EXPIREAT'; describe('EXPIREAT', () => { @@ -10,7 +10,7 @@ describe('EXPIREAT', () => { ['EXPIREAT', 'key', '1'] ); }); - + it('date', () => { const d = new Date(); assert.deepEqual( @@ -20,10 +20,10 @@ describe('EXPIREAT', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.expireAt', async client => { + testUtils.testWithClient('client.expireAt', async client => { assert.equal( await client.expireAt('key', 1), false ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/FLUSHALL.spec.ts b/lib/commands/FLUSHALL.spec.ts index 7f1c5ffd282..db5bb72e9cb 100644 --- a/lib/commands/FLUSHALL.spec.ts +++ b/lib/commands/FLUSHALL.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { RedisFlushModes, transformArguments } from './FLUSHALL'; describe('FLUSHALL', () => { @@ -26,10 +26,10 @@ describe('FLUSHALL', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.flushAll', async client => { + testUtils.testWithClient('client.flushAll', async client => { assert.equal( await client.flushAll(), 'OK' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/FLUSHDB.spec.ts b/lib/commands/FLUSHDB.spec.ts index e237e527680..bf460e9e7a8 100644 --- a/lib/commands/FLUSHDB.spec.ts +++ b/lib/commands/FLUSHDB.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { RedisFlushModes } from './FLUSHALL'; import { transformArguments } from './FLUSHDB'; @@ -27,10 +27,10 @@ describe('FLUSHDB', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.flushDb', async client => { + testUtils.testWithClient('client.flushDb', async client => { assert.equal( await client.flushDb(), 'OK' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/GEOADD.spec.ts b/lib/commands/GEOADD.spec.ts index 673e962093f..6425c881c9d 100644 --- a/lib/commands/GEOADD.spec.ts +++ b/lib/commands/GEOADD.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './GEOADD'; describe('GEOADD', () => { @@ -71,7 +71,7 @@ describe('GEOADD', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.geoAdd', async client => { + testUtils.testWithClient('client.geoAdd', async client => { assert.equal( await client.geoAdd('key', { member: 'member', @@ -80,9 +80,9 @@ describe('GEOADD', () => { }), 1 ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.geoAdd', async cluster => { + testUtils.testWithCluster('cluster.geoAdd', async cluster => { assert.equal( await cluster.geoAdd('key', { member: 'member', @@ -91,5 +91,5 @@ describe('GEOADD', () => { }), 1 ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/GEODIST.spec.ts b/lib/commands/GEODIST.spec.ts index 2cff8ecbd82..bbc62480ee1 100644 --- a/lib/commands/GEODIST.spec.ts +++ b/lib/commands/GEODIST.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './GEODIST'; describe('GEODIST', () => { @@ -20,14 +20,14 @@ describe('GEODIST', () => { }); describe('client.geoDist', () => { - itWithClient(TestRedisServers.OPEN, 'null', async client => { + testUtils.testWithClient('null', async client => { assert.equal( await client.geoDist('key', '1', '2'), null ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithClient(TestRedisServers.OPEN, 'with value', async client => { + testUtils.testWithClient('with value', async client => { const [, dist] = await Promise.all([ client.geoAdd('key', [{ member: '1', @@ -45,13 +45,13 @@ describe('GEODIST', () => { dist, 157270.0561 ); - }); + }, GLOBAL.SERVERS.OPEN); }); - itWithCluster(TestRedisClusters.OPEN, 'cluster.geoDist', async cluster => { + testUtils.testWithCluster('cluster.geoDist', async cluster => { assert.equal( await cluster.geoDist('key', '1', '2'), null ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/GEOHASH.spec.ts b/lib/commands/GEOHASH.spec.ts index b79de235557..c421c148f43 100644 --- a/lib/commands/GEOHASH.spec.ts +++ b/lib/commands/GEOHASH.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './GEOHASH'; describe('GEOHASH', () => { @@ -19,17 +19,17 @@ describe('GEOHASH', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.geoHash', async client => { + testUtils.testWithClient('client.geoHash', async client => { assert.deepEqual( await client.geoHash('key', 'member'), [null] ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.geoHash', async cluster => { + testUtils.testWithCluster('cluster.geoHash', async cluster => { assert.deepEqual( await cluster.geoHash('key', 'member'), [null] ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/GEOPOS.spec.ts b/lib/commands/GEOPOS.spec.ts index e15abeff516..9c08ccd08f5 100644 --- a/lib/commands/GEOPOS.spec.ts +++ b/lib/commands/GEOPOS.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './GEOPOS'; describe('GEOPOS', () => { @@ -39,14 +39,14 @@ describe('GEOPOS', () => { }); describe('client.geoPos', () => { - itWithClient(TestRedisServers.OPEN, 'null', async client => { + testUtils.testWithClient('null', async client => { assert.deepEqual( await client.geoPos('key', 'member'), [null] ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithClient(TestRedisServers.OPEN, 'with member', async client => { + testUtils.testWithClient('with member', async client => { const coordinates = { longitude: '-122.06429868936538696', latitude: '37.37749628831998194' @@ -61,13 +61,13 @@ describe('GEOPOS', () => { await client.geoPos('key', 'member'), [coordinates] ); - }); + }, GLOBAL.SERVERS.OPEN); }); - itWithCluster(TestRedisClusters.OPEN, 'cluster.geoPos', async cluster => { + testUtils.testWithCluster('cluster.geoPos', async cluster => { assert.deepEqual( await cluster.geoPos('key', 'member'), [null] ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/GEOSEARCH.spec.ts b/lib/commands/GEOSEARCH.spec.ts index a8606b3f74c..ec0d4bcc4f8 100644 --- a/lib/commands/GEOSEARCH.spec.ts +++ b/lib/commands/GEOSEARCH.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './GEOSEARCH'; describe('GEOSEARCH', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); it('transformArguments', () => { assert.deepEqual( @@ -15,7 +15,7 @@ describe('GEOSEARCH', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.geoSearch', async client => { + testUtils.testWithClient('client.geoSearch', async client => { assert.deepEqual( await client.geoSearch('key', 'member', { radius: 1, @@ -23,9 +23,9 @@ describe('GEOSEARCH', () => { }), [] ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.geoSearch', async cluster => { + testUtils.testWithCluster('cluster.geoSearch', async cluster => { assert.deepEqual( await cluster.geoSearch('key', 'member', { radius: 1, @@ -33,5 +33,5 @@ describe('GEOSEARCH', () => { }), [] ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/GEOSEARCHSTORE.spec.ts b/lib/commands/GEOSEARCHSTORE.spec.ts index ad33c62b78c..eb32fa134e4 100644 --- a/lib/commands/GEOSEARCHSTORE.spec.ts +++ b/lib/commands/GEOSEARCHSTORE.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './GEOSEARCHSTORE'; describe('GEOSEARCHSTORE', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); describe('transformArguments', () => { it('simple', () => { @@ -47,7 +47,7 @@ describe('GEOSEARCHSTORE', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.geoSearchStore', async client => { + testUtils.testWithClient('client.geoSearchStore', async client => { await client.geoAdd('source', { longitude: 1, latitude: 1, @@ -61,9 +61,9 @@ describe('GEOSEARCHSTORE', () => { }), 1 ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.geoSearchStore', async cluster => { + testUtils.testWithCluster('cluster.geoSearchStore', async cluster => { await cluster.geoAdd('{tag}source', { longitude: 1, latitude: 1, @@ -77,5 +77,5 @@ describe('GEOSEARCHSTORE', () => { }), 1 ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/GEOSEARCH_WITH.spec.ts b/lib/commands/GEOSEARCH_WITH.spec.ts index 922c00d7194..c1f5213775a 100644 --- a/lib/commands/GEOSEARCH_WITH.spec.ts +++ b/lib/commands/GEOSEARCH_WITH.spec.ts @@ -1,14 +1,14 @@ import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; import { RedisCommandArguments } from '.'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster, describeHandleMinimumRedisVersion } from '../test-utils'; import { GeoReplyWith } from './generic-transformers'; import { transformArguments } from './GEOSEARCH_WITH'; describe('GEOSEARCH WITH', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); it('transformArguments', () => { - const expectedReply: RedisCommandArguments = ['GEOSEARCH', 'key', 'FROMMEMBER', 'member', 'BYRADIUS', '1', 'm', 'WITHDIST'] + const expectedReply: RedisCommandArguments = ['GEOSEARCH', 'key', 'FROMMEMBER', 'member', 'BYRADIUS', '1', 'm', 'WITHDIST']; expectedReply.preserve = ['WITHDIST']; assert.deepEqual( @@ -20,7 +20,7 @@ describe('GEOSEARCH WITH', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.geoSearchWith', async client => { + testUtils.testWithClient('client.geoSearchWith', async client => { assert.deepEqual( await client.geoSearchWith('key', 'member', { radius: 1, @@ -28,9 +28,9 @@ describe('GEOSEARCH WITH', () => { }, [GeoReplyWith.DISTANCE]), [] ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.geoSearchWith', async cluster => { + testUtils.testWithCluster('cluster.geoSearchWith', async cluster => { assert.deepEqual( await cluster.geoSearchWith('key', 'member', { radius: 1, @@ -38,5 +38,5 @@ describe('GEOSEARCH WITH', () => { }, [GeoReplyWith.DISTANCE]), [] ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/GET.spec.ts b/lib/commands/GET.spec.ts index 303be60fe99..4c197f99a4e 100644 --- a/lib/commands/GET.spec.ts +++ b/lib/commands/GET.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './GET'; describe('GET', () => { @@ -10,17 +10,17 @@ describe('GET', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.get', async client => { + testUtils.testWithClient('client.get', async client => { assert.equal( await client.get('key'), null ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.get', async cluster => { + testUtils.testWithCluster('cluster.get', async cluster => { assert.equal( await cluster.get('key'), null ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/GETBIT.spec.ts b/lib/commands/GETBIT.spec.ts index 7163b4ba255..4206084eced 100644 --- a/lib/commands/GETBIT.spec.ts +++ b/lib/commands/GETBIT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './GETBIT'; describe('GETBIT', () => { @@ -10,17 +10,17 @@ describe('GETBIT', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.getBit', async client => { + testUtils.testWithClient('client.getBit', async client => { assert.equal( await client.getBit('key', 0), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.getBit', async cluster => { + testUtils.testWithCluster('cluster.getBit', async cluster => { assert.equal( await cluster.getBit('key', 0), 0 ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/GETDEL.spec.ts b/lib/commands/GETDEL.spec.ts index 232c08b9500..db3a486696a 100644 --- a/lib/commands/GETDEL.spec.ts +++ b/lib/commands/GETDEL.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './GETDEL'; describe('GETDEL', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); it('transformArguments', () => { assert.deepEqual( @@ -12,18 +12,17 @@ describe('GETDEL', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.getDel', async client => { + testUtils.testWithClient('client.getDel', async client => { assert.equal( await client.getDel('key'), null ); - }); - + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.getDel', async cluster => { + testUtils.testWithCluster('cluster.getDel', async cluster => { assert.equal( await cluster.getDel('key'), null ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/GETEX.spec.ts b/lib/commands/GETEX.spec.ts index 830f12cedf8..1bf86089da1 100644 --- a/lib/commands/GETEX.spec.ts +++ b/lib/commands/GETEX.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './GETEX'; describe('GETEX', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); describe('transformArguments', () => { it('EX', () => { @@ -76,21 +76,21 @@ describe('GETEX', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.getEx', async client => { + testUtils.testWithClient('client.getEx', async client => { assert.equal( await client.getEx('key', { PERSIST: true }), null ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.getEx', async cluster => { + testUtils.testWithCluster('cluster.getEx', async cluster => { assert.equal( await cluster.getEx('key', { PERSIST: true }), null ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/GETRANGE.spec.ts b/lib/commands/GETRANGE.spec.ts index 726311e6844..0c9dbc2c70f 100644 --- a/lib/commands/GETRANGE.spec.ts +++ b/lib/commands/GETRANGE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './GETRANGE'; describe('GETRANGE', () => { @@ -10,18 +10,17 @@ describe('GETRANGE', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.getRange', async client => { + testUtils.testWithClient('client.getRange', async client => { assert.equal( await client.getRange('key', 0, -1), '' ); - }); - + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.lTrim', async cluster => { + testUtils.testWithCluster('cluster.lTrim', async cluster => { assert.equal( await cluster.getRange('key', 0, -1), '' ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/GETSET.spec.ts b/lib/commands/GETSET.spec.ts index 4af5ab39ca2..73fbcec57ea 100644 --- a/lib/commands/GETSET.spec.ts +++ b/lib/commands/GETSET.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './GETSET'; describe('GETSET', () => { @@ -10,17 +10,17 @@ describe('GETSET', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.getSet', async client => { + testUtils.testWithClient('client.getSet', async client => { assert.equal( await client.getSet('key', 'value'), null ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.getSet', async cluster => { + testUtils.testWithCluster('cluster.getSet', async cluster => { assert.equal( await cluster.getSet('key', 'value'), null ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/GET_BUFFER.spec.ts b/lib/commands/GET_BUFFER.spec.ts index 533eb808c49..1f1a86799f4 100644 --- a/lib/commands/GET_BUFFER.spec.ts +++ b/lib/commands/GET_BUFFER.spec.ts @@ -1,22 +1,22 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; describe('GET_BUFFER', () => { - itWithClient(TestRedisServers.OPEN, 'client.getBuffer', async client => { + testUtils.testWithClient('client.getBuffer', async client => { const buffer = Buffer.from('string'); await client.set('key', buffer); assert.deepEqual( buffer, await client.getBuffer('key') ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.getBuffer', async cluster => { + testUtils.testWithCluster('cluster.getBuffer', async cluster => { const buffer = Buffer.from('string'); await cluster.set('key', buffer); assert.deepEqual( buffer, await cluster.getBuffer('key') ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/HDEL.spec.ts b/lib/commands/HDEL.spec.ts index 04191f51ada..eb24bcfacbd 100644 --- a/lib/commands/HDEL.spec.ts +++ b/lib/commands/HDEL.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './HDEL'; describe('HDEL', () => { @@ -19,10 +19,10 @@ describe('HDEL', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.hDel', async client => { + testUtils.testWithClient('client.hDel', async client => { assert.equal( await client.hDel('key', 'field'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/HELLO.spec.ts b/lib/commands/HELLO.spec.ts index db4604afead..12d6d98c7c9 100644 --- a/lib/commands/HELLO.spec.ts +++ b/lib/commands/HELLO.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { REDIS_VERSION, TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './HELLO'; describe('HELLO', () => { - describeHandleMinimumRedisVersion([6]); + testUtils.isVersionGreaterThanHook([6]); describe('transformArguments', () => { it('simple', () => { @@ -60,20 +60,17 @@ describe('HELLO', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.hello', async client => { - assert.deepEqual( - await client.hello(), - { - server: 'redis', - version: REDIS_VERSION.join('.'), - proto: 2, - id: await client.clientId(), - mode: 'standalone', - role: 'master', - modules: [] - } - ); + testUtils.testWithClient('client.hello', async client => { + const reply = await client.hello(); + assert.equal(reply.server, 'redis'); + assert.equal(typeof reply.version, 'string'); + assert.equal(reply.proto, 2); + assert.equal(typeof reply.id, 'number'); + assert.equal(reply.mode, 'standalone'); + assert.equal(reply.role, 'master'); + assert.deepEqual(reply.modules, []); }, { - minimumRedisVersion: [6, 2] + ...GLOBAL.SERVERS.OPEN, + minimumDockerVersion: [6, 2] }); }); diff --git a/lib/commands/HEXISTS.spec.ts b/lib/commands/HEXISTS.spec.ts index 26c411c432d..3764319c123 100644 --- a/lib/commands/HEXISTS.spec.ts +++ b/lib/commands/HEXISTS.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './HEXISTS'; describe('HEXISTS', () => { @@ -10,10 +10,10 @@ describe('HEXISTS', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.hExists', async client => { + testUtils.testWithClient('client.hExists', async client => { assert.equal( await client.hExists('key', 'field'), false ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/HGET.spec.ts b/lib/commands/HGET.spec.ts index c78550c5179..6b6d0a3ee22 100644 --- a/lib/commands/HGET.spec.ts +++ b/lib/commands/HGET.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './HGET'; describe('HGET', () => { @@ -10,10 +10,10 @@ describe('HGET', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.hGet', async client => { + testUtils.testWithClient('client.hGet', async client => { assert.equal( await client.hGet('key', 'field'), null ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/HGETALL.spec.ts b/lib/commands/HGETALL.spec.ts index 68b51a2902b..fcd1a30457c 100644 --- a/lib/commands/HGETALL.spec.ts +++ b/lib/commands/HGETALL.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformReply } from './HGETALL'; describe('HGETALL', () => { @@ -32,10 +32,10 @@ describe('HGETALL', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.hGetAll', async client => { + testUtils.testWithClient('client.hGetAll', async client => { assert.deepEqual( await client.hGetAll('key'), Object.create(null) ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/HINCRBY.spec.ts b/lib/commands/HINCRBY.spec.ts index 898dfd1172f..de406217921 100644 --- a/lib/commands/HINCRBY.spec.ts +++ b/lib/commands/HINCRBY.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './HINCRBY'; describe('HINCRBY', () => { @@ -10,10 +10,10 @@ describe('HINCRBY', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.hIncrBy', async client => { + testUtils.testWithClient('client.hIncrBy', async client => { assert.equal( await client.hIncrBy('key', 'field', 1), 1 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/HINCRBYFLOAT.spec.ts b/lib/commands/HINCRBYFLOAT.spec.ts index 83e87538c54..bd0147a3481 100644 --- a/lib/commands/HINCRBYFLOAT.spec.ts +++ b/lib/commands/HINCRBYFLOAT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './HINCRBYFLOAT'; describe('HINCRBYFLOAT', () => { @@ -10,10 +10,10 @@ describe('HINCRBYFLOAT', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.hIncrByFloat', async client => { + testUtils.testWithClient('client.hIncrByFloat', async client => { assert.equal( await client.hIncrByFloat('key', 'field', 1.5), '1.5' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/HKEYS.spec.ts b/lib/commands/HKEYS.spec.ts index 12190668b0b..f94538f67d3 100644 --- a/lib/commands/HKEYS.spec.ts +++ b/lib/commands/HKEYS.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './HKEYS'; describe('HKEYS', () => { @@ -10,10 +10,10 @@ describe('HKEYS', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.hKeys', async client => { + testUtils.testWithClient('client.hKeys', async client => { assert.deepEqual( await client.hKeys('key'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/HLEN.spec.ts b/lib/commands/HLEN.spec.ts index e9aaa64e6e5..be9d4b13a7d 100644 --- a/lib/commands/HLEN.spec.ts +++ b/lib/commands/HLEN.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './HLEN'; describe('HLEN', () => { @@ -10,10 +10,10 @@ describe('HLEN', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.hLen', async client => { + testUtils.testWithClient('client.hLen', async client => { assert.equal( await client.hLen('key'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/HMGET.spec.ts b/lib/commands/HMGET.spec.ts index 3b1c286e748..a7c934b760d 100644 --- a/lib/commands/HMGET.spec.ts +++ b/lib/commands/HMGET.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './HMGET'; describe('HMGET', () => { @@ -19,10 +19,10 @@ describe('HMGET', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.hmGet', async client => { + testUtils.testWithClient('client.hmGet', async client => { assert.deepEqual( await client.hmGet('key', 'field'), [null] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/HRANDFIELD.spec.ts b/lib/commands/HRANDFIELD.spec.ts index 70e2585cf93..df0a4fc7a1d 100644 --- a/lib/commands/HRANDFIELD.spec.ts +++ b/lib/commands/HRANDFIELD.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './HRANDFIELD'; describe('HRANDFIELD', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); it('transformArguments', () => { assert.deepEqual( @@ -12,10 +12,10 @@ describe('HRANDFIELD', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.hRandField', async client => { + testUtils.testWithClient('client.hRandField', async client => { assert.equal( await client.hRandField('key'), null ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/HRANDFIELD_COUNT.spec.ts b/lib/commands/HRANDFIELD_COUNT.spec.ts index 6954bd484af..4bfce0f7e23 100644 --- a/lib/commands/HRANDFIELD_COUNT.spec.ts +++ b/lib/commands/HRANDFIELD_COUNT.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './HRANDFIELD_COUNT'; describe('HRANDFIELD COUNT', () => { - describeHandleMinimumRedisVersion([6, 2, 5]); + testUtils.isVersionGreaterThanHook([6, 2, 5]); it('transformArguments', () => { assert.deepEqual( @@ -12,10 +12,10 @@ describe('HRANDFIELD COUNT', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.hRandFieldCount', async client => { + testUtils.testWithClient('client.hRandFieldCount', async client => { assert.deepEqual( await client.hRandFieldCount('key', 1), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/HRANDFIELD_COUNT_WITHVALUES.spec.ts b/lib/commands/HRANDFIELD_COUNT_WITHVALUES.spec.ts index 0c26cbc7938..c4e6409a726 100644 --- a/lib/commands/HRANDFIELD_COUNT_WITHVALUES.spec.ts +++ b/lib/commands/HRANDFIELD_COUNT_WITHVALUES.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './HRANDFIELD_COUNT_WITHVALUES'; describe('HRANDFIELD COUNT WITHVALUES', () => { - describeHandleMinimumRedisVersion([6, 2, 5]); + testUtils.isVersionGreaterThanHook([6, 2, 5]); it('transformArguments', () => { assert.deepEqual( @@ -12,10 +12,10 @@ describe('HRANDFIELD COUNT WITHVALUES', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.hRandFieldCountWithValues', async client => { + testUtils.testWithClient('client.hRandFieldCountWithValues', async client => { assert.deepEqual( await client.hRandFieldCountWithValues('key', 1), Object.create(null) ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/HSCAN.spec.ts b/lib/commands/HSCAN.spec.ts index 7441dd48d52..b426763b99b 100644 --- a/lib/commands/HSCAN.spec.ts +++ b/lib/commands/HSCAN.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './HSCAN'; describe('HSCAN', () => { @@ -65,7 +65,7 @@ describe('HSCAN', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.hScan', async client => { + testUtils.testWithClient('client.hScan', async client => { assert.deepEqual( await client.hScan('key', 0), { @@ -73,5 +73,5 @@ describe('HSCAN', () => { tuples: [] } ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/HSET.spec.ts b/lib/commands/HSET.spec.ts index e8dfe7865d3..507c7bbbf74 100644 --- a/lib/commands/HSET.spec.ts +++ b/lib/commands/HSET.spec.ts @@ -1,6 +1,6 @@ import { strict as assert } from 'assert'; import { transformArguments } from './HSET'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; describe('HSET', () => { describe('transformArguments', () => { @@ -33,17 +33,17 @@ describe('HSET', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.hSet', async client => { + testUtils.testWithClient('client.hSet', async client => { assert.equal( await client.hSet('key', 'field', 'value'), 1 ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.hSet', async cluster => { + testUtils.testWithCluster('cluster.hSet', async cluster => { assert.equal( await cluster.hSet('key', { field: 'value' }), 1 ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); \ No newline at end of file diff --git a/lib/commands/HSETNX.spec.ts b/lib/commands/HSETNX.spec.ts index f810c5e2b9a..190fa50ae97 100644 --- a/lib/commands/HSETNX.spec.ts +++ b/lib/commands/HSETNX.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './HSETNX'; describe('HSETNX', () => { @@ -10,10 +10,10 @@ describe('HSETNX', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.hSetNX', async client => { + testUtils.testWithClient('client.hSetNX', async client => { assert.equal( await client.hSetNX('key', 'field', 'value'), true ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/HSTRLEN.spec.ts b/lib/commands/HSTRLEN.spec.ts index 35bf08d54c4..79c3150211e 100644 --- a/lib/commands/HSTRLEN.spec.ts +++ b/lib/commands/HSTRLEN.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './HSTRLEN'; describe('HSTRLEN', () => { @@ -10,10 +10,10 @@ describe('HSTRLEN', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.hStrLen', async client => { + testUtils.testWithClient('client.hStrLen', async client => { assert.equal( await client.hStrLen('key', 'field'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/HVALS.spec.ts b/lib/commands/HVALS.spec.ts index 9e6451f500e..d0a6c39ce5f 100644 --- a/lib/commands/HVALS.spec.ts +++ b/lib/commands/HVALS.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './HVALS'; describe('HVALS', () => { @@ -10,10 +10,10 @@ describe('HVALS', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.hVals', async client => { + testUtils.testWithClient('client.hVals', async client => { assert.deepEqual( await client.hVals('key'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/INCR.spec.ts b/lib/commands/INCR.spec.ts index d64c3696af4..321d83edc54 100644 --- a/lib/commands/INCR.spec.ts +++ b/lib/commands/INCR.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './INCR'; describe('INCR', () => { @@ -10,10 +10,10 @@ describe('INCR', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.incr', async client => { + testUtils.testWithClient('client.incr', async client => { assert.equal( await client.incr('key'), 1 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/INCRBY.spec.ts b/lib/commands/INCRBY.spec.ts index 875277570cb..a671d0ec259 100644 --- a/lib/commands/INCRBY.spec.ts +++ b/lib/commands/INCRBY.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './INCRBY'; describe('INCR', () => { @@ -10,10 +10,10 @@ describe('INCR', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.incrBy', async client => { + testUtils.testWithClient('client.incrBy', async client => { assert.equal( await client.incrBy('key', 1), 1 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/INCRBYFLOAT.spec.ts b/lib/commands/INCRBYFLOAT.spec.ts index fe062b62905..b2dd5aa5da9 100644 --- a/lib/commands/INCRBYFLOAT.spec.ts +++ b/lib/commands/INCRBYFLOAT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './INCRBYFLOAT'; describe('INCRBYFLOAT', () => { @@ -10,10 +10,10 @@ describe('INCRBYFLOAT', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.incrByFloat', async client => { + testUtils.testWithClient('client.incrByFloat', async client => { assert.equal( await client.incrByFloat('key', 1.5), '1.5' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/KEYS.spec.ts b/lib/commands/KEYS.spec.ts index d11e8a0f58b..c066331ea7c 100644 --- a/lib/commands/KEYS.spec.ts +++ b/lib/commands/KEYS.spec.ts @@ -1,11 +1,11 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; describe('KEYS', () => { - itWithClient(TestRedisServers.OPEN, 'client.keys', async client => { + testUtils.testWithClient('client.keys', async client => { assert.deepEqual( await client.keys('pattern'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/LASTSAVE.spec.ts b/lib/commands/LASTSAVE.spec.ts index b8d801f70b5..a6b4863f39e 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 } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './LASTSAVE'; describe('LASTSAVE', () => { @@ -10,7 +10,7 @@ describe('LASTSAVE', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.lastSave', async client => { + testUtils.testWithClient('client.lastSave', async client => { assert.ok((await client.lastSave()) instanceof Date); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/LINDEX.spec.ts b/lib/commands/LINDEX.spec.ts index 74a6706ecdc..5e0b1473ec4 100644 --- a/lib/commands/LINDEX.spec.ts +++ b/lib/commands/LINDEX.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './LINDEX'; describe('LINDEX', () => { @@ -10,17 +10,17 @@ describe('LINDEX', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.lIndex', async client => { + testUtils.testWithClient('client.lIndex', async client => { assert.equal( await client.lIndex('key', 'element'), null ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.lIndex', async cluster => { + testUtils.testWithCluster('cluster.lIndex', async cluster => { assert.equal( await cluster.lIndex('key', 'element'), null ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/LINSERT.spec.ts b/lib/commands/LINSERT.spec.ts index 286e61d06d6..6cc429d6a2c 100644 --- a/lib/commands/LINSERT.spec.ts +++ b/lib/commands/LINSERT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './LINSERT'; describe('LINSERT', () => { @@ -10,17 +10,17 @@ describe('LINSERT', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.lInsert', async client => { + testUtils.testWithClient('client.lInsert', async client => { assert.equal( await client.lInsert('key', 'BEFORE', 'pivot', 'element'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.lLen', async cluster => { + testUtils.testWithCluster('cluster.lLen', async cluster => { assert.equal( await cluster.lInsert('key', 'BEFORE', 'pivot', 'element'), 0 ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/LLEN.spec.ts b/lib/commands/LLEN.spec.ts index 6e4581ddd1f..fb126ddad55 100644 --- a/lib/commands/LLEN.spec.ts +++ b/lib/commands/LLEN.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './LLEN'; describe('LLEN', () => { @@ -10,17 +10,17 @@ describe('LLEN', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.lLen', async client => { + testUtils.testWithClient('client.lLen', async client => { assert.equal( await client.lLen('key'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.lLen', async cluster => { + testUtils.testWithCluster('cluster.lLen', async cluster => { assert.equal( await cluster.lLen('key'), 0 ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/LMOVE.spec.ts b/lib/commands/LMOVE.spec.ts index bcb897f76ac..f1d418c394e 100644 --- a/lib/commands/LMOVE.spec.ts +++ b/lib/commands/LMOVE.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './LMOVE'; describe('LMOVE', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); it('transformArguments', () => { assert.deepEqual( @@ -12,17 +12,17 @@ describe('LMOVE', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.lMove', async client => { + testUtils.testWithClient('client.lMove', async client => { assert.equal( await client.lMove('source', 'destination', 'LEFT', 'RIGHT'), null ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.lMove', async cluster => { + testUtils.testWithCluster('cluster.lMove', async cluster => { assert.equal( await cluster.lMove('{tag}source', '{tag}destination', 'LEFT', 'RIGHT'), null ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/LOLWUT.spec.ts b/lib/commands/LOLWUT.spec.ts index 8f4478aecc7..db335893302 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 } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './LOLWUT'; describe('LOLWUT', () => { @@ -26,11 +26,10 @@ describe('LOLWUT', () => { }); }); - - itWithClient(TestRedisServers.OPEN, 'client.LOLWUT', async client => { + testUtils.testWithClient('client.LOLWUT', async client => { assert.equal( typeof (await client.LOLWUT()), 'string' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/LPOP.spec.ts b/lib/commands/LPOP.spec.ts index b593f657427..d694fb10588 100644 --- a/lib/commands/LPOP.spec.ts +++ b/lib/commands/LPOP.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './LPOP'; describe('LPOP', () => { @@ -10,17 +10,17 @@ describe('LPOP', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.lPop', async client => { + testUtils.testWithClient('client.lPop', async client => { assert.equal( await client.lPop('key'), null ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.lPop', async cluster => { + testUtils.testWithCluster('cluster.lPop', async cluster => { assert.equal( await cluster.lPop('key'), null ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/LPOP_COUNT.spec.ts b/lib/commands/LPOP_COUNT.spec.ts index 89150dbf4de..9d87fad3862 100644 --- a/lib/commands/LPOP_COUNT.spec.ts +++ b/lib/commands/LPOP_COUNT.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './LPOP_COUNT'; describe('LPOP COUNT', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); it('transformArguments', () => { assert.deepEqual( @@ -12,17 +12,17 @@ describe('LPOP COUNT', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.lPopCount', async client => { + testUtils.testWithClient('client.lPopCount', async client => { assert.equal( await client.lPopCount('key', 1), null ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.lPop', async cluster => { + testUtils.testWithCluster('cluster.lPopCount', async cluster => { assert.equal( await cluster.lPopCount('key', 1), null ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/LPOS.spec.ts b/lib/commands/LPOS.spec.ts index 1cf9e35209d..6b6050f2c3b 100644 --- a/lib/commands/LPOS.spec.ts +++ b/lib/commands/LPOS.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './LPOS'; describe('LPOS', () => { - describeHandleMinimumRedisVersion([6, 0, 6]); + testUtils.isVersionGreaterThanHook([6, 0, 6]); describe('transformArguments', () => { it('simple', () => { @@ -42,17 +42,17 @@ describe('LPOS', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.lPos', async client => { + testUtils.testWithClient('client.lPos', async client => { assert.equal( await client.lPos('key', 'element'), null ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.lPos', async cluster => { + testUtils.testWithCluster('cluster.lPos', async cluster => { assert.equal( await cluster.lPos('key', 'element'), null ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/LPOS_COUNT.spec.ts b/lib/commands/LPOS_COUNT.spec.ts index 1d80bd45c3c..4b01f2f59b9 100644 --- a/lib/commands/LPOS_COUNT.spec.ts +++ b/lib/commands/LPOS_COUNT.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './LPOS_COUNT'; describe('LPOS COUNT', () => { - describeHandleMinimumRedisVersion([6, 0, 6]); + testUtils.isVersionGreaterThanHook([6, 0, 6]); describe('transformArguments', () => { it('simple', () => { @@ -42,17 +42,17 @@ describe('LPOS COUNT', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.lPosCount', async client => { + testUtils.testWithClient('client.lPosCount', async client => { assert.deepEqual( await client.lPosCount('key', 'element', 0), [] ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.lPosCount', async cluster => { + testUtils.testWithCluster('cluster.lPosCount', async cluster => { assert.deepEqual( await cluster.lPosCount('key', 'element', 0), [] ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/LPUSH.spec.ts b/lib/commands/LPUSH.spec.ts index 44cf8c12d5f..b5b1f5084eb 100644 --- a/lib/commands/LPUSH.spec.ts +++ b/lib/commands/LPUSH.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './LPUSH'; describe('LPUSH', () => { @@ -19,17 +19,17 @@ describe('LPUSH', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.lPush', async client => { + testUtils.testWithClient('client.lPush', async client => { assert.equal( await client.lPush('key', 'field'), 1 ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.lPush', async cluster => { + testUtils.testWithCluster('cluster.lPush', async cluster => { assert.equal( await cluster.lPush('key', 'field'), 1 ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/LPUSHX.spec.ts b/lib/commands/LPUSHX.spec.ts index 1150c4d64dd..d978e5a588f 100644 --- a/lib/commands/LPUSHX.spec.ts +++ b/lib/commands/LPUSHX.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './LPUSHX'; describe('LPUSHX', () => { @@ -19,17 +19,17 @@ describe('LPUSHX', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.lPushX', async client => { + testUtils.testWithClient('client.lPushX', async client => { assert.equal( await client.lPushX('key', 'element'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.lPushX', async cluster => { + testUtils.testWithCluster('cluster.lPushX', async cluster => { assert.equal( await cluster.lPushX('key', 'element'), 0 ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/LRANGE.spec.ts b/lib/commands/LRANGE.spec.ts index 843b7b8815e..dffe6087b80 100644 --- a/lib/commands/LRANGE.spec.ts +++ b/lib/commands/LRANGE.spec.ts @@ -1,6 +1,6 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './LRANGE'; describe('LRANGE', () => { @@ -11,17 +11,17 @@ describe('LRANGE', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.lRange', async client => { + testUtils.testWithClient('client.lRange', async client => { assert.deepEqual( await client.lRange('key', 0, -1), [] ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.lRange', async cluster => { + testUtils.testWithCluster('cluster.lRange', async cluster => { assert.deepEqual( await cluster.lRange('key', 0, -1), [] ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/LREM.spec.ts b/lib/commands/LREM.spec.ts index e2f027ffeb8..3405f4beb07 100644 --- a/lib/commands/LREM.spec.ts +++ b/lib/commands/LREM.spec.ts @@ -1,6 +1,6 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './LREM'; describe('LREM', () => { @@ -11,17 +11,17 @@ describe('LREM', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.lRem', async client => { + testUtils.testWithClient('client.lRem', async client => { assert.equal( await client.lRem('key', 0, 'element'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.lRem', async cluster => { + testUtils.testWithCluster('cluster.lRem', async cluster => { assert.equal( await cluster.lRem('key', 0, 'element'), 0 ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/LSET.spec.ts b/lib/commands/LSET.spec.ts index a5fe78cf4c3..d7241032cc6 100644 --- a/lib/commands/LSET.spec.ts +++ b/lib/commands/LSET.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './LSET'; describe('LSET', () => { @@ -10,19 +10,19 @@ describe('LSET', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.lSet', async client => { + testUtils.testWithClient('client.lSet', async client => { await client.lPush('key', 'element'); assert.equal( await client.lSet('key', 0, 'element'), 'OK' ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.lSet', async cluster => { + testUtils.testWithCluster('cluster.lSet', async cluster => { await cluster.lPush('key', 'element'); assert.equal( await cluster.lSet('key', 0, 'element'), 'OK' ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/LTRIM.spec.ts b/lib/commands/LTRIM.spec.ts index 8092ba6af1e..5b6ac5d3660 100644 --- a/lib/commands/LTRIM.spec.ts +++ b/lib/commands/LTRIM.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './LTRIM'; describe('LTRIM', () => { @@ -10,17 +10,17 @@ describe('LTRIM', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.lTrim', async client => { + testUtils.testWithClient('client.lTrim', async client => { assert.equal( await client.lTrim('key', 0, -1), 'OK' ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.lTrim', async cluster => { + testUtils.testWithCluster('cluster.lTrim', async cluster => { assert.equal( await cluster.lTrim('key', 0, -1), 'OK' ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/LTRIM.ts b/lib/commands/LTRIM.ts index 018afd90a15..ab78e5305aa 100644 --- a/lib/commands/LTRIM.ts +++ b/lib/commands/LTRIM.ts @@ -6,7 +6,7 @@ export function transformArguments(key: string, start: number, stop: number): Ar key, start.toString(), stop.toString() - ] + ]; } export declare function transformReply(): string; diff --git a/lib/commands/MEMORY_DOCTOR.spec.ts b/lib/commands/MEMORY_DOCTOR.spec.ts index 1b4d16fa0db..ad97047606c 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 } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './MEMORY_DOCTOR'; describe('MEMORY DOCTOR', () => { @@ -10,10 +10,10 @@ describe('MEMORY DOCTOR', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.memoryDoctor', async client => { + testUtils.testWithClient('client.memoryDoctor', async client => { assert.equal( typeof (await client.memoryDoctor()), 'string' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/MEMORY_MALLOC-STATS.spec.ts b/lib/commands/MEMORY_MALLOC-STATS.spec.ts index 034b94f7c66..ce866f1e116 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 } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './MEMORY_MALLOC-STATS'; describe('MEMORY MALLOC-STATS', () => { @@ -10,10 +10,10 @@ describe('MEMORY MALLOC-STATS', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.memoryMallocStats', async client => { + testUtils.testWithClient('client.memoryMallocStats', async client => { assert.equal( typeof (await client.memoryDoctor()), 'string' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/MEMORY_PURGE.spec.ts b/lib/commands/MEMORY_PURGE.spec.ts index 97ca6feebf6..5d34331feb6 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 } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './MEMORY_PURGE'; describe('MEMORY PURGE', () => { @@ -10,10 +10,10 @@ describe('MEMORY PURGE', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.memoryPurge', async client => { + testUtils.testWithClient('client.memoryPurge', async client => { assert.equal( await client.memoryPurge(), 'OK' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/MEMORY_USAGE.spec.ts b/lib/commands/MEMORY_USAGE.spec.ts index 90dff62c674..fe5ff404d93 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 } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './MEMORY_USAGE'; describe('MEMORY USAGE', () => { @@ -21,10 +21,10 @@ describe('MEMORY USAGE', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.memoryUsage', async client => { + testUtils.testWithClient('client.memoryUsage', async client => { assert.equal( await client.memoryUsage('key'), null ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/MGET.spec.ts b/lib/commands/MGET.spec.ts index c8c020fe433..9ff47895f4e 100644 --- a/lib/commands/MGET.spec.ts +++ b/lib/commands/MGET.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './MGET'; describe('MGET', () => { @@ -10,17 +10,17 @@ describe('MGET', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.mGet', async client => { + testUtils.testWithClient('client.mGet', async client => { assert.deepEqual( await client.mGet(['key']), [null] ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.mGet', async cluster => { + testUtils.testWithCluster('cluster.mGet', async cluster => { assert.deepEqual( await cluster.mGet(['key']), [null] ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/MOVE.spec.ts b/lib/commands/MOVE.spec.ts index a05ca4613e9..f7fdc481cbf 100644 --- a/lib/commands/MOVE.spec.ts +++ b/lib/commands/MOVE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './MOVE'; describe('MOVE', () => { @@ -10,10 +10,10 @@ describe('MOVE', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.move', async client => { + testUtils.testWithClient('client.move', async client => { assert.equal( await client.move('key', 1), false ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/MSET.spec.ts b/lib/commands/MSET.spec.ts index 4445f4a7281..0568f38487e 100644 --- a/lib/commands/MSET.spec.ts +++ b/lib/commands/MSET.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './MSET'; describe('MSET', () => { @@ -26,17 +26,17 @@ describe('MSET', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.mSet', async client => { + testUtils.testWithClient('client.mSet', async client => { assert.equal( await client.mSet(['key1', 'value1', 'key2', 'value2']), 'OK' ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.mSet', async cluster => { + testUtils.testWithCluster('cluster.mSet', async cluster => { assert.equal( await cluster.mSet(['{key}1', 'value1', '{key}2', 'value2']), 'OK' ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/MSETNX.spec.ts b/lib/commands/MSETNX.spec.ts index 7f61a43e8d0..854a9affd8a 100644 --- a/lib/commands/MSETNX.spec.ts +++ b/lib/commands/MSETNX.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './MSETNX'; describe('MSETNX', () => { @@ -26,17 +26,17 @@ describe('MSETNX', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.mSetNX', async client => { + testUtils.testWithClient('client.mSetNX', async client => { assert.equal( await client.mSetNX(['key1', 'value1', 'key2', 'value2']), true ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.mSetNX', async cluster => { + testUtils.testWithCluster('cluster.mSetNX', async cluster => { assert.equal( await cluster.mSetNX(['{key}1', 'value1', '{key}2', 'value2']), true ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/PERSIST.spec.ts b/lib/commands/PERSIST.spec.ts index 05c0e7aed8e..4e53bd85a6c 100644 --- a/lib/commands/PERSIST.spec.ts +++ b/lib/commands/PERSIST.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './PERSIST'; describe('PERSIST', () => { @@ -10,10 +10,10 @@ describe('PERSIST', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.persist', async client => { + testUtils.testWithClient('client.persist', async client => { assert.equal( await client.persist('key'), false ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/PEXPIRE.spec.ts b/lib/commands/PEXPIRE.spec.ts index b7c4e1df461..4738edcf8f0 100644 --- a/lib/commands/PEXPIRE.spec.ts +++ b/lib/commands/PEXPIRE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './PEXPIRE'; describe('PEXPIRE', () => { @@ -10,10 +10,10 @@ describe('PEXPIRE', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.pExpire', async client => { + testUtils.testWithClient('client.pExpire', async client => { assert.equal( await client.pExpire('key', 1), false ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/PEXPIREAT.spec.ts b/lib/commands/PEXPIREAT.spec.ts index 6e5fc37ed5c..19fc3b888d7 100644 --- a/lib/commands/PEXPIREAT.spec.ts +++ b/lib/commands/PEXPIREAT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './PEXPIREAT'; describe('PEXPIREAT', () => { @@ -10,7 +10,7 @@ describe('PEXPIREAT', () => { ['PEXPIREAT', 'key', '1'] ); }); - + it('date', () => { const d = new Date(); assert.deepEqual( @@ -20,10 +20,10 @@ describe('PEXPIREAT', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.pExpireAt', async client => { + testUtils.testWithClient('client.pExpireAt', async client => { assert.equal( await client.pExpireAt('key', 1), false ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/PFADD.spec.ts b/lib/commands/PFADD.spec.ts index 74f03ea3ce2..8c0e752fd50 100644 --- a/lib/commands/PFADD.spec.ts +++ b/lib/commands/PFADD.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './PFADD'; describe('PFADD', () => { @@ -19,10 +19,10 @@ describe('PFADD', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.pfAdd', async client => { + testUtils.testWithClient('client.pfAdd', async client => { assert.equal( await client.pfAdd('key', '1'), true ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/PFCOUNT.spec.ts b/lib/commands/PFCOUNT.spec.ts index 049fa2c200c..a1ea06c4494 100644 --- a/lib/commands/PFCOUNT.spec.ts +++ b/lib/commands/PFCOUNT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './PFCOUNT'; describe('PFCOUNT', () => { @@ -19,10 +19,10 @@ describe('PFCOUNT', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.pfCount', async client => { + testUtils.testWithClient('client.pfCount', async client => { assert.equal( await client.pfCount('key'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/PFMERGE.spec.ts b/lib/commands/PFMERGE.spec.ts index 1f6ed24bcd1..881fc5f5439 100644 --- a/lib/commands/PFMERGE.spec.ts +++ b/lib/commands/PFMERGE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './PFMERGE'; describe('PFMERGE', () => { @@ -19,10 +19,10 @@ describe('PFMERGE', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.pfMerge', async client => { + testUtils.testWithClient('client.pfMerge', async client => { assert.equal( await client.pfMerge('destination', 'source'), 'OK' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/PING.spec.ts b/lib/commands/PING.spec.ts index 43b683f192d..85b48fec6b5 100644 --- a/lib/commands/PING.spec.ts +++ b/lib/commands/PING.spec.ts @@ -1,11 +1,11 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; describe('PING', () => { - itWithClient(TestRedisServers.OPEN, 'client.ping', async client => { + testUtils.testWithClient('client.ping', async client => { assert.equal( await client.ping(), 'PONG' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/PSETEX.spec.ts b/lib/commands/PSETEX.spec.ts index c98142effa9..61a6e682b08 100644 --- a/lib/commands/PSETEX.spec.ts +++ b/lib/commands/PSETEX.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './PSETEX'; describe('PSETEX', () => { @@ -10,17 +10,17 @@ describe('PSETEX', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.pSetEx', async client => { + testUtils.testWithClient('client.pSetEx', async client => { assert.equal( await client.pSetEx('key', 1, 'value'), 'OK' ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.pSetEx', async cluster => { + testUtils.testWithCluster('cluster.pSetEx', async cluster => { assert.equal( await cluster.pSetEx('key', 1, 'value'), 'OK' ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/PTTL.spec.ts b/lib/commands/PTTL.spec.ts index 35f48c2cc3e..e65421de590 100644 --- a/lib/commands/PTTL.spec.ts +++ b/lib/commands/PTTL.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './PTTL'; describe('PTTL', () => { @@ -10,10 +10,10 @@ describe('PTTL', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.pTTL', async client => { + testUtils.testWithClient('client.pTTL', async client => { assert.equal( await client.pTTL('key'), -2 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/PUBLISH.spec.ts b/lib/commands/PUBLISH.spec.ts index e746b9490e0..b2084e668ba 100644 --- a/lib/commands/PUBLISH.spec.ts +++ b/lib/commands/PUBLISH.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './PUBLISH'; describe('PUBLISH', () => { @@ -10,10 +10,10 @@ describe('PUBLISH', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.publish', async client => { + testUtils.testWithClient('client.publish', async client => { assert.equal( await client.publish('channel', 'message'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/PUBSUB_CHANNELS.spec.ts b/lib/commands/PUBSUB_CHANNELS.spec.ts index 9e148bc7fda..c427eab4850 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 } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './PUBSUB_CHANNELS'; describe('PUBSUB CHANNELS', () => { @@ -19,10 +19,10 @@ describe('PUBSUB CHANNELS', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.pubSubChannels', async client => { + testUtils.testWithClient('client.pubSubChannels', async client => { assert.deepEqual( await client.pubSubChannels(), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/PUBSUB_NUMPAT.spec.ts b/lib/commands/PUBSUB_NUMPAT.spec.ts index 55eef6a97de..d738b916c60 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 } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './PUBSUB_NUMPAT'; describe('PUBSUB NUMPAT', () => { @@ -10,10 +10,10 @@ describe('PUBSUB NUMPAT', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.pubSubNumPat', async client => { + testUtils.testWithClient('client.pubSubNumPat', async client => { assert.equal( await client.pubSubNumPat(), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/PUBSUB_NUMSUB.spec.ts b/lib/commands/PUBSUB_NUMSUB.spec.ts index ef44faf2c0b..e35558ef865 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 } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './PUBSUB_NUMSUB'; describe('PUBSUB NUMSUB', () => { @@ -26,10 +26,10 @@ describe('PUBSUB NUMSUB', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.pubSubNumSub', async client => { + testUtils.testWithClient('client.pubSubNumSub', async client => { assert.deepEqual( await client.pubSubNumSub(), Object.create(null) ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/RANDOMKEY.spec.ts b/lib/commands/RANDOMKEY.spec.ts index 171c42be116..81c42b2fd83 100644 --- a/lib/commands/RANDOMKEY.spec.ts +++ b/lib/commands/RANDOMKEY.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './RANDOMKEY'; describe('RANDOMKEY', () => { @@ -10,10 +10,10 @@ describe('RANDOMKEY', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.randomKey', async client => { + testUtils.testWithClient('client.randomKey', async client => { assert.equal( await client.randomKey(), null ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/RENAME.spec.ts b/lib/commands/RENAME.spec.ts index 9d447c600b6..49e0af600f6 100644 --- a/lib/commands/RENAME.spec.ts +++ b/lib/commands/RENAME.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './RENAME'; describe('RENAME', () => { @@ -10,12 +10,12 @@ describe('RENAME', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.rename', async client => { + testUtils.testWithClient('client.rename', async client => { await client.set('from', 'value'); assert.equal( await client.rename('from', 'to'), 'OK' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/RENAMENX.spec.ts b/lib/commands/RENAMENX.spec.ts index f438834b90e..6345eb5bd09 100644 --- a/lib/commands/RENAMENX.spec.ts +++ b/lib/commands/RENAMENX.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './RENAMENX'; describe('RENAMENX', () => { @@ -10,12 +10,12 @@ describe('RENAMENX', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.renameNX', async client => { + testUtils.testWithClient('client.renameNX', async client => { await client.set('from', 'value'); assert.equal( await client.renameNX('from', 'to'), true ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ROLE.spec.ts b/lib/commands/ROLE.spec.ts index 5b647e07ca6..2e6d9b163ae 100644 --- a/lib/commands/ROLE.spec.ts +++ b/lib/commands/ROLE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { itWithClient, TestRedisServers } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './ROLE'; describe('ROLE', () => { @@ -56,7 +56,7 @@ describe('ROLE', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.role', async client => { + testUtils.testWithClient('client.role', async client => { assert.deepEqual( await client.role(), { @@ -65,5 +65,5 @@ describe('ROLE', () => { replicas: [] } ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/RPOP.spec.ts b/lib/commands/RPOP.spec.ts index 2a753ff1a66..6e57afa3216 100644 --- a/lib/commands/RPOP.spec.ts +++ b/lib/commands/RPOP.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './RPOP'; describe('RPOP', () => { @@ -10,17 +10,17 @@ describe('RPOP', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.rPop', async client => { + testUtils.testWithClient('client.rPop', async client => { assert.equal( await client.rPop('key'), null ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.rPop', async cluster => { + testUtils.testWithCluster('cluster.rPop', async cluster => { assert.equal( await cluster.rPop('key'), null ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/RPOPLPUSH.spec.ts b/lib/commands/RPOPLPUSH.spec.ts index 75b5f2e18f9..cef3049bd91 100644 --- a/lib/commands/RPOPLPUSH.spec.ts +++ b/lib/commands/RPOPLPUSH.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './RPOPLPUSH'; describe('RPOPLPUSH', () => { @@ -10,17 +10,17 @@ describe('RPOPLPUSH', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.rPopLPush', async client => { + testUtils.testWithClient('client.rPopLPush', async client => { assert.equal( await client.rPopLPush('source', 'destination'), null ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.rPopLPush', async cluster => { + testUtils.testWithCluster('cluster.rPopLPush', async cluster => { assert.equal( await cluster.rPopLPush('{tag}source', '{tag}destination'), null ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/RPOP_COUNT.spec.ts b/lib/commands/RPOP_COUNT.spec.ts index 2624540f124..3657a608039 100644 --- a/lib/commands/RPOP_COUNT.spec.ts +++ b/lib/commands/RPOP_COUNT.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './RPOP_COUNT'; describe('RPOP COUNT', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); it('transformArguments', () => { assert.deepEqual( @@ -12,17 +12,17 @@ describe('RPOP COUNT', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.rPopCount', async client => { + testUtils.testWithClient('client.rPopCount', async client => { assert.equal( await client.rPopCount('key', 1), null ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.rPopCount', async cluster => { + testUtils.testWithCluster('cluster.rPopCount', async cluster => { assert.equal( await cluster.rPopCount('key', 1), null ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/RPUSH.spec.ts b/lib/commands/RPUSH.spec.ts index 4336d10c9a3..afa5c1c6400 100644 --- a/lib/commands/RPUSH.spec.ts +++ b/lib/commands/RPUSH.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './RPUSH'; describe('RPUSH', () => { @@ -19,17 +19,17 @@ describe('RPUSH', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.rPush', async client => { + testUtils.testWithClient('client.rPush', async client => { assert.equal( await client.rPush('key', 'element'), 1 ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.rPush', async cluster => { + testUtils.testWithCluster('cluster.rPush', async cluster => { assert.equal( await cluster.rPush('key', 'element'), 1 ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/RPUSHX.spec.ts b/lib/commands/RPUSHX.spec.ts index 18f91e8bef6..ee2041de6f2 100644 --- a/lib/commands/RPUSHX.spec.ts +++ b/lib/commands/RPUSHX.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './RPUSHX'; describe('RPUSHX', () => { @@ -19,17 +19,17 @@ describe('RPUSHX', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.rPushX', async client => { + testUtils.testWithClient('client.rPushX', async client => { assert.equal( await client.rPushX('key', 'element'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.rPushX', async cluster => { + testUtils.testWithCluster('cluster.rPushX', async cluster => { assert.equal( await cluster.rPushX('key', 'element'), 0 ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/SADD.spec.ts b/lib/commands/SADD.spec.ts index bf1ee48fe7f..4533f6f9ad5 100644 --- a/lib/commands/SADD.spec.ts +++ b/lib/commands/SADD.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SADD'; describe('SADD', () => { @@ -19,10 +19,10 @@ describe('SADD', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.sAdd', async client => { + testUtils.testWithClient('client.sAdd', async client => { assert.equal( await client.sAdd('key', 'member'), 1 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SCAN.spec.ts b/lib/commands/SCAN.spec.ts index 975c4cb6d2f..7657b744e02 100644 --- a/lib/commands/SCAN.spec.ts +++ b/lib/commands/SCAN.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './SCAN'; describe('SCAN', () => { @@ -72,7 +72,7 @@ describe('SCAN', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.scan', async client => { + testUtils.testWithClient('client.scan', async client => { assert.deepEqual( await client.scan(0), { @@ -80,5 +80,5 @@ describe('SCAN', () => { keys: [] } ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SCARD.spec.ts b/lib/commands/SCARD.spec.ts index b6681693814..afc21c6b00c 100644 --- a/lib/commands/SCARD.spec.ts +++ b/lib/commands/SCARD.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SCARD'; describe('SCARD', () => { @@ -10,10 +10,10 @@ describe('SCARD', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.sCard', async client => { + testUtils.testWithClient('client.sCard', async client => { assert.equal( await client.sCard('key'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SCRIPT_DEBUG.spec.ts b/lib/commands/SCRIPT_DEBUG.spec.ts index 9d2ad1af266..192f90f75a5 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 } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SCRIPT_DEBUG'; describe('SCRIPT DEBUG', () => { @@ -10,10 +10,10 @@ describe('SCRIPT DEBUG', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.scriptDebug', async client => { + testUtils.testWithClient('client.scriptDebug', async client => { assert.equal( await client.scriptDebug('NO'), 'OK' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SCRIPT_EXISTS.spec.ts b/lib/commands/SCRIPT_EXISTS.spec.ts index b23380c7579..e0fbbcc5537 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 } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SCRIPT_EXISTS'; describe('SCRIPT EXISTS', () => { @@ -19,10 +19,10 @@ describe('SCRIPT EXISTS', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.scriptExists', async client => { + testUtils.testWithClient('client.scriptExists', async client => { assert.deepEqual( await client.scriptExists('sha1'), [false] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SCRIPT_FLUSH.spec.ts b/lib/commands/SCRIPT_FLUSH.spec.ts index c77accb50a9..ae156e937d1 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 } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SCRIPT_FLUSH'; describe('SCRIPT FLUSH', () => { @@ -19,10 +19,10 @@ describe('SCRIPT FLUSH', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.scriptFlush', async client => { + testUtils.testWithClient('client.scriptFlush', async client => { assert.equal( await client.scriptFlush(), 'OK' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SCRIPT_LOAD.spec.ts b/lib/commands/SCRIPT_LOAD.spec.ts index 1d7da3e9c2d..062f3c201e1 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 } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SCRIPT_LOAD'; describe('SCRIPT LOAD', () => { @@ -14,10 +14,10 @@ describe('SCRIPT LOAD', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.scriptLoad', async client => { + testUtils.testWithClient('client.scriptLoad', async client => { assert.equal( await client.scriptLoad(SCRIPT), SCRIPT_SHA1 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SDIFF.spec.ts b/lib/commands/SDIFF.spec.ts index 82ef2dac6fc..340906e9350 100644 --- a/lib/commands/SDIFF.spec.ts +++ b/lib/commands/SDIFF.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SDIFF'; describe('SDIFF', () => { @@ -19,10 +19,10 @@ describe('SDIFF', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.sDiff', async client => { + testUtils.testWithClient('client.sDiff', async client => { assert.deepEqual( await client.sDiff('key'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SDIFFSTORE.spec.ts b/lib/commands/SDIFFSTORE.spec.ts index 1e7f5f6f32c..263b4f43f64 100644 --- a/lib/commands/SDIFFSTORE.spec.ts +++ b/lib/commands/SDIFFSTORE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SDIFFSTORE'; describe('SDIFFSTORE', () => { @@ -19,10 +19,10 @@ describe('SDIFFSTORE', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.sDiffStore', async client => { + testUtils.testWithClient('client.sDiffStore', async client => { assert.equal( await client.sDiffStore('destination', 'key'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SET.spec.ts b/lib/commands/SET.spec.ts index 32d138f2920..353885a3097 100644 --- a/lib/commands/SET.spec.ts +++ b/lib/commands/SET.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SET'; describe('SET', () => { @@ -100,14 +100,14 @@ describe('SET', () => { }); describe('client.set', () => { - itWithClient(TestRedisServers.OPEN, 'simple', async client => { + testUtils.testWithClient('simple', async client => { assert.equal( await client.set('key', 'value'), 'OK' ); - }); - - itWithClient(TestRedisServers.OPEN, 'with GET on empty key', async client => { + }, GLOBAL.SERVERS.OPEN); + + testUtils.testWithClient('with GET on empty key', async client => { assert.equal( await client.set('key', 'value', { GET: true @@ -115,7 +115,8 @@ describe('SET', () => { null ); }, { - minimumRedisVersion: [6, 2] + ...GLOBAL.SERVERS.OPEN, + minimumDockerVersion: [6, 2] }); }); }); diff --git a/lib/commands/SETBIT.spec.ts b/lib/commands/SETBIT.spec.ts index 7347913f293..43fbff7c2d9 100644 --- a/lib/commands/SETBIT.spec.ts +++ b/lib/commands/SETBIT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SETBIT'; describe('SETBIT', () => { @@ -10,17 +10,17 @@ describe('SETBIT', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.setBit', async client => { + testUtils.testWithClient('client.setBit', async client => { assert.equal( await client.setBit('key', 0, 1), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.setBit', async cluster => { + testUtils.testWithCluster('cluster.setBit', async cluster => { assert.equal( await cluster.setBit('key', 0, 1), 0 ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/SETEX.spec.ts b/lib/commands/SETEX.spec.ts index 7ea55eba83c..bca298c6c04 100644 --- a/lib/commands/SETEX.spec.ts +++ b/lib/commands/SETEX.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SETEX'; describe('SETEX', () => { @@ -10,17 +10,17 @@ describe('SETEX', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.setEx', async client => { + testUtils.testWithClient('client.setEx', async client => { assert.equal( await client.setEx('key', 1, 'value'), 'OK' ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.setEx', async cluster => { + testUtils.testWithCluster('cluster.setEx', async cluster => { assert.equal( await cluster.setEx('key', 1, 'value'), 'OK' ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/SETNX .spec.ts b/lib/commands/SETNX .spec.ts index daf3ca6e76a..c5bdfcffa2c 100644 --- a/lib/commands/SETNX .spec.ts +++ b/lib/commands/SETNX .spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, TestRedisClusters, itWithCluster } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SETNX'; describe('SETNX', () => { @@ -10,17 +10,17 @@ describe('SETNX', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.setNX', async client => { + testUtils.testWithClient('client.setNX', async client => { assert.equal( await client.setNX('key', 'value'), true ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.setNX', async cluster => { + testUtils.testWithCluster('cluster.setNX', async cluster => { assert.equal( await cluster.setNX('key', 'value'), true ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/SETRANGE.spec.ts b/lib/commands/SETRANGE.spec.ts index 766c56c5ff1..398b7730404 100644 --- a/lib/commands/SETRANGE.spec.ts +++ b/lib/commands/SETRANGE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SETRANGE'; describe('SETRANGE', () => { @@ -10,17 +10,17 @@ describe('SETRANGE', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.setRange', async client => { + testUtils.testWithClient('client.setRange', async client => { assert.equal( await client.setRange('key', 0, 'value'), 5 ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.setRange', async cluster => { + testUtils.testWithCluster('cluster.setRange', async cluster => { assert.equal( await cluster.setRange('key', 0, 'value'), 5 ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/SINTER.spec.ts b/lib/commands/SINTER.spec.ts index 8fee35427cf..2324eac3ee8 100644 --- a/lib/commands/SINTER.spec.ts +++ b/lib/commands/SINTER.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SINTER'; describe('SINTER', () => { @@ -19,10 +19,10 @@ describe('SINTER', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.sInter', async client => { + testUtils.testWithClient('client.sInter', async client => { assert.deepEqual( await client.sInter('key'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SINTERSTORE.spec.ts b/lib/commands/SINTERSTORE.spec.ts index 013931d2312..c4a6a095e7d 100644 --- a/lib/commands/SINTERSTORE.spec.ts +++ b/lib/commands/SINTERSTORE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SINTERSTORE'; describe('SINTERSTORE', () => { @@ -19,10 +19,10 @@ describe('SINTERSTORE', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.sInterStore', async client => { + testUtils.testWithClient('client.sInterStore', async client => { assert.equal( await client.sInterStore('destination', 'key'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SISMEMBER.spec.ts b/lib/commands/SISMEMBER.spec.ts index fec4ebfc57d..8d18c83697a 100644 --- a/lib/commands/SISMEMBER.spec.ts +++ b/lib/commands/SISMEMBER.spec.ts @@ -1,10 +1,8 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SISMEMBER'; describe('SISMEMBER', () => { - describeHandleMinimumRedisVersion([6, 2]); - it('transformArguments', () => { assert.deepEqual( transformArguments('key', 'member'), @@ -12,10 +10,10 @@ describe('SISMEMBER', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.sIsMember', async client => { + testUtils.testWithClient('client.sIsMember', async client => { assert.equal( await client.sIsMember('key', 'member'), false ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SMEMBERS.spec.ts b/lib/commands/SMEMBERS.spec.ts index 2398dbaa8c6..b9c58c9eebb 100644 --- a/lib/commands/SMEMBERS.spec.ts +++ b/lib/commands/SMEMBERS.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SMEMBERS'; describe('SMEMBERS', () => { @@ -10,10 +10,10 @@ describe('SMEMBERS', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.sMembers', async client => { + testUtils.testWithClient('client.sMembers', async client => { assert.deepEqual( await client.sMembers('key'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SMISMEMBER.spec.ts b/lib/commands/SMISMEMBER.spec.ts index 320f60d4ba2..e3728134029 100644 --- a/lib/commands/SMISMEMBER.spec.ts +++ b/lib/commands/SMISMEMBER.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SMISMEMBER'; describe('SMISMEMBER', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); it('transformArguments', () => { assert.deepEqual( @@ -12,10 +12,10 @@ describe('SMISMEMBER', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.smIsMember', async client => { + testUtils.testWithClient('client.smIsMember', async client => { assert.deepEqual( await client.smIsMember('key', ['1', '2']), [false, false] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SMOVE.spec.ts b/lib/commands/SMOVE.spec.ts index 97e938a46bb..e3308ee8143 100644 --- a/lib/commands/SMOVE.spec.ts +++ b/lib/commands/SMOVE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SMOVE'; describe('SMOVE', () => { @@ -10,10 +10,10 @@ describe('SMOVE', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.sMove', async client => { + testUtils.testWithClient('client.sMove', async client => { assert.equal( await client.sMove('source', 'destination', 'member'), false ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SORT.spec.ts b/lib/commands/SORT.spec.ts index c449e0511f0..637f48876dc 100644 --- a/lib/commands/SORT.spec.ts +++ b/lib/commands/SORT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SORT'; describe('SORT', () => { @@ -60,7 +60,7 @@ describe('SORT', () => { ['SORT', 'key', 'ASC'] ); }); - + it('with ALPHA', () => { assert.deepEqual( transformArguments('key', { @@ -97,10 +97,10 @@ describe('SORT', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.sort', async client => { + testUtils.testWithClient('client.sort', async client => { assert.deepEqual( await client.sort('key'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SPOP.spec.ts b/lib/commands/SPOP.spec.ts index 238c58f4796..6a384d181fc 100644 --- a/lib/commands/SPOP.spec.ts +++ b/lib/commands/SPOP.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SPOP'; describe('SPOP', () => { @@ -19,10 +19,10 @@ describe('SPOP', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.sPop', async client => { + testUtils.testWithClient('client.sPop', async client => { assert.equal( await client.sPop('key'), null ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SRANDMEMBER.spec.ts b/lib/commands/SRANDMEMBER.spec.ts index 5c359f73f96..291271540be 100644 --- a/lib/commands/SRANDMEMBER.spec.ts +++ b/lib/commands/SRANDMEMBER.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SRANDMEMBER'; describe('SRANDMEMBER', () => { @@ -10,10 +10,10 @@ describe('SRANDMEMBER', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.sRandMember', async client => { + testUtils.testWithClient('client.sRandMember', async client => { assert.equal( await client.sRandMember('key'), null ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SRANDMEMBER_COUNT.spec.ts b/lib/commands/SRANDMEMBER_COUNT.spec.ts index 81a4fd45f31..d3d787b3e63 100644 --- a/lib/commands/SRANDMEMBER_COUNT.spec.ts +++ b/lib/commands/SRANDMEMBER_COUNT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SRANDMEMBER_COUNT'; describe('SRANDMEMBER COUNT', () => { @@ -10,10 +10,10 @@ describe('SRANDMEMBER COUNT', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.sRandMemberCount', async client => { + testUtils.testWithClient('client.sRandMemberCount', async client => { assert.deepEqual( await client.sRandMemberCount('key', 1), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SREM.spec.ts b/lib/commands/SREM.spec.ts index c9270624ae9..d53d7b0334d 100644 --- a/lib/commands/SREM.spec.ts +++ b/lib/commands/SREM.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SREM'; describe('SREM', () => { @@ -19,10 +19,10 @@ describe('SREM', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.sRem', async client => { + testUtils.testWithClient('client.sRem', async client => { assert.equal( await client.sRem('key', 'member'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SSCAN.spec.ts b/lib/commands/SSCAN.spec.ts index 9b203ffb83e..71a90bf81d8 100644 --- a/lib/commands/SSCAN.spec.ts +++ b/lib/commands/SSCAN.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './SSCAN'; describe('SSCAN', () => { @@ -62,7 +62,7 @@ describe('SSCAN', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.sScan', async client => { + testUtils.testWithClient('client.sScan', async client => { assert.deepEqual( await client.sScan('key', 0), { @@ -70,5 +70,5 @@ describe('SSCAN', () => { members: [] } ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/STRLEN.spec.ts b/lib/commands/STRLEN.spec.ts index 3d24e360372..519c68d3e5d 100644 --- a/lib/commands/STRLEN.spec.ts +++ b/lib/commands/STRLEN.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './STRLEN'; describe('STRLEN', () => { @@ -10,17 +10,17 @@ describe('STRLEN', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.strLen', async client => { + testUtils.testWithClient('client.strLen', async client => { assert.equal( await client.strLen('key'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.strLen', async cluster => { + testUtils.testWithCluster('cluster.strLen', async cluster => { assert.equal( await cluster.strLen('key'), 0 ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/SUNION.spec.ts b/lib/commands/SUNION.spec.ts index fdf97668971..2918607c1d6 100644 --- a/lib/commands/SUNION.spec.ts +++ b/lib/commands/SUNION.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SUNION'; describe('SUNION', () => { @@ -19,10 +19,10 @@ describe('SUNION', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.sUnion', async client => { + testUtils.testWithClient('client.sUnion', async client => { assert.deepEqual( await client.sUnion('key'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SUNIONSTORE.spec.ts b/lib/commands/SUNIONSTORE.spec.ts index 82c9a03a0b8..142533eea2b 100644 --- a/lib/commands/SUNIONSTORE.spec.ts +++ b/lib/commands/SUNIONSTORE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SUNIONSTORE'; describe('SUNIONSTORE', () => { @@ -19,10 +19,10 @@ describe('SUNIONSTORE', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.sUnionStore', async client => { + testUtils.testWithClient('client.sUnionStore', async client => { assert.equal( await client.sUnionStore('destination', 'key'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/SWAPDB.spec.ts b/lib/commands/SWAPDB.spec.ts index 1a5637ae43d..add87512a64 100644 --- a/lib/commands/SWAPDB.spec.ts +++ b/lib/commands/SWAPDB.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { itWithClient, TestRedisServers } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './SWAPDB'; describe('SWAPDB', () => { @@ -10,10 +10,10 @@ describe('SWAPDB', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.swapDb', async client => { + testUtils.testWithClient('client.swapDb', async client => { assert.equal( await client.swapDb(0, 1), 'OK' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/TIME.spec.ts b/lib/commands/TIME.spec.ts index 1a07114af4b..bbaa7942db0 100644 --- a/lib/commands/TIME.spec.ts +++ b/lib/commands/TIME.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './TIME'; describe('TIME', () => { @@ -10,9 +10,9 @@ describe('TIME', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.time', async client => { + testUtils.testWithClient('client.time', async client => { const reply = await client.time(); assert.ok(reply instanceof Date); assert.ok(typeof reply.microseconds === 'number'); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/TOUCH.spec.ts b/lib/commands/TOUCH.spec.ts index c4cb4356291..578c49587d7 100644 --- a/lib/commands/TOUCH.spec.ts +++ b/lib/commands/TOUCH.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './TOUCH'; describe('TOUCH', () => { @@ -19,10 +19,10 @@ describe('TOUCH', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.touch', async client => { + testUtils.testWithClient('client.touch', async client => { assert.equal( await client.touch('key'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/TTL.spec.ts b/lib/commands/TTL.spec.ts index bcabe8d39e5..e37a6ab714b 100644 --- a/lib/commands/TTL.spec.ts +++ b/lib/commands/TTL.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './TTL'; describe('TTL', () => { @@ -10,10 +10,10 @@ describe('TTL', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.ttl', async client => { + testUtils.testWithClient('client.ttl', async client => { assert.equal( await client.ttl('key'), -2 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/TYPE.spec.ts b/lib/commands/TYPE.spec.ts index d40f724242d..1040bf979b3 100644 --- a/lib/commands/TYPE.spec.ts +++ b/lib/commands/TYPE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './TYPE'; describe('TYPE', () => { @@ -10,10 +10,10 @@ describe('TYPE', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.type', async client => { + testUtils.testWithClient('client.type', async client => { assert.equal( await client.type('key'), 'none' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/UNLINK.spec.ts b/lib/commands/UNLINK.spec.ts index a0dddf54f25..e8355407d8f 100644 --- a/lib/commands/UNLINK.spec.ts +++ b/lib/commands/UNLINK.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './UNLINK'; describe('UNLINK', () => { @@ -19,10 +19,10 @@ describe('UNLINK', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.unlink', async client => { + testUtils.testWithClient('client.unlink', async client => { assert.equal( await client.unlink('key'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/UNWATCH.spec.ts b/lib/commands/UNWATCH.spec.ts index 07059310cbc..109ed0fa7c0 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 } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './UNWATCH'; describe('UNWATCH', () => { @@ -10,10 +10,10 @@ describe('UNWATCH', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.unwatch', async client => { + testUtils.testWithClient('client.unwatch', async client => { assert.equal( await client.unwatch(), 'OK' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/WAIT.spec.ts b/lib/commands/WAIT.spec.ts index c3f53b7db70..c85ef598612 100644 --- a/lib/commands/WAIT.spec.ts +++ b/lib/commands/WAIT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './WAIT'; describe('WAIT', () => { @@ -10,10 +10,10 @@ describe('WAIT', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.wait', async client => { + testUtils.testWithClient('client.wait', async client => { assert.equal( await client.wait(0, 1), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XACK.spec.ts b/lib/commands/XACK.spec.ts index fb267c355eb..0586a5921fd 100644 --- a/lib/commands/XACK.spec.ts +++ b/lib/commands/XACK.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './XACK'; describe('XACK', () => { @@ -19,10 +19,10 @@ describe('XACK', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.xAck', async client => { + testUtils.testWithClient('client.xAck', async client => { assert.equal( await client.xAck('key', 'group', '1-0'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XADD.spec.ts b/lib/commands/XADD.spec.ts index 02e6888051c..4b556ecc27c 100644 --- a/lib/commands/XADD.spec.ts +++ b/lib/commands/XADD.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './XADD'; describe('XADD', () => { @@ -60,7 +60,7 @@ describe('XADD', () => { ['XADD', 'key', 'MAXLEN', '1000', '*','field', 'value'] ); }); - + it('with TRIM.strategyModifier', () => { assert.deepEqual( transformArguments('key', '*', { @@ -107,12 +107,12 @@ describe('XADD', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.xAdd', async client => { + testUtils.testWithClient('client.xAdd', async client => { assert.equal( typeof await client.xAdd('key', '*', { field: 'value' }), 'string' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XAUTOCLAIM.spec.ts b/lib/commands/XAUTOCLAIM.spec.ts index a0818d5c2c3..4447a06d773 100644 --- a/lib/commands/XAUTOCLAIM.spec.ts +++ b/lib/commands/XAUTOCLAIM.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './XAUTOCLAIM'; describe('XAUTOCLAIM', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); describe('transformArguments', () => { it('simple', () => { @@ -23,14 +23,14 @@ describe('XAUTOCLAIM', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.xAutoClaim', async client => { + testUtils.testWithClient('client.xAutoClaim', async client => { await Promise.all([ client.xGroupCreate('key', 'group', '$', { MKSTREAM: true }), client.xGroupCreateConsumer('key', 'group', 'consumer'), ]); - + assert.deepEqual( await client.xAutoClaim('key', 'group', 'consumer', 1, '0-0'), { @@ -38,5 +38,5 @@ describe('XAUTOCLAIM', () => { messages: [] } ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XAUTOCLAIM_JUSTID.spec.ts b/lib/commands/XAUTOCLAIM_JUSTID.spec.ts index d076f28751a..9aa24cd04a4 100644 --- a/lib/commands/XAUTOCLAIM_JUSTID.spec.ts +++ b/lib/commands/XAUTOCLAIM_JUSTID.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './XAUTOCLAIM_JUSTID'; describe('XAUTOCLAIM JUSTID', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); it('transformArguments', () => { assert.deepEqual( @@ -12,7 +12,7 @@ describe('XAUTOCLAIM JUSTID', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.xAutoClaimJustId', async client => { + testUtils.testWithClient('client.xAutoClaimJustId', async client => { await Promise.all([ client.xGroupCreate('key', 'group', '$', { MKSTREAM: true @@ -27,5 +27,5 @@ describe('XAUTOCLAIM JUSTID', () => { messages: [] } ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XCLAIM.spec.ts b/lib/commands/XCLAIM.spec.ts index ff4b445dcf3..141a62ab77a 100644 --- a/lib/commands/XCLAIM.spec.ts +++ b/lib/commands/XCLAIM.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './XCLAIM'; describe('XCLAIM', () => { @@ -77,14 +77,14 @@ describe('XCLAIM', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.xClaim', async client => { + testUtils.testWithClient('client.xClaim', async client => { await client.xGroupCreate('key', 'group', '$', { MKSTREAM: true }); - + assert.deepEqual( await client.xClaim('key', 'group', 'consumer', 1, '0-0'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XCLAIM_JUSTID.spec.ts b/lib/commands/XCLAIM_JUSTID.spec.ts index bb31f2c4532..619f876d53d 100644 --- a/lib/commands/XCLAIM_JUSTID.spec.ts +++ b/lib/commands/XCLAIM_JUSTID.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './XCLAIM_JUSTID'; describe('XCLAIM JUSTID', () => { @@ -10,14 +10,14 @@ describe('XCLAIM JUSTID', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.xClaimJustId', async client => { + testUtils.testWithClient('client.xClaimJustId', async client => { await client.xGroupCreate('key', 'group', '$', { MKSTREAM: true }); - + assert.deepEqual( await client.xClaimJustId('key', 'group', 'consumer', 1, '0-0'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XDEL.spec.ts b/lib/commands/XDEL.spec.ts index 1a3015538f4..00f9e2f9c67 100644 --- a/lib/commands/XDEL.spec.ts +++ b/lib/commands/XDEL.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './XDEL'; describe('XDEL', () => { @@ -19,10 +19,10 @@ describe('XDEL', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.xDel', async client => { + testUtils.testWithClient('client.xDel', async client => { assert.equal( await client.xDel('key', '0-0'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XGROUP_CREATE.spec.ts b/lib/commands/XGROUP_CREATE.spec.ts index fdbb796f107..57516e44cc8 100644 --- a/lib/commands/XGROUP_CREATE.spec.ts +++ b/lib/commands/XGROUP_CREATE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './XGROUP_CREATE'; describe('XGROUP CREATE', () => { @@ -21,12 +21,12 @@ describe('XGROUP CREATE', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.xGroupCreate', async client => { + testUtils.testWithClient('client.xGroupCreate', async client => { assert.equal( await client.xGroupCreate('key', 'group', '$', { MKSTREAM: true }), 'OK' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XGROUP_CREATECONSUMER.spec.ts b/lib/commands/XGROUP_CREATECONSUMER.spec.ts index 5b06188e302..62443345188 100644 --- a/lib/commands/XGROUP_CREATECONSUMER.spec.ts +++ b/lib/commands/XGROUP_CREATECONSUMER.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './XGROUP_CREATECONSUMER'; describe('XGROUP CREATECONSUMER', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); it('transformArguments', () => { assert.deepEqual( @@ -12,14 +12,14 @@ describe('XGROUP CREATECONSUMER', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.xGroupCreateConsumer', async client => { + testUtils.testWithClient('client.xGroupCreateConsumer', async client => { await client.xGroupCreate('key', 'group', '$', { MKSTREAM: true }); - + assert.equal( await client.xGroupCreateConsumer('key', 'group', 'consumer'), true ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XGROUP_DELCONSUMER.spec.ts b/lib/commands/XGROUP_DELCONSUMER.spec.ts index c3cf3c2378a..d071aedf64f 100644 --- a/lib/commands/XGROUP_DELCONSUMER.spec.ts +++ b/lib/commands/XGROUP_DELCONSUMER.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './XGROUP_DELCONSUMER'; describe('XGROUP DELCONSUMER', () => { @@ -10,14 +10,14 @@ describe('XGROUP DELCONSUMER', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.xGroupDelConsumer', async client => { + testUtils.testWithClient('client.xGroupDelConsumer', async client => { await client.xGroupCreate('key', 'group', '$', { MKSTREAM: true }); - + assert.equal( await client.xGroupDelConsumer('key', 'group', 'consumer'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XGROUP_DESTROY.spec.ts b/lib/commands/XGROUP_DESTROY.spec.ts index e991bc0d667..ea8e7b7be98 100644 --- a/lib/commands/XGROUP_DESTROY.spec.ts +++ b/lib/commands/XGROUP_DESTROY.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './XGROUP_DESTROY'; describe('XGROUP DESTROY', () => { @@ -10,14 +10,14 @@ describe('XGROUP DESTROY', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.xGroupDestroy', async client => { + testUtils.testWithClient('client.xGroupDestroy', async client => { await client.xGroupCreate('key', 'group', '$', { MKSTREAM: true }); - + assert.equal( await client.xGroupDestroy('key', 'group'), true ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XGROUP_SETID.spec.ts b/lib/commands/XGROUP_SETID.spec.ts index 0fa10cdb0b7..8df51f5401d 100644 --- a/lib/commands/XGROUP_SETID.spec.ts +++ b/lib/commands/XGROUP_SETID.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './XGROUP_SETID'; describe('XGROUP SETID', () => { @@ -10,7 +10,7 @@ describe('XGROUP SETID', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.xGroupSetId', async client => { + testUtils.testWithClient('client.xGroupSetId', async client => { await client.xGroupCreate('key', 'group', '$', { MKSTREAM: true }); @@ -19,5 +19,5 @@ describe('XGROUP SETID', () => { await client.xGroupSetId('key', 'group', '0'), 'OK' ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XINFO_CONSUMERS.spec.ts b/lib/commands/XINFO_CONSUMERS.spec.ts index 08ef17e51aa..87c82b34f29 100644 --- a/lib/commands/XINFO_CONSUMERS.spec.ts +++ b/lib/commands/XINFO_CONSUMERS.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './XINFO_CONSUMERS'; describe('XINFO CONSUMERS', () => { @@ -26,9 +26,9 @@ describe('XINFO CONSUMERS', () => { idle: 83841983 }] ); - }) + }); - itWithClient(TestRedisServers.OPEN, 'client.xInfoConsumers', async client => { + testUtils.testWithClient('client.xInfoConsumers', async client => { await client.xGroupCreate('key', 'group', '$', { MKSTREAM: true }); @@ -37,5 +37,5 @@ describe('XINFO CONSUMERS', () => { await client.xInfoConsumers('key', 'group'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XINFO_GROUPS.spec.ts b/lib/commands/XINFO_GROUPS.spec.ts index 8fbd86ee3ee..dea8ac58d9c 100644 --- a/lib/commands/XINFO_GROUPS.spec.ts +++ b/lib/commands/XINFO_GROUPS.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './XINFO_GROUPS'; describe('XINFO GROUPS', () => { @@ -28,9 +28,9 @@ describe('XINFO GROUPS', () => { lastDeliveredId: '1588152498034-0' }] ); - }) + }); - itWithClient(TestRedisServers.OPEN, 'client.xInfoGroups', async client => { + testUtils.testWithClient('client.xInfoGroups', async client => { await client.xGroupCreate('key', 'group', '$', { MKSTREAM: true }); @@ -44,5 +44,5 @@ describe('XINFO GROUPS', () => { lastDeliveredId: '0-0' }] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XINFO_STREAM.spec.ts b/lib/commands/XINFO_STREAM.spec.ts index ecab605e4e3..ca8d44f2875 100644 --- a/lib/commands/XINFO_STREAM.spec.ts +++ b/lib/commands/XINFO_STREAM.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './XINFO_STREAM'; describe('XINFO STREAM', () => { @@ -51,7 +51,7 @@ describe('XINFO STREAM', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.xInfoStream', async client => { + testUtils.testWithClient('client.xInfoStream', async client => { await client.xGroupCreate('key', 'group', '$', { MKSTREAM: true }); @@ -68,5 +68,5 @@ describe('XINFO STREAM', () => { lastEntry: null } ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XLEN.spec.ts b/lib/commands/XLEN.spec.ts index c4f62dbc4f2..178024ba89e 100644 --- a/lib/commands/XLEN.spec.ts +++ b/lib/commands/XLEN.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './XLEN'; describe('XLEN', () => { @@ -10,10 +10,10 @@ describe('XLEN', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.xLen', async client => { + testUtils.testWithClient('client.xLen', async client => { assert.equal( await client.xLen('key'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XPENDING.spec.ts b/lib/commands/XPENDING.spec.ts index 31ffeeb4230..7eb12b40efe 100644 --- a/lib/commands/XPENDING.spec.ts +++ b/lib/commands/XPENDING.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './XPENDING'; describe('XPENDING', () => { @@ -12,7 +12,7 @@ describe('XPENDING', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.xPending', async client => { + testUtils.testWithClient('client.xPending', async client => { await client.xGroupCreate('key', 'group', '$', { MKSTREAM: true }); @@ -26,5 +26,5 @@ describe('XPENDING', () => { consumers: null } ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XPENDING_RANGE.spec.ts b/lib/commands/XPENDING_RANGE.spec.ts index 76a582d3db5..0b57c704bb0 100644 --- a/lib/commands/XPENDING_RANGE.spec.ts +++ b/lib/commands/XPENDING_RANGE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './XPENDING_RANGE'; describe('XPENDING RANGE', () => { @@ -10,7 +10,7 @@ describe('XPENDING RANGE', () => { ['XPENDING', 'key', 'group', '-', '+', '1'] ); }); - + it('with IDLE', () => { assert.deepEqual( transformArguments('key', 'group', '-', '+', 1, { @@ -40,14 +40,14 @@ describe('XPENDING RANGE', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.xPendingRange', async client => { + testUtils.testWithClient('client.xPendingRange', async client => { await client.xGroupCreate('key', 'group', '$', { MKSTREAM: true }); - + assert.deepEqual( await client.xPendingRange('key', 'group', '-', '+', 1), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XRANGE.spec.ts b/lib/commands/XRANGE.spec.ts index 55efa9d7729..01c713e9595 100644 --- a/lib/commands/XRANGE.spec.ts +++ b/lib/commands/XRANGE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './XRANGE'; describe('XRANGE', () => { @@ -10,7 +10,7 @@ describe('XRANGE', () => { ['XRANGE', 'key', '-', '+'] ); }); - + it('with COUNT', () => { assert.deepEqual( transformArguments('key', '-', '+', { @@ -21,10 +21,10 @@ describe('XRANGE', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.xRange', async client => { + testUtils.testWithClient('client.xRange', async client => { assert.deepEqual( await client.xRange('key', '+', '-'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XREAD.spec.ts b/lib/commands/XREAD.spec.ts index 501571bfbeb..b607f53532e 100644 --- a/lib/commands/XREAD.spec.ts +++ b/lib/commands/XREAD.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { FIRST_KEY_INDEX, transformArguments } from './XREAD'; describe('XREAD', () => { @@ -81,7 +81,7 @@ describe('XREAD', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.xRead', async client => { + testUtils.testWithClient('client.xRead', async client => { assert.equal( await client.xRead({ key: 'key', @@ -89,9 +89,9 @@ describe('XREAD', () => { }), null ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'cluster.xRead', async cluster => { + testUtils.testWithCluster('cluster.xRead', async cluster => { assert.equal( await cluster.xRead({ key: 'key', @@ -99,5 +99,5 @@ describe('XREAD', () => { }), null ); - }); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/XREADGROUP.spec.ts b/lib/commands/XREADGROUP.spec.ts index 8cb3147bfe7..fa196d504ad 100644 --- a/lib/commands/XREADGROUP.spec.ts +++ b/lib/commands/XREADGROUP.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, itWithCluster, TestRedisClusters } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { FIRST_KEY_INDEX, transformArguments } from './XREADGROUP'; describe('XREADGROUP', () => { @@ -94,36 +94,22 @@ describe('XREADGROUP', () => { }); }); - 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 => { + describe('client.xReadGroup', () => { + testUtils.testWithClient('null', async client => { const [, readGroupReply] = await Promise.all([ - cluster.xGroupCreate('key', 'group', '$', { + client.xGroupCreate('key', 'group', '$', { MKSTREAM: true }), - cluster.xReadGroup('group', 'consumer', { + client.xReadGroup('group', 'consumer', { key: 'key', id: '>' }) ]); assert.equal(readGroupReply, null); - }); + }, GLOBAL.SERVERS.OPEN); - itWithCluster(TestRedisClusters.OPEN, 'with a message', async client => { + testUtils.testWithClient('with a message', async client => { const [, id, readGroupReply] = await Promise.all([ client.xGroupCreate('key', 'group', '$', { MKSTREAM: true @@ -148,6 +134,20 @@ describe('XREADGROUP', () => { }) }] }]); - }); + }, GLOBAL.SERVERS.OPEN); }); + + testUtils.testWithCluster('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); + }, GLOBAL.CLUSTERS.OPEN); }); diff --git a/lib/commands/XREVRANGE.spec.ts b/lib/commands/XREVRANGE.spec.ts index ba009cc2bbe..fd6e1a3adfe 100644 --- a/lib/commands/XREVRANGE.spec.ts +++ b/lib/commands/XREVRANGE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './XREVRANGE'; describe('XREVRANGE', () => { @@ -10,7 +10,7 @@ describe('XREVRANGE', () => { ['XREVRANGE', 'key', '-', '+'] ); }); - + it('with COUNT', () => { assert.deepEqual( transformArguments('key', '-', '+', { @@ -21,10 +21,10 @@ describe('XREVRANGE', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.xRevRange', async client => { + testUtils.testWithClient('client.xRevRange', async client => { assert.deepEqual( await client.xRevRange('key', '+', '-'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/XTRIM.spec.ts b/lib/commands/XTRIM.spec.ts index 0b48fd6a2d6..a8f8078eb28 100644 --- a/lib/commands/XTRIM.spec.ts +++ b/lib/commands/XTRIM.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './XTRIM'; describe('XTRIM', () => { @@ -40,10 +40,10 @@ describe('XTRIM', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.xTrim', async client => { + testUtils.testWithClient('client.xTrim', async client => { assert.equal( await client.xTrim('key', 'MAXLEN', 1), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZADD.spec.ts b/lib/commands/ZADD.spec.ts index 7c017e45410..4f497bdca90 100644 --- a/lib/commands/ZADD.spec.ts +++ b/lib/commands/ZADD.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZADD'; describe('ZADD', () => { @@ -115,7 +115,7 @@ describe('ZADD', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.zAdd', async client => { + testUtils.testWithClient('client.zAdd', async client => { assert.equal( await client.zAdd('key', { value: '1', @@ -123,5 +123,5 @@ describe('ZADD', () => { }), 1 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZCARD.spec.ts b/lib/commands/ZCARD.spec.ts index 03bfe59cfc3..2e90da772b6 100644 --- a/lib/commands/ZCARD.spec.ts +++ b/lib/commands/ZCARD.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZCARD'; describe('ZCARD', () => { @@ -10,10 +10,10 @@ describe('ZCARD', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.zCard', async client => { + testUtils.testWithClient('client.zCard', async client => { assert.equal( await client.zCard('key'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZCOUNT.spec.ts b/lib/commands/ZCOUNT.spec.ts index e461241ce1c..e185ed3cd45 100644 --- a/lib/commands/ZCOUNT.spec.ts +++ b/lib/commands/ZCOUNT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZCOUNT'; describe('ZCOUNT', () => { @@ -10,10 +10,10 @@ describe('ZCOUNT', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.zCount', async client => { + testUtils.testWithClient('client.zCount', async client => { assert.equal( await client.zCount('key', 0, 1), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZDIFF.spec.ts b/lib/commands/ZDIFF.spec.ts index f45b2af7edc..8bb1a101f53 100644 --- a/lib/commands/ZDIFF.spec.ts +++ b/lib/commands/ZDIFF.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZDIFF'; describe('ZDIFF', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); describe('transformArguments', () => { it('string', () => { @@ -21,10 +21,10 @@ describe('ZDIFF', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.zDiff', async client => { + testUtils.testWithClient('client.zDiff', async client => { assert.deepEqual( await client.zDiff('key'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZDIFFSTORE.spec.ts b/lib/commands/ZDIFFSTORE.spec.ts index 5fbeebaf502..c63902b2666 100644 --- a/lib/commands/ZDIFFSTORE.spec.ts +++ b/lib/commands/ZDIFFSTORE.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZDIFFSTORE'; describe('ZDIFFSTORE', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); describe('transformArguments', () => { it('string', () => { @@ -21,10 +21,10 @@ describe('ZDIFFSTORE', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.zDiffStore', async client => { + testUtils.testWithClient('client.zDiffStore', async client => { assert.equal( await client.zDiffStore('destination', 'key'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZDIFF_WITHSCORES.spec.ts b/lib/commands/ZDIFF_WITHSCORES.spec.ts index 99c23108292..3b9cb725aaa 100644 --- a/lib/commands/ZDIFF_WITHSCORES.spec.ts +++ b/lib/commands/ZDIFF_WITHSCORES.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZDIFF_WITHSCORES'; describe('ZDIFF WITHSCORES', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); describe('transformArguments', () => { it('string', () => { @@ -21,10 +21,10 @@ describe('ZDIFF WITHSCORES', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.zDiffWithScores', async client => { + testUtils.testWithClient('client.zDiffWithScores', async client => { assert.deepEqual( await client.zDiffWithScores('key'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZINCRBY.spec.ts b/lib/commands/ZINCRBY.spec.ts index 2196c63ec06..bf2a34b0965 100644 --- a/lib/commands/ZINCRBY.spec.ts +++ b/lib/commands/ZINCRBY.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZINCRBY'; describe('ZINCRBY', () => { @@ -10,10 +10,10 @@ describe('ZINCRBY', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.zIncrBy', async client => { + testUtils.testWithClient('client.zIncrBy', async client => { assert.equal( await client.zIncrBy('destination', 1, 'member'), 1 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZINTER.spec.ts b/lib/commands/ZINTER.spec.ts index 998c46fd3e0..4d2d86c8869 100644 --- a/lib/commands/ZINTER.spec.ts +++ b/lib/commands/ZINTER.spec.ts @@ -1,10 +1,10 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZINTER'; describe('ZINTER', () => { - describeHandleMinimumRedisVersion([6, 2]); - + testUtils.isVersionGreaterThanHook([6, 2]); + describe('transformArguments', () => { it('key (string)', () => { assert.deepEqual( @@ -49,10 +49,10 @@ describe('ZINTER', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.zInter', async client => { + testUtils.testWithClient('client.zInter', async client => { assert.deepEqual( await client.zInter('key'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZINTERSTORE.spec.ts b/lib/commands/ZINTERSTORE.spec.ts index fca03157cb2..224961f0786 100644 --- a/lib/commands/ZINTERSTORE.spec.ts +++ b/lib/commands/ZINTERSTORE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZINTERSTORE'; describe('ZINTERSTORE', () => { @@ -47,10 +47,10 @@ describe('ZINTERSTORE', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.zInterStore', async client => { + testUtils.testWithClient('client.zInterStore', async client => { assert.equal( await client.zInterStore('destination', 'key'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZINTER_WITHSCORES.spec.ts b/lib/commands/ZINTER_WITHSCORES.spec.ts index f66787e3def..0eaeb26a244 100644 --- a/lib/commands/ZINTER_WITHSCORES.spec.ts +++ b/lib/commands/ZINTER_WITHSCORES.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZINTER_WITHSCORES'; describe('ZINTER WITHSCORES', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); describe('transformArguments', () => { it('key (string)', () => { @@ -49,10 +49,10 @@ describe('ZINTER WITHSCORES', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.zInterWithScores', async client => { + testUtils.testWithClient('client.zInterWithScores', async client => { assert.deepEqual( await client.zInterWithScores('key'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZLEXCOUNT.spec.ts b/lib/commands/ZLEXCOUNT.spec.ts index b106ba0cdc5..85809f1a9a9 100644 --- a/lib/commands/ZLEXCOUNT.spec.ts +++ b/lib/commands/ZLEXCOUNT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZLEXCOUNT'; describe('ZLEXCOUNT', () => { @@ -10,10 +10,10 @@ describe('ZLEXCOUNT', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.zLexCount', async client => { + testUtils.testWithClient('client.zLexCount', async client => { assert.equal( await client.zLexCount('key', '[a', '[b'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZMSCORE.spec.ts b/lib/commands/ZMSCORE.spec.ts index 3cf3845392d..228c8e9d6f6 100644 --- a/lib/commands/ZMSCORE.spec.ts +++ b/lib/commands/ZMSCORE.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZMSCORE'; describe('ZMSCORE', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); describe('transformArguments', () => { it('string', () => { @@ -21,10 +21,10 @@ describe('ZMSCORE', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.zmScore', async client => { + testUtils.testWithClient('client.zmScore', async client => { assert.deepEqual( await client.zmScore('key', 'member'), [null] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZPOPMAX.spec.ts b/lib/commands/ZPOPMAX.spec.ts index ceab3cad1d0..18fba23a3e9 100644 --- a/lib/commands/ZPOPMAX.spec.ts +++ b/lib/commands/ZPOPMAX.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './ZPOPMAX'; describe('ZPOPMAX', () => { @@ -21,14 +21,14 @@ describe('ZPOPMAX', () => { }); describe('client.zPopMax', () => { - itWithClient(TestRedisServers.OPEN, 'null', async client => { + testUtils.testWithClient('null', async client => { assert.equal( await client.zPopMax('key'), null ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithClient(TestRedisServers.OPEN, 'member', async client => { + testUtils.testWithClient('member', async client => { const member = { score: 1, value: 'value' }, [, zPopMaxReply] = await Promise.all([ client.zAdd('key', member), @@ -36,6 +36,6 @@ describe('ZPOPMAX', () => { ]); assert.deepEqual(zPopMaxReply, member); - }); + }, GLOBAL.SERVERS.OPEN); }); }); diff --git a/lib/commands/ZPOPMAX_COUNT.spec.ts b/lib/commands/ZPOPMAX_COUNT.spec.ts index c0e71977ee8..b282d0d3199 100644 --- a/lib/commands/ZPOPMAX_COUNT.spec.ts +++ b/lib/commands/ZPOPMAX_COUNT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZPOPMAX_COUNT'; describe('ZPOPMAX COUNT', () => { @@ -10,10 +10,10 @@ describe('ZPOPMAX COUNT', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.zPopMaxCount', async client => { + testUtils.testWithClient('client.zPopMaxCount', async client => { assert.deepEqual( await client.zPopMaxCount('key', 1), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZPOPMIN.spec.ts b/lib/commands/ZPOPMIN.spec.ts index c69ca7c27f7..624b7054404 100644 --- a/lib/commands/ZPOPMIN.spec.ts +++ b/lib/commands/ZPOPMIN.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './ZPOPMIN'; describe('ZPOPMIN', () => { @@ -21,14 +21,14 @@ describe('ZPOPMIN', () => { }); describe('client.zPopMin', () => { - itWithClient(TestRedisServers.OPEN, 'null', async client => { + testUtils.testWithClient('null', async client => { assert.equal( await client.zPopMin('key'), null ); - }); + }, GLOBAL.SERVERS.OPEN); - itWithClient(TestRedisServers.OPEN, 'member', async client => { + testUtils.testWithClient('member', async client => { const member = { score: 1, value: 'value' }, [, zPopMinReply] = await Promise.all([ client.zAdd('key', member), @@ -36,6 +36,6 @@ describe('ZPOPMIN', () => { ]); assert.deepEqual(zPopMinReply, member); - }); + }, GLOBAL.SERVERS.OPEN); }); }); diff --git a/lib/commands/ZPOPMIN_COUNT.spec.ts b/lib/commands/ZPOPMIN_COUNT.spec.ts index 1c2745a0fdf..6d40002ab72 100644 --- a/lib/commands/ZPOPMIN_COUNT.spec.ts +++ b/lib/commands/ZPOPMIN_COUNT.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZPOPMIN_COUNT'; describe('ZPOPMIN COUNT', () => { @@ -10,10 +10,10 @@ describe('ZPOPMIN COUNT', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.zPopMinCount', async client => { + testUtils.testWithClient('client.zPopMinCount', async client => { assert.deepEqual( await client.zPopMinCount('key', 1), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZRANDMEMBER.spec.ts b/lib/commands/ZRANDMEMBER.spec.ts index da31641a18c..c57d26f830e 100644 --- a/lib/commands/ZRANDMEMBER.spec.ts +++ b/lib/commands/ZRANDMEMBER.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZRANDMEMBER'; describe('ZRANDMEMBER', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); it('transformArguments', () => { assert.deepEqual( @@ -12,10 +12,10 @@ describe('ZRANDMEMBER', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.zRandMember', async client => { + testUtils.testWithClient('client.zRandMember', async client => { assert.equal( await client.zRandMember('key'), null ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZRANDMEMBER_COUNT.spec.ts b/lib/commands/ZRANDMEMBER_COUNT.spec.ts index 4c873c82d90..10db0727b23 100644 --- a/lib/commands/ZRANDMEMBER_COUNT.spec.ts +++ b/lib/commands/ZRANDMEMBER_COUNT.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZRANDMEMBER_COUNT'; describe('ZRANDMEMBER COUNT', () => { - describeHandleMinimumRedisVersion([6, 2, 5]); + testUtils.isVersionGreaterThanHook([6, 2, 5]); it('transformArguments', () => { assert.deepEqual( @@ -12,10 +12,10 @@ describe('ZRANDMEMBER COUNT', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.zRandMemberCount', async client => { + testUtils.testWithClient('client.zRandMemberCount', async client => { assert.deepEqual( await client.zRandMemberCount('key', 1), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.spec.ts b/lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.spec.ts index 55624361fb6..5b5ec1f500f 100644 --- a/lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.spec.ts +++ b/lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZRANDMEMBER_COUNT_WITHSCORES'; describe('ZRANDMEMBER COUNT WITHSCORES', () => { - describeHandleMinimumRedisVersion([6, 2, 5]); + testUtils.isVersionGreaterThanHook([6, 2, 5]); it('transformArguments', () => { assert.deepEqual( @@ -12,10 +12,10 @@ describe('ZRANDMEMBER COUNT WITHSCORES', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.zRandMemberCountWithScores', async client => { + testUtils.testWithClient('client.zRandMemberCountWithScores', async client => { assert.deepEqual( await client.zRandMemberCountWithScores('key', 1), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZRANGE.spec.ts b/lib/commands/ZRANGE.spec.ts index 7347ed0ad09..03687c2ba9d 100644 --- a/lib/commands/ZRANGE.spec.ts +++ b/lib/commands/ZRANGE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZRANGE'; describe('ZRANGE', () => { @@ -72,10 +72,10 @@ describe('ZRANGE', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.zRange', async client => { + testUtils.testWithClient('client.zRange', async client => { assert.deepEqual( await client.zRange('src', 0, 1), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZRANGEBYLEX.spec.ts b/lib/commands/ZRANGEBYLEX.spec.ts index 7f687509548..fe7b7d5a16e 100644 --- a/lib/commands/ZRANGEBYLEX.spec.ts +++ b/lib/commands/ZRANGEBYLEX.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZRANGEBYLEX'; describe('ZRANGEBYLEX', () => { @@ -24,10 +24,10 @@ describe('ZRANGEBYLEX', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.zRangeByLex', async client => { + testUtils.testWithClient('client.zRangeByLex', async client => { assert.deepEqual( await client.zRangeByLex('src', '-', '+'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZRANGEBYSCORE.spec.ts b/lib/commands/ZRANGEBYSCORE.spec.ts index 0419b232563..a3484326306 100644 --- a/lib/commands/ZRANGEBYSCORE.spec.ts +++ b/lib/commands/ZRANGEBYSCORE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZRANGEBYSCORE'; describe('ZRANGEBYSCORE', () => { @@ -24,10 +24,10 @@ describe('ZRANGEBYSCORE', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.zRangeByScore', async client => { + testUtils.testWithClient('client.zRangeByScore', async client => { assert.deepEqual( await client.zRangeByScore('src', 0, 1), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZRANGEBYSCORE_WITHSCORES.spec.ts b/lib/commands/ZRANGEBYSCORE_WITHSCORES.spec.ts index 84d1aeb0aad..3552d3e2535 100644 --- a/lib/commands/ZRANGEBYSCORE_WITHSCORES.spec.ts +++ b/lib/commands/ZRANGEBYSCORE_WITHSCORES.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZRANGEBYSCORE_WITHSCORES'; describe('ZRANGEBYSCORE WITHSCORES', () => { @@ -24,10 +24,10 @@ describe('ZRANGEBYSCORE WITHSCORES', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.zRangeByScoreWithScores', async client => { + testUtils.testWithClient('client.zRangeByScoreWithScores', async client => { assert.deepEqual( await client.zRangeByScoreWithScores('src', 0, 1), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZRANGESTORE.spec.ts b/lib/commands/ZRANGESTORE.spec.ts index 54055656409..7af253e539f 100644 --- a/lib/commands/ZRANGESTORE.spec.ts +++ b/lib/commands/ZRANGESTORE.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './ZRANGESTORE'; describe('ZRANGESTORE', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); describe('transformArguments', () => { it('simple', () => { @@ -71,13 +71,14 @@ describe('ZRANGESTORE', () => { describe('transformReply', () => { it('should throw TypeError when reply is not a number', () => { assert.throws( + // eslint-disable-next-line @typescript-eslint/no-explicit-any () => (transformReply as any)([]), TypeError ); }); }); - itWithClient(TestRedisServers.OPEN, 'client.zRangeStore', async client => { + testUtils.testWithClient('client.zRangeStore', async client => { await client.zAdd('src', { score: 0.5, value: 'value' @@ -87,5 +88,5 @@ describe('ZRANGESTORE', () => { await client.zRangeStore('dst', 'src', 0, 1), 1 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZRANGE_WITHSCORES.spec.ts b/lib/commands/ZRANGE_WITHSCORES.spec.ts index 4c739b3d3b3..d9b07e19dda 100644 --- a/lib/commands/ZRANGE_WITHSCORES.spec.ts +++ b/lib/commands/ZRANGE_WITHSCORES.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZRANGE_WITHSCORES'; describe('ZRANGE WITHSCORES', () => { @@ -56,10 +56,10 @@ describe('ZRANGE WITHSCORES', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.zRangeWithScores', async client => { + testUtils.testWithClient('client.zRangeWithScores', async client => { assert.deepEqual( await client.zRangeWithScores('src', 0, 1), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZRANK.spec.ts b/lib/commands/ZRANK.spec.ts index 8dd9c924ccc..0c81517a7d6 100644 --- a/lib/commands/ZRANK.spec.ts +++ b/lib/commands/ZRANK.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZRANK'; describe('ZRANK', () => { @@ -10,10 +10,10 @@ describe('ZRANK', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.zRank', async client => { + testUtils.testWithClient('client.zRank', async client => { assert.equal( await client.zRank('key', 'member'), null ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZREM.spec.ts b/lib/commands/ZREM.spec.ts index d613832035d..3ac001708a0 100644 --- a/lib/commands/ZREM.spec.ts +++ b/lib/commands/ZREM.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZREM'; describe('ZREM', () => { @@ -19,10 +19,10 @@ describe('ZREM', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.zRem', async client => { + testUtils.testWithClient('client.zRem', async client => { assert.equal( await client.zRem('key', 'member'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZREMRANGEBYLEX.spec.ts b/lib/commands/ZREMRANGEBYLEX.spec.ts index 7aae059480c..b59c9e9f3b0 100644 --- a/lib/commands/ZREMRANGEBYLEX.spec.ts +++ b/lib/commands/ZREMRANGEBYLEX.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZREMRANGEBYLEX'; describe('ZREMRANGEBYLEX', () => { @@ -10,10 +10,10 @@ describe('ZREMRANGEBYLEX', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.zRemRangeByLex', async client => { + testUtils.testWithClient('client.zRemRangeByLex', async client => { assert.equal( await client.zRemRangeByLex('key', '[a', '[b'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZREMRANGEBYRANK.spec.ts b/lib/commands/ZREMRANGEBYRANK.spec.ts index 401b57c8e2a..c659dadb790 100644 --- a/lib/commands/ZREMRANGEBYRANK.spec.ts +++ b/lib/commands/ZREMRANGEBYRANK.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZREMRANGEBYRANK'; describe('ZREMRANGEBYRANK', () => { @@ -10,10 +10,10 @@ describe('ZREMRANGEBYRANK', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.zRemRangeByRank', async client => { + testUtils.testWithClient('client.zRemRangeByRank', async client => { assert.equal( await client.zRemRangeByRank('key', 0, 1), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZREMRANGEBYSCORE.spec.ts b/lib/commands/ZREMRANGEBYSCORE.spec.ts index 141392e772b..988fd7690c9 100644 --- a/lib/commands/ZREMRANGEBYSCORE.spec.ts +++ b/lib/commands/ZREMRANGEBYSCORE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZREMRANGEBYSCORE'; describe('ZREMRANGEBYSCORE', () => { @@ -10,10 +10,10 @@ describe('ZREMRANGEBYSCORE', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.zRemRangeByScore', async client => { + testUtils.testWithClient('client.zRemRangeByScore', async client => { assert.equal( await client.zRemRangeByScore('key', 0, 1), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZREVRANK.spec.ts b/lib/commands/ZREVRANK.spec.ts index 727a61a35a6..d9fef0d70a4 100644 --- a/lib/commands/ZREVRANK.spec.ts +++ b/lib/commands/ZREVRANK.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZREVRANK'; describe('ZREVRANK', () => { @@ -10,10 +10,10 @@ describe('ZREVRANK', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.zRevRank', async client => { + testUtils.testWithClient('client.zRevRank', async client => { assert.equal( await client.zRevRank('key', 'member'), null ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZSCAN.spec.ts b/lib/commands/ZSCAN.spec.ts index 3ff0c0a52b2..afa221a1ef3 100644 --- a/lib/commands/ZSCAN.spec.ts +++ b/lib/commands/ZSCAN.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments, transformReply } from './ZSCAN'; describe('ZSCAN', () => { @@ -65,7 +65,7 @@ describe('ZSCAN', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.zScan', async client => { + testUtils.testWithClient('client.zScan', async client => { assert.deepEqual( await client.zScan('key', 0), { @@ -73,5 +73,5 @@ describe('ZSCAN', () => { members: [] } ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZSCORE.spec.ts b/lib/commands/ZSCORE.spec.ts index d346a2e2c81..fe2a1c6a7c5 100644 --- a/lib/commands/ZSCORE.spec.ts +++ b/lib/commands/ZSCORE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZSCORE'; describe('ZSCORE', () => { @@ -10,10 +10,10 @@ describe('ZSCORE', () => { ); }); - itWithClient(TestRedisServers.OPEN, 'client.zScore', async client => { + testUtils.testWithClient('client.zScore', async client => { assert.equal( await client.zScore('key', 'member'), null ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZUNION.spec.ts b/lib/commands/ZUNION.spec.ts index 12e92833931..c53498cbf65 100644 --- a/lib/commands/ZUNION.spec.ts +++ b/lib/commands/ZUNION.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZUNION'; describe('ZUNION', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); describe('transformArguments', () => { it('key (string)', () => { @@ -39,10 +39,10 @@ describe('ZUNION', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.zUnion', async client => { + testUtils.testWithClient('client.zUnion', async client => { assert.deepEqual( await client.zUnion('key'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZUNIONSTORE.spec.ts b/lib/commands/ZUNIONSTORE.spec.ts index 0c4d7a3006b..8f11828b221 100644 --- a/lib/commands/ZUNIONSTORE.spec.ts +++ b/lib/commands/ZUNIONSTORE.spec.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZUNIONSTORE'; describe('ZUNIONSTORE', () => { @@ -47,10 +47,10 @@ describe('ZUNIONSTORE', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.zUnionStore', async client => { + testUtils.testWithClient('client.zUnionStore', async client => { assert.equal( await client.zUnionStore('destination', 'key'), 0 ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/ZUNION_WITHSCORES.spec.ts b/lib/commands/ZUNION_WITHSCORES.spec.ts index d9c65ba5e4b..3786a97963d 100644 --- a/lib/commands/ZUNION_WITHSCORES.spec.ts +++ b/lib/commands/ZUNION_WITHSCORES.spec.ts @@ -1,9 +1,9 @@ import { strict as assert } from 'assert'; -import { TestRedisServers, itWithClient, describeHandleMinimumRedisVersion } from '../test-utils'; +import testUtils, { GLOBAL } from '../test-utils'; import { transformArguments } from './ZUNION_WITHSCORES'; describe('ZUNION WITHSCORES', () => { - describeHandleMinimumRedisVersion([6, 2]); + testUtils.isVersionGreaterThanHook([6, 2]); describe('transformArguments', () => { it('key (string)', () => { @@ -39,10 +39,10 @@ describe('ZUNION WITHSCORES', () => { }); }); - itWithClient(TestRedisServers.OPEN, 'client.zUnionWithScores', async client => { + testUtils.testWithClient('client.zUnionWithScores', async client => { assert.deepEqual( await client.zUnionWithScores('key'), [] ); - }); + }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/generic-transformers.spec.ts b/lib/commands/generic-transformers.spec.ts index bdc3ee938cd..887d8720def 100644 --- a/lib/commands/generic-transformers.spec.ts +++ b/lib/commands/generic-transformers.spec.ts @@ -268,7 +268,7 @@ describe('Generic Transformers', () => { }) }] }] - ) + ); }); }); diff --git a/lib/errors.ts b/lib/errors.ts index 3f5fe40c201..79a438aa1d8 100644 --- a/lib/errors.ts +++ b/lib/errors.ts @@ -27,3 +27,9 @@ export class DisconnectsClientError extends Error { super('Disconnects client'); } } + +export class SocketClosedUnexpectedlyError extends Error { + constructor() { + super('Socket closed unexpectedly'); + } +} diff --git a/lib/test-utils.ts b/lib/test-utils.ts deleted file mode 100644 index 42eb9df500b..00000000000 --- a/lib/test-utils.ts +++ /dev/null @@ -1,384 +0,0 @@ -import { strict as assert } from 'assert'; -import RedisClient, { RedisClientOptions, RedisClientType } from './client'; -import { execSync, spawn } from 'child_process'; -import { once } from 'events'; -import which from 'which'; -import { SinonSpy } from 'sinon'; -import RedisCluster, { RedisClusterOptions, RedisClusterType } from './cluster'; -import { promises as fs } from 'fs'; -import { Context as MochaContext } from 'mocha'; -import { promiseTimeout } from './utils'; -import { RedisModules, RedisScripts } from './commands'; - -type RedisVersion = [major: number, minor: number, patch: number]; - -type PartialRedisVersion = RedisVersion | [major: number, minor: number] | [major: number]; - -const REDIS_PATH = which.sync('redis-server'); -export const REDIS_VERSION = getRedisVersion(); - -function getRedisVersion(): RedisVersion { - const raw = execSync(`${REDIS_PATH} -v`).toString(), - indexOfVersion = raw.indexOf('v='); - - if (indexOfVersion === -1) { - throw new Error('Unknown redis version'); - } - - const start = indexOfVersion + 2; - return raw.substring( - start, - raw.indexOf(' ', start) - ).split('.', 3).map(Number) as RedisVersion; -} - -export function isRedisVersionGreaterThan(minimumVersion: PartialRedisVersion | undefined): boolean { - if (minimumVersion === undefined) return true; - - const lastIndex = minimumVersion.length - 1; - for (let i = 0; i < lastIndex; i++) { - if (REDIS_VERSION[i] > minimumVersion[i]) { - return true; - } else if (minimumVersion[i] > REDIS_VERSION[i]) { - return false; - } - } - - return REDIS_VERSION[lastIndex] >= minimumVersion[lastIndex]; -} - -export enum TestRedisServers { - OPEN, - PASSWORD -} - -export const TEST_REDIS_SERVERS: Record, 'modules' | 'scripts'>> = {}; - -export enum TestRedisClusters { - OPEN -} - -export const TEST_REDIS_CLUSTERES: Record, 'modules' | 'scripts'>> = {}; - -let port = 6379; - -interface SpawnRedisServerResult { - port: number; - cleanup: () => Promise; -} - -async function spawnRedisServer(args?: Array): Promise { - const currentPort = port++, - process = spawn(REDIS_PATH, [ - '--save', - '', - '--port', - currentPort.toString(), - ...(args ?? []) - ]); - - process - .once('error', err => console.error('Redis process error', err)) - .once('close', code => console.error(`Redis process closed unexpectedly with code ${code}`)); - - for await (const chunk of process.stdout) { - if (chunk.toString().includes('Ready to accept connections')) { - break; - } - } - - if (process.exitCode !== null) { - throw new Error('Error while spawning redis server'); - } - - return { - port: currentPort, - async cleanup(): Promise { - process.removeAllListeners('close'); - assert.ok(process.kill()); - await once(process, 'close'); - } - }; -} - -async function spawnGlobalRedisServer(args?: Array): Promise { - const { port, cleanup } = await spawnRedisServer(args); - after(cleanup); - return port; -} - -const SLOTS = 16384; - -interface SpawnRedisClusterNodeResult extends SpawnRedisServerResult { - client: RedisClientType -} - -async function spawnRedisClusterNode( - type: TestRedisClusters | null, - nodeIndex: number, - fromSlot: number, - toSlot: number, - args?: Array -): Promise { - const clusterConfigFile = `/tmp/${type}-${nodeIndex}.conf`, - { port, cleanup: originalCleanup } = await spawnRedisServer([ - '--cluster-enabled', - 'yes', - '--cluster-node-timeout', - '5000', - '--cluster-config-file', - clusterConfigFile, - ...(args ?? []) - ]); - - const client = RedisClient.create({ - socket: { - port - } - }); - - await client.connect(); - - const range = []; - for (let i = fromSlot; i < toSlot; i++) { - range.push(i); - } - - await Promise.all([ - client.clusterFlushSlots(), - client.clusterAddSlots(range) - ]); - - return { - port, - async cleanup(): Promise { - await originalCleanup(); - - try { - await fs.unlink(clusterConfigFile); - } catch (err: any) { - if (err.code === 'ENOENT') return; - - throw err; - } - }, - client - }; -} - -export async function spawnRedisCluster(type: TestRedisClusters | null, numberOfNodes: number, args?: Array): Promise> { - const spawnPromises = [], - slotsPerNode = Math.floor(SLOTS / numberOfNodes); - for (let i = 0; i < numberOfNodes; i++) { - const fromSlot = i * slotsPerNode; - spawnPromises.push( - spawnRedisClusterNode( - type, - i, - fromSlot, - i === numberOfNodes - 1 ? SLOTS : fromSlot + slotsPerNode, - args - ) - ); - } - - const spawnResults = await Promise.all(spawnPromises), - meetPromises = []; - for (let i = 1; i < spawnResults.length; i++) { - meetPromises.push( - spawnResults[i].client.clusterMeet( - '127.0.0.1', - spawnResults[i - 1].port - ) - ); - } - - await Promise.all(meetPromises); - - while (!(await clusterIsReady(spawnResults))) { - await promiseTimeout(100); - } - - await Promise.all( - spawnResults.map(result => result.client.disconnect()) - ); - - return spawnResults; -} - -async function clusterIsReady(spawnResults: Array): Promise { - const nodesClusetrInfo = await Promise.all( - spawnResults.map(result => result.client.clusterInfo()) - ); - - return nodesClusetrInfo.every(({ state }) => state === 'ok'); -} - -export async function spawnGlobalRedisCluster(type: TestRedisClusters | null, numberOfNodes: number, args?: Array): Promise> { - const results = await spawnRedisCluster(type, numberOfNodes, args); - - after(() => Promise.all( - results.map(({ cleanup }) => cleanup()) - )); - - return results.map(({ port }) => port); -} - -async function spawnOpenServer(): Promise { - TEST_REDIS_SERVERS[TestRedisServers.OPEN] = { - socket: { - port: await spawnGlobalRedisServer() - } - }; -} - -async function spawnPasswordServer(): Promise { - TEST_REDIS_SERVERS[TestRedisServers.PASSWORD] = { - socket: { - port: await spawnGlobalRedisServer(['--requirepass', 'password']), - }, - password: 'password' - }; - - if (isRedisVersionGreaterThan([6])) { - TEST_REDIS_SERVERS[TestRedisServers.PASSWORD].username = 'default'; - } -} - -async function spawnOpenCluster(): Promise { - TEST_REDIS_CLUSTERES[TestRedisClusters.OPEN] = { - rootNodes: (await spawnGlobalRedisCluster(TestRedisClusters.OPEN, 3)).map(port => ({ - socket: { - port - } - })) - }; -} - -before(function () { - this.timeout(10000); - - return Promise.all([ - spawnOpenServer(), - spawnPasswordServer(), - spawnOpenCluster() - ]); -}); - -interface RedisTestOptions { - minimumRedisVersion?: PartialRedisVersion; -} - -export function handleMinimumRedisVersion(mochaContext: MochaContext, minimumVersion: PartialRedisVersion | undefined): boolean { - if (isRedisVersionGreaterThan(minimumVersion)) { - return false; - } - - mochaContext.skip(); - return true; -} - -export function describeHandleMinimumRedisVersion(minimumVersion: PartialRedisVersion): void { - before(function () { - handleMinimumRedisVersion(this, minimumVersion); - }); -} - -interface RedisClientTestOptions extends RedisTestOptions { - clientOptions?: RedisClientOptions; -} - -export function itWithClient( - type: TestRedisServers, - title: string, - fn: (client: RedisClientType) => Promise, - options?: RedisClientTestOptions -): void { - it(title, async function () { - if (handleMinimumRedisVersion(this, options?.minimumRedisVersion)) return; - - const client = RedisClient.create({ - ...TEST_REDIS_SERVERS[type], - ...options?.clientOptions - }); - - await client.connect(); - - try { - await client.flushAll(); - await fn(client); - } finally { - await client.flushAll(); - await client.disconnect(); - } - }); -} - -export function itWithCluster( - type: TestRedisClusters, - title: string, - fn: (cluster: RedisClusterType) => Promise, - options?: RedisTestOptions -): void { - it(title, async function () { - if (handleMinimumRedisVersion(this, options?.minimumRedisVersion)) return; - - const cluster = RedisCluster.create(TEST_REDIS_CLUSTERES[type]); - - await cluster.connect(); - - try { - await clusterFlushAll(cluster); - await fn(cluster); - } finally { - await clusterFlushAll(cluster); - await cluster.disconnect(); - } - }); -} - -export function itWithDedicatedCluster(title: string, fn: (cluster: RedisClusterType) => Promise): void { - it(title, async function () { - this.timeout(10000); - - const spawnResults = await spawnRedisCluster(null, 3), - cluster = RedisCluster.create({ - rootNodes: [{ - socket: { - port: spawnResults[0].port - } - }] - }); - - await cluster.connect(); - - try { - await fn(cluster); - } finally { - await cluster.disconnect(); - - for (const { cleanup } of spawnResults) { - await cleanup(); - } - } - }); -} - -async function clusterFlushAll(cluster: RedisCluster): Promise { - await Promise.all( - cluster.getMasters().map(({ client }) => client.flushAll()) - ); -} - -export async function waitTillBeenCalled(spy: SinonSpy): Promise { - const start = process.hrtime.bigint(), - calls = spy.callCount; - - do { - if (process.hrtime.bigint() - start > 1_000_000_000) { - throw new Error('Waiting for more than 1 second'); - } - - await promiseTimeout(1); - } while (spy.callCount === calls) -} diff --git a/lib/test-utils/dockers.ts b/lib/test-utils/dockers.ts new file mode 100644 index 00000000000..3e48618ee46 --- /dev/null +++ b/lib/test-utils/dockers.ts @@ -0,0 +1,215 @@ +import { createConnection } from 'net'; +import { once } from 'events'; +import { RedisModules, RedisScripts } from '../commands'; +import RedisClient, { RedisClientType } from '../client'; +import { promiseTimeout } from '../utils'; +import { promisify } from 'util'; +import { exec } from 'child_process'; +const execAsync = promisify(exec); + +interface ErrorWithCode extends Error { + code: string; +} + +async function isPortAvailable(port: number): Promise { + try { + const socket = createConnection({ port }); + await once(socket, 'connect'); + socket.end(); + } catch (err) { + if (err instanceof Error && (err as ErrorWithCode).code === 'ECONNREFUSED') { + return true; + } + } + + return false; +} + +const portIterator = (async function*(): AsyncIterableIterator { + for (let i = 6379; i < 65535; i++) { + if (await isPortAvailable(i)) { + yield i; + } + } + + throw new Error('All ports are in use'); +})(); + +export interface RedisServerDockerConfig { + image: string; + version: Array; +} + +export interface RedisServerDocker { + port: number; + dockerId: string; +} + +async function spawnRedisServerDocker({ image, version }: RedisServerDockerConfig, serverArguments: Array): Promise { + const port = (await portIterator.next()).value, + { stdout, stderr } = await execAsync( + `docker run -d --network host ${image}:${version.join('.')} ` + + `--save --port ${port.toString()} ${serverArguments.join(' ')}` + ); + + if (!stdout) { + throw new Error(`docker run error - ${stderr}`); + } + + while (await isPortAvailable(port)) { + await promiseTimeout(500); + } + + return { + port, + dockerId: stdout.trim() + }; +} + +const RUNNING_SERVERS = new Map, ReturnType>(); + +export function spawnRedisServer(dockerConfig: RedisServerDockerConfig, serverArguments: Array): Promise { + const runningServer = RUNNING_SERVERS.get(serverArguments); + if (runningServer) { + return runningServer; + } + + const dockerPromise = spawnRedisServerDocker(dockerConfig, serverArguments); + RUNNING_SERVERS.set(serverArguments, dockerPromise); + return dockerPromise; +} + +async function dockerRemove(dockerId: string): Promise { + const { stderr } = await execAsync(`docker rm -f ${dockerId}`); + if (stderr) { + throw new Error(`docker rm error - ${stderr}`); + } +} + +after(() => { + return Promise.all( + [...RUNNING_SERVERS.values()].map(async dockerPromise => + await dockerRemove((await dockerPromise).dockerId) + ) + ); +}); + +export interface RedisClusterDockersConfig extends RedisServerDockerConfig { + numberOfNodes?: number; +} + +async function spawnRedisClusterNodeDocker( + dockersConfig: RedisClusterDockersConfig, + serverArguments: Array, + fromSlot: number, + toSlot: number, + waitForState: boolean, + meetPort?: number +): Promise { + const docker = await spawnRedisServerDocker(dockersConfig, [ + ...serverArguments, + '--cluster-enabled', + 'yes', + '--cluster-node-timeout', + '5000' + ]), + client = RedisClient.create({ + socket: { + port: docker.port + } + }); + + await client.connect(); + + try { + const range = []; + for (let i = fromSlot; i < toSlot; i++) { + range.push(i); + } + + const promises: Array> = [client.clusterAddSlots(range)]; + + if (meetPort) { + promises.push(client.clusterMeet('127.0.0.1', meetPort)); + } + + if (waitForState) { + promises.push(waitForClusterState(client)); + } + + await Promise.all(promises); + + return docker; + } finally { + await client.disconnect(); + } +} + +async function waitForClusterState(client: RedisClientType): Promise { + while ((await client.clusterInfo()).state !== 'ok') { + await promiseTimeout(500); + } +} + +const SLOTS = 16384; + +async function spawnRedisClusterDockers(dockersConfig: RedisClusterDockersConfig, serverArguments: Array): Promise> { + const numberOfNodes = dockersConfig.numberOfNodes ?? 3, + slotsPerNode = Math.floor(SLOTS / numberOfNodes), + dockers: Array = []; + for (let i = 0; i < numberOfNodes; i++) { + const fromSlot = i * slotsPerNode, + [ toSlot, waitForState ] = i === numberOfNodes - 1 ? [SLOTS, true] : [fromSlot + slotsPerNode, false]; + dockers.push( + await spawnRedisClusterNodeDocker( + dockersConfig, + serverArguments, + fromSlot, + toSlot, + waitForState, + i === 0 ? undefined : dockers[i - 1].port + ) + ); + } + + const client = RedisClient.create({ + socket: { + port: dockers[0].port + } + }); + + await client.connect(); + + try { + while ((await client.clusterInfo()).state !== 'ok') { + await promiseTimeout(500); + } + } finally { + await client.disconnect(); + } + + return dockers; +} + +const RUNNING_CLUSTERS = new Map, ReturnType>(); + +export function spawnRedisCluster(dockersConfig: RedisClusterDockersConfig, serverArguments: Array): Promise> { + const runningCluster = RUNNING_CLUSTERS.get(serverArguments); + if (runningCluster) { + return runningCluster; + } + + const dockersPromise = spawnRedisClusterDockers(dockersConfig, serverArguments); + RUNNING_CLUSTERS.set(serverArguments, dockersPromise); + return dockersPromise; +} + +after(() => { + return Promise.all( + [...RUNNING_CLUSTERS.values()].map(async dockersPromise => { + return Promise.all( + (await dockersPromise).map(({ dockerId }) => dockerRemove(dockerId)) + ); + }) + ); +}); diff --git a/lib/test-utils/index.ts b/lib/test-utils/index.ts new file mode 100644 index 00000000000..69bfc440c91 --- /dev/null +++ b/lib/test-utils/index.ts @@ -0,0 +1,49 @@ +import TestUtils from './test-utils'; +import { SinonSpy } from 'sinon'; +import { promiseTimeout } from '../utils'; + +export default new TestUtils({ + defaultDockerVersion: '6.2', + dockerImageName: 'redis', + dockerImageVersionArgument: 'redis-version' +}); + +export const GLOBAL = { + SERVERS: { + OPEN: { + serverArguments: [] + }, + PASSWORD: { + serverArguments: ['--requirepass', 'password'], + clientOptions: { + password: 'password' + } + } + }, + CLUSTERS: { + OPEN: { + serverArguments: [] + }, + PASSWORD: { + serverArguments: ['--requirepass', 'password'], + clusterConfiguration: { + defaults: { + password: 'password' + } + } + } + } +}; + +export async function waitTillBeenCalled(spy: SinonSpy): Promise { + const start = process.hrtime.bigint(), + calls = spy.callCount; + + do { + if (process.hrtime.bigint() - start > 1_000_000_000) { + throw new Error('Waiting for more than 1 second'); + } + + await promiseTimeout(1); + } while (spy.callCount === calls); +} diff --git a/lib/test-utils/test-utils.ts b/lib/test-utils/test-utils.ts new file mode 100644 index 00000000000..7e488702711 --- /dev/null +++ b/lib/test-utils/test-utils.ts @@ -0,0 +1,175 @@ +import { RedisModules, RedisScripts } from '../commands'; +import RedisClient, { RedisClientOptions, RedisClientType } from '../client'; +import RedisCluster, { RedisClusterOptions, RedisClusterType } from '../cluster'; +import { RedisServerDockerConfig, spawnRedisServer, spawnRedisCluster } from './dockers'; +import yargs from 'yargs'; +import { hideBin } from 'yargs/helpers'; + +interface CommonTestOptions { + minimumDockerVersion?: Array; +} + +interface ClientTestOptions extends CommonTestOptions { + serverArguments: Array; + clientOptions?: Partial>; + disableClientSetup?: boolean; +} + +interface ClusterTestOptions extends CommonTestOptions { + serverArguments: Array; + clusterConfiguration?: Partial>; +} + +interface TestsUtilsConfig { + dockerImageName: string; + dockerImageVersionArgument: string; + defaultDockerVersion: string; +} + +export default class TestUtils { + static #getVersion(config: TestsUtilsConfig): Array { + return yargs(hideBin(process.argv)) + .option('redis-version', { + type: 'string', + default: config.defaultDockerVersion + }) + .coerce(config.dockerImageVersionArgument, (arg: string) => { + return arg.split('.').map(x => { + const value = Number(x); + if (Number.isNaN(value)) { + throw new TypeError(`${arg} is not a valid redis version`); + } + + return value; + }); + }) + .demandOption(config.dockerImageVersionArgument) + .parseSync()[config.dockerImageVersionArgument]; + } + + readonly #DOCKER_IMAGE: RedisServerDockerConfig; + + constructor(config: TestsUtilsConfig) { + this.#DOCKER_IMAGE = { + image: config.dockerImageName, + version: TestUtils.#getVersion(config) + }; + } + + isVersionGreaterThan(minimumVersion: Array | undefined): boolean { + if (minimumVersion === undefined) return true; + + const lastIndex = Math.min(this.#DOCKER_IMAGE.version.length, minimumVersion.length) - 1; + for (let i = 0; i < lastIndex; i++) { + if (this.#DOCKER_IMAGE.version[i] > minimumVersion[i]) { + return true; + } else if (minimumVersion[i] > this.#DOCKER_IMAGE.version[i]) { + return false; + } + } + + return this.#DOCKER_IMAGE.version[lastIndex] >= minimumVersion[lastIndex]; + } + + isVersionGreaterThanHook(minimumVersion: Array | undefined): void { + const isVersionGreaterThan = this.isVersionGreaterThan.bind(this); + before(function () { + if (!isVersionGreaterThan(minimumVersion)) { + return this.skip(); + } + }); + } + + testWithClient( + title: string, + fn: (client: RedisClientType) => Promise, + options: ClientTestOptions + ): Mocha.Test { + let dockerPromise: ReturnType; + if (this.isVersionGreaterThan(options.minimumDockerVersion)) { + const dockerImage = this.#DOCKER_IMAGE; + before(function () { + this.timeout(5000); + + dockerPromise = spawnRedisServer(dockerImage, options.serverArguments); + return dockerPromise; + }); + } + + return it(title, async function() { + if (!dockerPromise) return this.skip(); + + const client = RedisClient.create({ + ...options?.clientOptions, + socket: { + ...options?.clientOptions?.socket, + port: (await dockerPromise).port + } + }); + + if (options.disableClientSetup) { + return fn(client); + } + + try { + await client.connect(); + await client.flushAll(); + + await fn(client); + } finally { + if (client.isOpen) { + await client.flushAll(); + await client.disconnect(); + } + } + }); + } + + static async #clusterFlushAll(cluster: RedisClusterType): Promise { + await Promise.all( + cluster.getMasters().map(({ client }) => client.flushAll()) + ); + } + + testWithCluster( + title: string, + fn: (cluster: RedisClusterType) => Promise, + options: ClusterTestOptions + ): Mocha.Test { + let dockersPromise: ReturnType; + if (this.isVersionGreaterThan(options.minimumDockerVersion)) { + const dockerImage = this.#DOCKER_IMAGE; + before(function () { + this.timeout(10000); + + dockersPromise = spawnRedisCluster(dockerImage, options.serverArguments); + return dockersPromise; + }); + } + + return it(title, async function () { + if (!dockersPromise) return this.skip(); + + const dockers = await dockersPromise, + cluster = RedisCluster.create({ + ...options.clusterConfiguration, + rootNodes: dockers.map(({ port }) => ({ + socket: { + port + } + })) + }); + + + await cluster.connect(); + + try { + await TestUtils.#clusterFlushAll(cluster); + await fn(cluster); + } finally { + await TestUtils.#clusterFlushAll(cluster); + await cluster.disconnect(); + } + }); + } +} diff --git a/package-lock.json b/package-lock.json index 520aedc3278..ff1b2e6e569 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,65 +18,65 @@ "@istanbuljs/nyc-config-typescript": "^1.0.1", "@tsconfig/node12": "^1.0.9", "@types/mocha": "^9.0.0", - "@types/node": "^16.11.1", - "@types/sinon": "^10.0.4", - "@types/which": "^2.0.1", + "@types/node": "^16.11.6", + "@types/sinon": "^10.0.6", "@types/yallist": "^4.0.1", - "@typescript-eslint/eslint-plugin": "^5.1.0", - "@typescript-eslint/parser": "^5.1.0", - "eslint": "^8.0.1", + "@types/yargs": "^17.0.5", + "@typescript-eslint/eslint-plugin": "^5.2.0", + "@typescript-eslint/parser": "^5.2.0", + "eslint": "^8.1.0", "mocha": "^9.1.3", "nyc": "^15.1.0", "release-it": "^14.11.6", "sinon": "^11.1.2", "source-map-support": "^0.5.20", - "ts-node": "^10.3.0", - "typedoc": "^0.22.6", + "ts-node": "^10.4.0", + "typedoc": "^0.22.7", "typedoc-github-wiki-theme": "^0.6.0", "typedoc-plugin-markdown": "^3.11.3", "typescript": "^4.4.4", - "which": "^2.0.2" + "yargs": "^17.2.1" }, "engines": { "node": ">=12" } }, "node_modules/@babel/code-frame": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", - "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", - "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz", + "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "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.15.8", - "@babel/generator": "^7.15.8", - "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.8", - "@babel/helpers": "^7.15.4", - "@babel/parser": "^7.15.8", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.6", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -102,12 +102,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", - "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", "dev": true, "dependencies": { - "@babel/types": "^7.15.6", + "@babel/types": "^7.16.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -116,12 +116,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", - "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.0.tgz", + "integrity": "sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.15.0", + "@babel/compat-data": "^7.16.0", "@babel/helper-validator-option": "^7.14.5", "browserslist": "^4.16.6", "semver": "^6.3.0" @@ -143,132 +143,132 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", - "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", "dev": true, "dependencies": { - "@babel/helper-get-function-arity": "^7.15.4", - "@babel/template": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-get-function-arity": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", - "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", "dev": true, "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", - "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", "dev": true, "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", - "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", "dev": true, "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", - "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", "dev": true, "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", - "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", + "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.15.4", - "@babel/helper-replace-supers": "^7.15.4", - "@babel/helper-simple-access": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.6" + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", - "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", "dev": true, "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", - "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", + "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.15.4", - "@babel/helper-optimise-call-expression": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", - "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", "dev": true, "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", - "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", "dev": true, "dependencies": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" @@ -293,26 +293,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", - "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.0.tgz", + "integrity": "sha512-dVRM0StFMdKlkt7cVcGgwD8UMaBfWJHl3A83Yfs8GQ3MO0LHIIIMvK7Fa0RGOGUQ10qikLaX6D7o5htcQWgTMQ==", "dev": true, "dependencies": { - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.15.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -392,9 +392,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", - "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.0.tgz", + "integrity": "sha512-TEHWXf0xxpi9wKVyBCmRcSSDjbJ/cl6LUdlbYUHEaNQUJGhreJbZrXT6sR4+fZLxVUJqNRB4KyOvjuy/D9009A==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -404,32 +404,32 @@ } }, "node_modules/@babel/template": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", - "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", - "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-function-name": "^7.15.4", - "@babel/helper-hoist-variables": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.0.tgz", + "integrity": "sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -447,12 +447,12 @@ } }, "node_modules/@babel/types": { - "version": "7.15.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", - "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.14.9", + "@babel/helper-validator-identifier": "^7.15.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -972,9 +972,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.11.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.1.tgz", - "integrity": "sha512-PYGcJHL9mwl1Ek3PLiYgyEKtwTMmkMw4vbiyz/ps3pfdRYLVv+SN7qHVAImrjdAXxgluDEw6Ph4lyv+m9UpRmA==", + "version": "16.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", + "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==", "dev": true }, "node_modules/@types/parse-json": { @@ -993,34 +993,43 @@ } }, "node_modules/@types/sinon": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.4.tgz", - "integrity": "sha512-fOYjrxQv8zJsqOY6V6ecP4eZhQBxtY80X0er1VVnUIAIZo74jHm8e1vguG5Yt4Iv8W2Wr7TgibB8MfRe32k9pA==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.6.tgz", + "integrity": "sha512-6EF+wzMWvBNeGrfP3Nx60hhx+FfwSg1JJBLAAP/IdIUq0EYkqCYf70VT3PhuhPX9eLD+Dp+lNdpb/ZeHG8Yezg==", "dev": true, "dependencies": { "@sinonjs/fake-timers": "^7.1.0" } }, - "node_modules/@types/which": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.1.tgz", - "integrity": "sha512-Jjakcv8Roqtio6w1gr0D7y6twbhx6gGgFGF5BLwajPpnOIOxFkakFhCq+LmyyeAz7BX6ULrjBOxdKaCDy+4+dQ==", - "dev": true - }, "node_modules/@types/yallist": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/yallist/-/yallist-4.0.1.tgz", "integrity": "sha512-G3FNJfaYtN8URU6wd6+uwFI62KO79j7n3XTYcwcFncP8gkfoi0b821GoVVt0oqKVnCqKYOMNKIGpakPoFhzAGA==", "dev": true }, + "node_modules/@types/yargs": { + "version": "17.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.5.tgz", + "integrity": "sha512-4HNq144yhaVjJs+ON6A07NEoi9Hh0Rhl/jI9Nt/l/YRjt+T6St/QK3meFARWZ8IgkzoD1LC0PdTdJenlQQi2WQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "dev": true + }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.1.0.tgz", - "integrity": "sha512-bekODL3Tqf36Yz8u+ilha4zGxL9mdB6LIsIoMAvvC5FAuWo4NpZYXtCbv7B2CeR1LhI/lLtLk+q4tbtxuoVuCg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.2.0.tgz", + "integrity": "sha512-qQwg7sqYkBF4CIQSyRQyqsYvP+g/J0To9ZPVNJpfxfekl5RmdvQnFFTVVwpRtaUDFNvjfe/34TgY/dpc3MgNTw==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "5.1.0", - "@typescript-eslint/scope-manager": "5.1.0", + "@typescript-eslint/experimental-utils": "5.2.0", + "@typescript-eslint/scope-manager": "5.2.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -1046,15 +1055,15 @@ } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.1.0.tgz", - "integrity": "sha512-ovE9qUiZMOMgxQAESZsdBT+EXIfx/YUYAbwGUI6V03amFdOOxI9c6kitkgRvLkJaLusgMZ2xBhss+tQ0Y1HWxA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.2.0.tgz", + "integrity": "sha512-fWyT3Agf7n7HuZZRpvUYdFYbPk3iDCq6fgu3ulia4c7yxmPnwVBovdSOX7RL+k8u6hLbrXcdAehlWUVpGh6IEw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.1.0", - "@typescript-eslint/types": "5.1.0", - "@typescript-eslint/typescript-estree": "5.1.0", + "@typescript-eslint/scope-manager": "5.2.0", + "@typescript-eslint/types": "5.2.0", + "@typescript-eslint/typescript-estree": "5.2.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -1070,14 +1079,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.1.0.tgz", - "integrity": "sha512-vx1P+mhCtYw3+bRHmbalq/VKP2Y3gnzNgxGxfEWc6OFpuEL7iQdAeq11Ke3Rhy8NjgB+AHsIWEwni3e+Y7djKA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.2.0.tgz", + "integrity": "sha512-Uyy4TjJBlh3NuA8/4yIQptyJb95Qz5PX//6p8n7zG0QnN4o3NF9Je3JHbVU7fxf5ncSXTmnvMtd/LDQWDk0YqA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.1.0", - "@typescript-eslint/types": "5.1.0", - "@typescript-eslint/typescript-estree": "5.1.0", + "@typescript-eslint/scope-manager": "5.2.0", + "@typescript-eslint/types": "5.2.0", + "@typescript-eslint/typescript-estree": "5.2.0", "debug": "^4.3.2" }, "engines": { @@ -1097,13 +1106,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.1.0.tgz", - "integrity": "sha512-yYlyVjvn5lvwCL37i4hPsa1s0ORsjkauhTqbb8MnpvUs7xykmcjGqwlNZ2Q5QpoqkJ1odlM2bqHqJwa28qV6Tw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.2.0.tgz", + "integrity": "sha512-RW+wowZqPzQw8MUFltfKYZfKXqA2qgyi6oi/31J1zfXJRpOn6tCaZtd9b5u9ubnDG2n/EMvQLeZrsLNPpaUiFQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.1.0", - "@typescript-eslint/visitor-keys": "5.1.0" + "@typescript-eslint/types": "5.2.0", + "@typescript-eslint/visitor-keys": "5.2.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1114,9 +1123,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.1.0.tgz", - "integrity": "sha512-sEwNINVxcB4ZgC6Fe6rUyMlvsB2jvVdgxjZEjQUQVlaSPMNamDOwO6/TB98kFt4sYYfNhdhTPBEQqNQZjMMswA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.2.0.tgz", + "integrity": "sha512-cTk6x08qqosps6sPyP2j7NxyFPlCNsJwSDasqPNjEQ8JMD5xxj2NHxcLin5AJQ8pAVwpQ8BMI3bTxR0zxmK9qQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1127,13 +1136,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.1.0.tgz", - "integrity": "sha512-SSz+l9YrIIsW4s0ZqaEfnjl156XQ4VRmJsbA0ZE1XkXrD3cRpzuZSVCyqeCMR3EBjF27IisWakbBDGhGNIOvfQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.2.0.tgz", + "integrity": "sha512-RsdXq2XmVgKbm9nLsE3mjNUM7BTr/K4DYR9WfFVMUuozHWtH5gMpiNZmtrMG8GR385EOSQ3kC9HiEMJWimxd/g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.1.0", - "@typescript-eslint/visitor-keys": "5.1.0", + "@typescript-eslint/types": "5.2.0", + "@typescript-eslint/visitor-keys": "5.2.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -1154,12 +1163,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.1.0.tgz", - "integrity": "sha512-uqNXepKBg81JVwjuqAxYrXa1Ql/YDzM+8g/pS+TCPxba0wZttl8m5DkrasbfnmJGHs4lQ2jTbcZ5azGhI7kK+w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.2.0.tgz", + "integrity": "sha512-Nk7HizaXWWCUBfLA/rPNKMzXzWS8Wg9qHMuGtT+v2/YpPij4nVXrVJc24N/r5WrrmqK31jCrZxeHqIgqRzs0Xg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.1.0", + "@typescript-eslint/types": "5.2.0", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -1486,15 +1495,15 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.4.tgz", - "integrity": "sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ==", + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.5.tgz", + "integrity": "sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA==", "dev": true, "dependencies": { - "caniuse-lite": "^1.0.30001265", - "electron-to-chromium": "^1.3.867", + "caniuse-lite": "^1.0.30001271", + "electron-to-chromium": "^1.3.878", "escalade": "^3.1.1", - "node-releases": "^2.0.0", + "node-releases": "^2.0.1", "picocolors": "^1.0.0" }, "bin": { @@ -1627,9 +1636,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001269", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001269.tgz", - "integrity": "sha512-UOy8okEVs48MyHYgV+RdW1Oiudl1H6KolybD6ZquD0VcrPSgj25omXO1S7rDydjpqaISCwA8Pyx+jUQKZwWO5w==", + "version": "1.0.30001274", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001274.tgz", + "integrity": "sha512-+Nkvv0fHyhISkiMIjnyjmf5YJcQ1IQHZN6U9TLUMroWR38FNwpsC51Gb68yueafX1V6ifOisInSgP9WJFS13ew==", "dev": true, "funding": { "type": "opencollective", @@ -2088,9 +2097,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.3.872", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.872.tgz", - "integrity": "sha512-qG96atLFY0agKyEETiBFNhpRLSXGSXOBuhXWpbkYqrLKKASpRyRBUtfkn0ZjIf/yXfA7FA4nScVOMpXSHFlUCQ==", + "version": "1.3.885", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.885.tgz", + "integrity": "sha512-JXKFJcVWrdHa09n4CNZYfYaK6EW5aAew7/wr3L1OnsD1L+JHL+RCtd7QgIsxUbFPeTwPlvnpqNNTOLkoefmtXg==", "dev": true }, "node_modules/emoji-regex": { @@ -2166,9 +2175,9 @@ } }, "node_modules/eslint": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.0.1.tgz", - "integrity": "sha512-LsgcwZgQ72vZ+SMp4K6pAnk2yFDWL7Ti4pJaRvsZ0Hsw2h8ZjUIW38a9AFn2cZXdBMlScMFYYgsSp4ttFI/0bA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.1.0.tgz", + "integrity": "sha512-JZvNneArGSUsluHWJ8g8MMs3CfIEzwaLx9KyH4tZ2i+R2/rPWzL8c0zg3rHdwYVpN/1sB9gqnjHwz9HoeJpGHw==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.0.3", @@ -2283,9 +2292,9 @@ } }, "node_modules/eslint/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" @@ -2340,9 +2349,9 @@ } }, "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" @@ -2361,9 +2370,9 @@ } }, "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" @@ -2804,9 +2813,9 @@ } }, "node_modules/globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -3636,9 +3645,9 @@ "dev": true }, "node_modules/keyv": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", - "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz", + "integrity": "sha512-vqNHbAc8BBsxk+7QBYLW0Y219rWcClspR6WSeoHYKG5mnsSoOH+BL1pWq02DDCVdvvuUny5rkBlzMRzoqc+GIg==", "dev": true, "dependencies": { "json-buffer": "3.0.1" @@ -3800,9 +3809,9 @@ "dev": true }, "node_modules/marked": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.7.tgz", - "integrity": "sha512-ctKqbnLuNbsHbI26cfMyOlKgXGfl1orOv1AvWWDX7AkgfMOwCWvmuYc+mVLeWhQ9W6hdWVBynOs96VkcscKo0Q==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", + "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", "dev": true, "bin": { "marked": "bin/marked" @@ -3960,6 +3969,24 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4031,9 +4058,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", "dev": true, "dependencies": { "whatwg-url": "^5.0.0" @@ -4055,9 +4082,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.0.tgz", - "integrity": "sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", "dev": true }, "node_modules/normalize-path": { @@ -5737,9 +5764,9 @@ "dev": true }, "node_modules/ts-node": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.3.0.tgz", - "integrity": "sha512-RYIy3i8IgpFH45AX4fQHExrT8BxDeKTdC83QFJkNzkvt8uFB6QJ8XMyhynYiKMLxt9a7yuXaDBZNOYS3XjDcYw==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", + "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", "dev": true, "dependencies": { "@cspotcode/source-map-support": "0.7.0", @@ -5856,16 +5883,16 @@ } }, "node_modules/typedoc": { - "version": "0.22.6", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.6.tgz", - "integrity": "sha512-ePbJqOaz0GNkU2ehRwFwBpLD4Gp6m7jbJfHysXmDdjVKc1g8DFJ83r/LOZ9TZrkC661vgpoIY3FjSPEtUilHNA==", + "version": "0.22.7", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.7.tgz", + "integrity": "sha512-ndxxp+tU1Wczvdxp4u2/PvT1qjD6hdFdSdehpORHjE+JXmMkl2bftXCR0upHmsnesBG7VCcr8vfgloGHIH8glQ==", "dev": true, "dependencies": { "glob": "^7.2.0", "lunr": "^2.3.9", - "marked": "^3.0.4", + "marked": "^3.0.8", "minimatch": "^3.0.4", - "shiki": "^0.9.11" + "shiki": "^0.9.12" }, "bin": { "typedoc": "bin/typedoc" @@ -6273,9 +6300,9 @@ } }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", "dev": true, "dependencies": { "cliui": "^7.0.2", @@ -6287,7 +6314,7 @@ "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-parser": { @@ -6362,35 +6389,35 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", - "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", "dev": true, "requires": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.16.0" } }, "@babel/compat-data": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", - "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz", + "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==", "dev": true }, "@babel/core": { - "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.15.8", - "@babel/generator": "^7.15.8", - "@babel/helper-compilation-targets": "^7.15.4", - "@babel/helper-module-transforms": "^7.15.8", - "@babel/helpers": "^7.15.4", - "@babel/parser": "^7.15.8", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.6", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -6408,23 +6435,23 @@ } }, "@babel/generator": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", - "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", "dev": true, "requires": { - "@babel/types": "^7.15.6", + "@babel/types": "^7.16.0", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-compilation-targets": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", - "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.0.tgz", + "integrity": "sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg==", "dev": true, "requires": { - "@babel/compat-data": "^7.15.0", + "@babel/compat-data": "^7.16.0", "@babel/helper-validator-option": "^7.14.5", "browserslist": "^4.16.6", "semver": "^6.3.0" @@ -6439,105 +6466,105 @@ } }, "@babel/helper-function-name": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", - "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.15.4", - "@babel/template": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" } }, "@babel/helper-get-function-arity": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", - "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", "dev": true, "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" } }, "@babel/helper-hoist-variables": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", - "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", "dev": true, "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", - "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", "dev": true, "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" } }, "@babel/helper-module-imports": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", - "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", "dev": true, "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" } }, "@babel/helper-module-transforms": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", - "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", + "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.15.4", - "@babel/helper-replace-supers": "^7.15.4", - "@babel/helper-simple-access": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.6" + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" } }, "@babel/helper-optimise-call-expression": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", - "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", "dev": true, "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" } }, "@babel/helper-replace-supers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", - "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", + "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.15.4", - "@babel/helper-optimise-call-expression": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" } }, "@babel/helper-simple-access": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", - "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", "dev": true, "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", - "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", "dev": true, "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" } }, "@babel/helper-validator-identifier": { @@ -6553,23 +6580,23 @@ "dev": true }, "@babel/helpers": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", - "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.0.tgz", + "integrity": "sha512-dVRM0StFMdKlkt7cVcGgwD8UMaBfWJHl3A83Yfs8GQ3MO0LHIIIMvK7Fa0RGOGUQ10qikLaX6D7o5htcQWgTMQ==", "dev": true, "requires": { - "@babel/template": "^7.15.4", - "@babel/traverse": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" } }, "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.15.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -6633,35 +6660,35 @@ } }, "@babel/parser": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", - "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.0.tgz", + "integrity": "sha512-TEHWXf0xxpi9wKVyBCmRcSSDjbJ/cl6LUdlbYUHEaNQUJGhreJbZrXT6sR4+fZLxVUJqNRB4KyOvjuy/D9009A==", "dev": true }, "@babel/template": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", - "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", "dev": true, "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4" + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" } }, "@babel/traverse": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", - "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.15.4", - "@babel/helper-function-name": "^7.15.4", - "@babel/helper-hoist-variables": "^7.15.4", - "@babel/helper-split-export-declaration": "^7.15.4", - "@babel/parser": "^7.15.4", - "@babel/types": "^7.15.4", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.0.tgz", + "integrity": "sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -6675,12 +6702,12 @@ } }, "@babel/types": { - "version": "7.15.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", - "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.9", + "@babel/helper-validator-identifier": "^7.15.7", "to-fast-properties": "^2.0.0" } }, @@ -7122,9 +7149,9 @@ "dev": true }, "@types/node": { - "version": "16.11.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.1.tgz", - "integrity": "sha512-PYGcJHL9mwl1Ek3PLiYgyEKtwTMmkMw4vbiyz/ps3pfdRYLVv+SN7qHVAImrjdAXxgluDEw6Ph4lyv+m9UpRmA==", + "version": "16.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", + "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==", "dev": true }, "@types/parse-json": { @@ -7143,34 +7170,43 @@ } }, "@types/sinon": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.4.tgz", - "integrity": "sha512-fOYjrxQv8zJsqOY6V6ecP4eZhQBxtY80X0er1VVnUIAIZo74jHm8e1vguG5Yt4Iv8W2Wr7TgibB8MfRe32k9pA==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.6.tgz", + "integrity": "sha512-6EF+wzMWvBNeGrfP3Nx60hhx+FfwSg1JJBLAAP/IdIUq0EYkqCYf70VT3PhuhPX9eLD+Dp+lNdpb/ZeHG8Yezg==", "dev": true, "requires": { "@sinonjs/fake-timers": "^7.1.0" } }, - "@types/which": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.1.tgz", - "integrity": "sha512-Jjakcv8Roqtio6w1gr0D7y6twbhx6gGgFGF5BLwajPpnOIOxFkakFhCq+LmyyeAz7BX6ULrjBOxdKaCDy+4+dQ==", - "dev": true - }, "@types/yallist": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/yallist/-/yallist-4.0.1.tgz", "integrity": "sha512-G3FNJfaYtN8URU6wd6+uwFI62KO79j7n3XTYcwcFncP8gkfoi0b821GoVVt0oqKVnCqKYOMNKIGpakPoFhzAGA==", "dev": true }, + "@types/yargs": { + "version": "17.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.5.tgz", + "integrity": "sha512-4HNq144yhaVjJs+ON6A07NEoi9Hh0Rhl/jI9Nt/l/YRjt+T6St/QK3meFARWZ8IgkzoD1LC0PdTdJenlQQi2WQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "dev": true + }, "@typescript-eslint/eslint-plugin": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.1.0.tgz", - "integrity": "sha512-bekODL3Tqf36Yz8u+ilha4zGxL9mdB6LIsIoMAvvC5FAuWo4NpZYXtCbv7B2CeR1LhI/lLtLk+q4tbtxuoVuCg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.2.0.tgz", + "integrity": "sha512-qQwg7sqYkBF4CIQSyRQyqsYvP+g/J0To9ZPVNJpfxfekl5RmdvQnFFTVVwpRtaUDFNvjfe/34TgY/dpc3MgNTw==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "5.1.0", - "@typescript-eslint/scope-manager": "5.1.0", + "@typescript-eslint/experimental-utils": "5.2.0", + "@typescript-eslint/scope-manager": "5.2.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -7180,55 +7216,55 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.1.0.tgz", - "integrity": "sha512-ovE9qUiZMOMgxQAESZsdBT+EXIfx/YUYAbwGUI6V03amFdOOxI9c6kitkgRvLkJaLusgMZ2xBhss+tQ0Y1HWxA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.2.0.tgz", + "integrity": "sha512-fWyT3Agf7n7HuZZRpvUYdFYbPk3iDCq6fgu3ulia4c7yxmPnwVBovdSOX7RL+k8u6hLbrXcdAehlWUVpGh6IEw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.1.0", - "@typescript-eslint/types": "5.1.0", - "@typescript-eslint/typescript-estree": "5.1.0", + "@typescript-eslint/scope-manager": "5.2.0", + "@typescript-eslint/types": "5.2.0", + "@typescript-eslint/typescript-estree": "5.2.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/parser": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.1.0.tgz", - "integrity": "sha512-vx1P+mhCtYw3+bRHmbalq/VKP2Y3gnzNgxGxfEWc6OFpuEL7iQdAeq11Ke3Rhy8NjgB+AHsIWEwni3e+Y7djKA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.2.0.tgz", + "integrity": "sha512-Uyy4TjJBlh3NuA8/4yIQptyJb95Qz5PX//6p8n7zG0QnN4o3NF9Je3JHbVU7fxf5ncSXTmnvMtd/LDQWDk0YqA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.1.0", - "@typescript-eslint/types": "5.1.0", - "@typescript-eslint/typescript-estree": "5.1.0", + "@typescript-eslint/scope-manager": "5.2.0", + "@typescript-eslint/types": "5.2.0", + "@typescript-eslint/typescript-estree": "5.2.0", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.1.0.tgz", - "integrity": "sha512-yYlyVjvn5lvwCL37i4hPsa1s0ORsjkauhTqbb8MnpvUs7xykmcjGqwlNZ2Q5QpoqkJ1odlM2bqHqJwa28qV6Tw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.2.0.tgz", + "integrity": "sha512-RW+wowZqPzQw8MUFltfKYZfKXqA2qgyi6oi/31J1zfXJRpOn6tCaZtd9b5u9ubnDG2n/EMvQLeZrsLNPpaUiFQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.1.0", - "@typescript-eslint/visitor-keys": "5.1.0" + "@typescript-eslint/types": "5.2.0", + "@typescript-eslint/visitor-keys": "5.2.0" } }, "@typescript-eslint/types": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.1.0.tgz", - "integrity": "sha512-sEwNINVxcB4ZgC6Fe6rUyMlvsB2jvVdgxjZEjQUQVlaSPMNamDOwO6/TB98kFt4sYYfNhdhTPBEQqNQZjMMswA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.2.0.tgz", + "integrity": "sha512-cTk6x08qqosps6sPyP2j7NxyFPlCNsJwSDasqPNjEQ8JMD5xxj2NHxcLin5AJQ8pAVwpQ8BMI3bTxR0zxmK9qQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.1.0.tgz", - "integrity": "sha512-SSz+l9YrIIsW4s0ZqaEfnjl156XQ4VRmJsbA0ZE1XkXrD3cRpzuZSVCyqeCMR3EBjF27IisWakbBDGhGNIOvfQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.2.0.tgz", + "integrity": "sha512-RsdXq2XmVgKbm9nLsE3mjNUM7BTr/K4DYR9WfFVMUuozHWtH5gMpiNZmtrMG8GR385EOSQ3kC9HiEMJWimxd/g==", "dev": true, "requires": { - "@typescript-eslint/types": "5.1.0", - "@typescript-eslint/visitor-keys": "5.1.0", + "@typescript-eslint/types": "5.2.0", + "@typescript-eslint/visitor-keys": "5.2.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -7237,12 +7273,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.1.0.tgz", - "integrity": "sha512-uqNXepKBg81JVwjuqAxYrXa1Ql/YDzM+8g/pS+TCPxba0wZttl8m5DkrasbfnmJGHs4lQ2jTbcZ5azGhI7kK+w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.2.0.tgz", + "integrity": "sha512-Nk7HizaXWWCUBfLA/rPNKMzXzWS8Wg9qHMuGtT+v2/YpPij4nVXrVJc24N/r5WrrmqK31jCrZxeHqIgqRzs0Xg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.1.0", + "@typescript-eslint/types": "5.2.0", "eslint-visitor-keys": "^3.0.0" } }, @@ -7483,15 +7519,15 @@ "dev": true }, "browserslist": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.4.tgz", - "integrity": "sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ==", + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.5.tgz", + "integrity": "sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001265", - "electron-to-chromium": "^1.3.867", + "caniuse-lite": "^1.0.30001271", + "electron-to-chromium": "^1.3.878", "escalade": "^3.1.1", - "node-releases": "^2.0.0", + "node-releases": "^2.0.1", "picocolors": "^1.0.0" } }, @@ -7578,9 +7614,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001269", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001269.tgz", - "integrity": "sha512-UOy8okEVs48MyHYgV+RdW1Oiudl1H6KolybD6ZquD0VcrPSgj25omXO1S7rDydjpqaISCwA8Pyx+jUQKZwWO5w==", + "version": "1.0.30001274", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001274.tgz", + "integrity": "sha512-+Nkvv0fHyhISkiMIjnyjmf5YJcQ1IQHZN6U9TLUMroWR38FNwpsC51Gb68yueafX1V6ifOisInSgP9WJFS13ew==", "dev": true }, "chalk": { @@ -7927,9 +7963,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.872", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.872.tgz", - "integrity": "sha512-qG96atLFY0agKyEETiBFNhpRLSXGSXOBuhXWpbkYqrLKKASpRyRBUtfkn0ZjIf/yXfA7FA4nScVOMpXSHFlUCQ==", + "version": "1.3.885", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.885.tgz", + "integrity": "sha512-JXKFJcVWrdHa09n4CNZYfYaK6EW5aAew7/wr3L1OnsD1L+JHL+RCtd7QgIsxUbFPeTwPlvnpqNNTOLkoefmtXg==", "dev": true }, "emoji-regex": { @@ -7990,9 +8026,9 @@ "dev": true }, "eslint": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.0.1.tgz", - "integrity": "sha512-LsgcwZgQ72vZ+SMp4K6pAnk2yFDWL7Ti4pJaRvsZ0Hsw2h8ZjUIW38a9AFn2cZXdBMlScMFYYgsSp4ttFI/0bA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.1.0.tgz", + "integrity": "sha512-JZvNneArGSUsluHWJ8g8MMs3CfIEzwaLx9KyH4tZ2i+R2/rPWzL8c0zg3rHdwYVpN/1sB9gqnjHwz9HoeJpGHw==", "dev": true, "requires": { "@eslint/eslintrc": "^1.0.3", @@ -8046,9 +8082,9 @@ } }, "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "ignore": { @@ -8119,9 +8155,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -8136,9 +8172,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -8462,9 +8498,9 @@ } }, "globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -9069,9 +9105,9 @@ "dev": true }, "keyv": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", - "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz", + "integrity": "sha512-vqNHbAc8BBsxk+7QBYLW0Y219rWcClspR6WSeoHYKG5mnsSoOH+BL1pWq02DDCVdvvuUny5rkBlzMRzoqc+GIg==", "dev": true, "requires": { "json-buffer": "3.0.1" @@ -9196,9 +9232,9 @@ "dev": true }, "marked": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.7.tgz", - "integrity": "sha512-ctKqbnLuNbsHbI26cfMyOlKgXGfl1orOv1AvWWDX7AkgfMOwCWvmuYc+mVLeWhQ9W6hdWVBynOs96VkcscKo0Q==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", + "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", "dev": true }, "merge-stream": { @@ -9311,6 +9347,21 @@ "requires": { "has-flag": "^4.0.0" } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } } } }, @@ -9375,9 +9426,9 @@ } }, "node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", "dev": true, "requires": { "whatwg-url": "^5.0.0" @@ -9393,9 +9444,9 @@ } }, "node-releases": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.0.tgz", - "integrity": "sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", "dev": true }, "normalize-path": { @@ -10671,9 +10722,9 @@ "dev": true }, "ts-node": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.3.0.tgz", - "integrity": "sha512-RYIy3i8IgpFH45AX4fQHExrT8BxDeKTdC83QFJkNzkvt8uFB6QJ8XMyhynYiKMLxt9a7yuXaDBZNOYS3XjDcYw==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", + "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", "dev": true, "requires": { "@cspotcode/source-map-support": "0.7.0", @@ -10752,16 +10803,16 @@ } }, "typedoc": { - "version": "0.22.6", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.6.tgz", - "integrity": "sha512-ePbJqOaz0GNkU2ehRwFwBpLD4Gp6m7jbJfHysXmDdjVKc1g8DFJ83r/LOZ9TZrkC661vgpoIY3FjSPEtUilHNA==", + "version": "0.22.7", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.7.tgz", + "integrity": "sha512-ndxxp+tU1Wczvdxp4u2/PvT1qjD6hdFdSdehpORHjE+JXmMkl2bftXCR0upHmsnesBG7VCcr8vfgloGHIH8glQ==", "dev": true, "requires": { "glob": "^7.2.0", "lunr": "^2.3.9", - "marked": "^3.0.4", + "marked": "^3.0.8", "minimatch": "^3.0.4", - "shiki": "^0.9.11" + "shiki": "^0.9.12" }, "dependencies": { "glob": { @@ -11074,9 +11125,9 @@ "dev": true }, "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", "dev": true, "requires": { "cliui": "^7.0.2", diff --git a/package.json b/package.json index beddb1f86df..f252e4a0fa3 100644 --- a/package.json +++ b/package.json @@ -27,24 +27,24 @@ "@istanbuljs/nyc-config-typescript": "^1.0.1", "@tsconfig/node12": "^1.0.9", "@types/mocha": "^9.0.0", - "@types/node": "^16.11.1", - "@types/sinon": "^10.0.4", - "@types/which": "^2.0.1", + "@types/node": "^16.11.6", + "@types/sinon": "^10.0.6", "@types/yallist": "^4.0.1", - "@typescript-eslint/eslint-plugin": "^5.1.0", - "@typescript-eslint/parser": "^5.1.0", - "eslint": "^8.0.1", + "@types/yargs": "^17.0.5", + "@typescript-eslint/eslint-plugin": "^5.2.0", + "@typescript-eslint/parser": "^5.2.0", + "eslint": "^8.1.0", "mocha": "^9.1.3", "nyc": "^15.1.0", "release-it": "^14.11.6", "sinon": "^11.1.2", "source-map-support": "^0.5.20", - "ts-node": "^10.3.0", - "typedoc": "^0.22.6", + "ts-node": "^10.4.0", + "typedoc": "^0.22.7", "typedoc-github-wiki-theme": "^0.6.0", "typedoc-plugin-markdown": "^3.11.3", "typescript": "^4.4.4", - "which": "^2.0.2" + "yargs": "^17.2.1" }, "engines": { "node": ">=12" From 97dd75a9e5ca260208711c6be45d376a904e51cc Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 1 Nov 2021 11:33:45 -0400 Subject: [PATCH 069/112] increase dockers timeout to 30s --- lib/test-utils/test-utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/test-utils/test-utils.ts b/lib/test-utils/test-utils.ts index 7e488702711..a550e3f707d 100644 --- a/lib/test-utils/test-utils.ts +++ b/lib/test-utils/test-utils.ts @@ -89,7 +89,7 @@ export default class TestUtils { if (this.isVersionGreaterThan(options.minimumDockerVersion)) { const dockerImage = this.#DOCKER_IMAGE; before(function () { - this.timeout(5000); + this.timeout(30000); dockerPromise = spawnRedisServer(dockerImage, options.serverArguments); return dockerPromise; @@ -140,7 +140,7 @@ export default class TestUtils { if (this.isVersionGreaterThan(options.minimumDockerVersion)) { const dockerImage = this.#DOCKER_IMAGE; before(function () { - this.timeout(10000); + this.timeout(30000); dockersPromise = spawnRedisCluster(dockerImage, options.serverArguments); return dockersPromise; From ecbd5b696828b70f06d44d3bf29062a820956797 Mon Sep 17 00:00:00 2001 From: Chayim Date: Thu, 4 Nov 2021 18:15:52 +0200 Subject: [PATCH 070/112] release drafter (#1683) * release drafter * fixing contributors --- .github/release-drafter-config.yml | 44 +++++++++++++++++++++++++++ .github/workflows/release-drafter.yml | 19 ++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 .github/release-drafter-config.yml create mode 100644 .github/workflows/release-drafter.yml diff --git a/.github/release-drafter-config.yml b/.github/release-drafter-config.yml new file mode 100644 index 00000000000..f17a2992fad --- /dev/null +++ b/.github/release-drafter-config.yml @@ -0,0 +1,44 @@ +name-template: 'Version $NEXT_PATCH_VERSION' +tag-template: 'v$NEXT_PATCH_VERSION' +autolabeler: + - label: 'chore' + files: + - '*.md' + - '.github/*' + - label: 'bug' + branch: + - '/bug-.+' + - label: 'chore' + branch: + - '/chore-.+' + - label: 'feature' + branch: + - '/feature-.+' +categories: + - title: 'Breaking Changes' + labels: + - 'breakingchange' + - title: '🚀 New Features' + labels: + - 'feature' + - 'enhancement' + - title: '🐛 Bug Fixes' + labels: + - 'fix' + - 'bugfix' + - 'bug' + - title: '🧰 Maintenance' + label: 'chore' +change-template: '- $TITLE (#$NUMBER)' +exclude-labels: + - 'skip-changelog' +template: | + ## Changes + + $CHANGES + + ## Contributors + We'd like to thank all the contributors who worked on this release! + + $CONTRIBUTORS + diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml new file mode 100644 index 00000000000..ec2d88bf6e7 --- /dev/null +++ b/.github/workflows/release-drafter.yml @@ -0,0 +1,19 @@ +name: Release Drafter + +on: + push: + # branches to consider in the event; optional, defaults to all + branches: + - master + +jobs: + update_release_draft: + runs-on: ubuntu-latest + steps: + # Drafts your next Release notes as Pull Requests are merged into "master" + - uses: release-drafter/release-drafter@v5 + with: + # (Optional) specify config name to use, relative to .github/. Default: release-drafter.yml + config-name: release-drafter-config.yml + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 3eb99dbe8378a347dd42a1ff87c89327e989443f Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 8 Nov 2021 19:21:15 -0500 Subject: [PATCH 071/112] use dockers for tests, use npm workspaces, add rejson & redisearch modules, fix some bugs --- .github/release-drafter-config.yml | 1 - .github/workflows/benchmark.yml | 46 - .github/workflows/tests.yml | 3 + .gitignore | 9 +- .npmignore | 20 - .nycrc.json | 4 - CONTRIBUTING.md | 5 +- README.md | 300 +------ benchmark/.gitignore | 1 - benchmark/index.js | 81 -- benchmark/package-lock.json | 849 ------------------ benchmark/package.json | 17 - package-lock.json | 616 ++++++++----- package.json | 67 +- packages/all-in-one/index.ts | 19 + packages/all-in-one/package.json | 27 + packages/all-in-one/tsconfig.json | 9 + .../client/.eslintrc.json | 0 packages/client/.gitignore | 1 + packages/client/.npmignore | 9 + packages/client/.nycrc.json | 4 + CHANGELOG.md => packages/client/CHANGELOG.md | 0 packages/client/LICENSE | 24 + packages/client/README.md | 294 ++++++ {docs => packages/client/docs}/FAQ.md | 0 .../client/docs}/client-configuration.md | 2 +- {docs => packages/client/docs}/clustering.md | 4 +- .../client/docs}/isolated-execution.md | 0 {docs => packages/client/docs}/v3-to-v4.md | 0 .../client/examples}/README.md | 0 .../client/examples}/blocking-list-pop.js | 0 .../examples}/command-with-modifiers.js | 0 .../client/examples}/connect-as-acl-user.js | 0 .../client/examples}/lua-multi-incr.js | 0 .../client/examples}/package-lock.json | 0 .../client/examples}/package.json | 7 +- .../client/examples}/set-scan.js | 0 index.ts => packages/client/index.ts | 0 .../client/lib}/client/commands-queue.ts | 0 .../client/lib}/client/commands.ts | 0 .../client/lib}/client/index.spec.ts | 20 +- {lib => packages/client/lib}/client/index.ts | 0 .../client/lib}/client/multi-command.ts | 0 .../client/lib}/client/socket.spec.ts | 0 {lib => packages/client/lib}/client/socket.ts | 0 .../client/lib}/cluster/cluster-slots.ts | 0 .../client/lib}/cluster/commands.ts | 0 .../client/lib}/cluster/index.spec.ts | 70 +- {lib => packages/client/lib}/cluster/index.ts | 0 .../client/lib}/cluster/multi-command.ts | 0 .../client/lib}/command-options.ts | 0 .../client/lib}/commander.spec.ts | 0 {lib => packages/client/lib}/commander.ts | 0 .../client/lib}/commands/ACL_CAT.spec.ts | 0 .../client/lib}/commands/ACL_CAT.ts | 0 .../client/lib}/commands/ACL_DELUSER.spec.ts | 0 .../client/lib}/commands/ACL_DELUSER.ts | 0 .../client/lib}/commands/ACL_GENPASS.spec.ts | 0 .../client/lib}/commands/ACL_GENPASS.ts | 0 .../client/lib}/commands/ACL_GETUSER.spec.ts | 0 .../client/lib}/commands/ACL_GETUSER.ts | 0 .../client/lib}/commands/ACL_LIST.spec.ts | 0 .../client/lib}/commands/ACL_LIST.ts | 0 .../client/lib}/commands/ACL_LOAD.spec.ts | 0 .../client/lib}/commands/ACL_LOAD.ts | 0 .../client/lib}/commands/ACL_LOG.spec.ts | 0 .../client/lib}/commands/ACL_LOG.ts | 0 .../lib}/commands/ACL_LOG_RESET.spec.ts | 0 .../client/lib}/commands/ACL_LOG_RESET.ts | 0 .../client/lib}/commands/ACL_SAVE.spec.ts | 0 .../client/lib}/commands/ACL_SAVE.ts | 0 .../client/lib}/commands/ACL_SETUSER.spec.ts | 0 .../client/lib}/commands/ACL_SETUSER.ts | 0 .../client/lib}/commands/ACL_USERS.spec.ts | 0 .../client/lib}/commands/ACL_USERS.ts | 0 .../client/lib}/commands/ACL_WHOAMI.spec.ts | 0 .../client/lib}/commands/ACL_WHOAMI.ts | 0 .../client/lib}/commands/APPEND.spec.ts | 0 .../client/lib}/commands/APPEND.ts | 0 .../client/lib}/commands/ASKING.spec.ts | 0 .../client/lib}/commands/ASKING.ts | 0 .../client/lib}/commands/AUTH.spec.ts | 0 {lib => packages/client/lib}/commands/AUTH.ts | 0 .../client/lib}/commands/BGREWRITEAOF.spec.ts | 0 .../client/lib}/commands/BGREWRITEAOF.ts | 0 .../client/lib}/commands/BGSAVE.spec.ts | 0 .../client/lib}/commands/BGSAVE.ts | 0 .../client/lib}/commands/BITCOUNT.spec.ts | 0 .../client/lib}/commands/BITCOUNT.ts | 0 .../client/lib}/commands/BITFIELD.spec.ts | 0 .../client/lib}/commands/BITFIELD.ts | 0 .../client/lib}/commands/BITOP.spec.ts | 0 .../client/lib}/commands/BITOP.ts | 0 .../client/lib}/commands/BITPOS.spec.ts | 0 .../client/lib}/commands/BITPOS.ts | 0 .../client/lib}/commands/BLMOVE.spec.ts | 0 .../client/lib}/commands/BLMOVE.ts | 0 .../client/lib}/commands/BLPOP.spec.ts | 0 .../client/lib}/commands/BLPOP.ts | 0 .../client/lib}/commands/BRPOP.spec.ts | 0 .../client/lib}/commands/BRPOP.ts | 0 .../client/lib}/commands/BRPOPLPUSH.spec.ts | 0 .../client/lib}/commands/BRPOPLPUSH.ts | 0 .../client/lib}/commands/BZPOPMAX.spec.ts | 0 .../client/lib}/commands/BZPOPMAX.ts | 0 .../client/lib}/commands/BZPOPMIN.spec.ts | 0 .../client/lib}/commands/BZPOPMIN.ts | 0 .../client/lib}/commands/CLIENT_ID.spec.ts | 0 .../client/lib}/commands/CLIENT_ID.ts | 0 .../client/lib}/commands/CLIENT_INFO.spec.ts | 0 .../client/lib}/commands/CLIENT_INFO.ts | 0 .../lib}/commands/CLUSTER_ADDSLOTS.spec.ts | 0 .../client/lib}/commands/CLUSTER_ADDSLOTS.ts | 0 .../lib}/commands/CLUSTER_FLUSHSLOTS.spec.ts | 0 .../lib}/commands/CLUSTER_FLUSHSLOTS.ts | 0 .../commands/CLUSTER_GETKEYSINSLOT.spec.ts | 0 .../lib}/commands/CLUSTER_GETKEYSINSLOT.ts | 0 .../client/lib}/commands/CLUSTER_INFO.spec.ts | 0 .../client/lib}/commands/CLUSTER_INFO.ts | 0 .../client/lib}/commands/CLUSTER_MEET.spec.ts | 0 .../client/lib}/commands/CLUSTER_MEET.ts | 0 .../lib}/commands/CLUSTER_NODES.spec.ts | 0 .../client/lib}/commands/CLUSTER_NODES.ts | 0 .../lib}/commands/CLUSTER_RESET.spec.ts | 0 .../client/lib}/commands/CLUSTER_RESET.ts | 0 .../lib}/commands/CLUSTER_SETSLOT.spec.ts | 0 .../client/lib}/commands/CLUSTER_SETSLOT.ts | 0 .../lib}/commands/CLUSTER_SLOTS.spec.ts | 0 .../client/lib}/commands/CLUSTER_SLOTS.ts | 0 .../client/lib}/commands/COMMAND.spec.ts | 6 +- .../client/lib}/commands/COMMAND.ts | 0 .../lib}/commands/COMMAND_COUNT.spec.ts | 0 .../client/lib}/commands/COMMAND_COUNT.ts | 0 .../lib}/commands/COMMAND_GETKEYS.spec.ts | 0 .../client/lib}/commands/COMMAND_GETKEYS.ts | 0 .../client/lib}/commands/COMMAND_INFO.spec.ts | 0 .../client/lib}/commands/COMMAND_INFO.ts | 0 .../client/lib}/commands/CONFIG_GET.spec.ts | 0 .../client/lib}/commands/CONFIG_GET.ts | 0 .../lib}/commands/CONFIG_RESETSTAT.spec.ts | 0 .../client/lib}/commands/CONFIG_RESETSTAT.ts | 0 .../lib}/commands/CONFIG_REWRITE.spec.ts | 0 .../client/lib}/commands/CONFIG_REWRITE.ts | 0 .../client/lib}/commands/CONFIG_SET.spec.ts | 0 .../client/lib}/commands/CONFIG_SET.ts | 0 .../client/lib}/commands/COPY.spec.ts | 0 {lib => packages/client/lib}/commands/COPY.ts | 0 .../client/lib}/commands/DBSIZE.spec.ts | 0 .../client/lib}/commands/DBSIZE.ts | 0 .../client/lib}/commands/DECR.spec.ts | 0 {lib => packages/client/lib}/commands/DECR.ts | 0 .../client/lib}/commands/DECRBY.spec.ts | 0 .../client/lib}/commands/DECRBY.ts | 0 .../client/lib}/commands/DEL.spec.ts | 0 {lib => packages/client/lib}/commands/DEL.ts | 0 .../client/lib}/commands/DISCARD.spec.ts | 0 .../client/lib}/commands/DISCARD.ts | 0 .../client/lib}/commands/DUMP.spec.ts | 0 {lib => packages/client/lib}/commands/DUMP.ts | 0 .../client/lib}/commands/ECHO.spec.ts | 0 {lib => packages/client/lib}/commands/ECHO.ts | 0 .../client/lib}/commands/EVAL.spec.ts | 0 {lib => packages/client/lib}/commands/EVAL.ts | 0 .../client/lib}/commands/EVALSHA.spec.ts | 0 .../client/lib}/commands/EVALSHA.ts | 0 .../client/lib}/commands/EXISTS.spec.ts | 0 .../client/lib}/commands/EXISTS.ts | 0 .../client/lib}/commands/EXPIRE.spec.ts | 0 .../client/lib}/commands/EXPIRE.ts | 0 .../client/lib}/commands/EXPIREAT.spec.ts | 0 .../client/lib}/commands/EXPIREAT.ts | 0 .../client/lib}/commands/FAILOVER.spec.ts | 0 .../client/lib}/commands/FAILOVER.ts | 0 .../client/lib}/commands/FLUSHALL.spec.ts | 0 .../client/lib}/commands/FLUSHALL.ts | 0 .../client/lib}/commands/FLUSHDB.spec.ts | 0 .../client/lib}/commands/FLUSHDB.ts | 0 .../client/lib}/commands/GEOADD.spec.ts | 0 .../client/lib}/commands/GEOADD.ts | 0 .../client/lib}/commands/GEODIST.spec.ts | 0 .../client/lib}/commands/GEODIST.ts | 0 .../client/lib}/commands/GEOHASH.spec.ts | 0 .../client/lib}/commands/GEOHASH.ts | 0 .../client/lib}/commands/GEOPOS.spec.ts | 0 .../client/lib}/commands/GEOPOS.ts | 0 .../client/lib}/commands/GEOSEARCH.spec.ts | 0 .../client/lib}/commands/GEOSEARCH.ts | 0 .../lib}/commands/GEOSEARCHSTORE.spec.ts | 0 .../client/lib}/commands/GEOSEARCHSTORE.ts | 0 .../lib}/commands/GEOSEARCH_WITH.spec.ts | 0 .../client/lib}/commands/GEOSEARCH_WITH.ts | 0 .../client/lib}/commands/GET.spec.ts | 0 {lib => packages/client/lib}/commands/GET.ts | 0 .../client/lib}/commands/GETBIT.spec.ts | 0 .../client/lib}/commands/GETBIT.ts | 0 .../client/lib}/commands/GETDEL.spec.ts | 0 .../client/lib}/commands/GETDEL.ts | 0 .../client/lib}/commands/GETEX.spec.ts | 0 .../client/lib}/commands/GETEX.ts | 0 .../client/lib}/commands/GETRANGE.spec.ts | 0 .../client/lib}/commands/GETRANGE.ts | 0 .../client/lib}/commands/GETSET.spec.ts | 0 .../client/lib}/commands/GETSET.ts | 0 .../client/lib}/commands/GET_BUFFER.spec.ts | 0 .../client/lib}/commands/GET_BUFFER.ts | 0 .../client/lib}/commands/HDEL.spec.ts | 0 {lib => packages/client/lib}/commands/HDEL.ts | 0 .../client/lib}/commands/HELLO.spec.ts | 0 .../client/lib}/commands/HELLO.ts | 0 .../client/lib}/commands/HEXISTS.spec.ts | 0 .../client/lib}/commands/HEXISTS.ts | 0 .../client/lib}/commands/HGET.spec.ts | 0 {lib => packages/client/lib}/commands/HGET.ts | 0 .../client/lib}/commands/HGETALL.spec.ts | 0 .../client/lib}/commands/HGETALL.ts | 0 .../client/lib}/commands/HINCRBY.spec.ts | 0 .../client/lib}/commands/HINCRBY.ts | 0 .../client/lib}/commands/HINCRBYFLOAT.spec.ts | 0 .../client/lib}/commands/HINCRBYFLOAT.ts | 0 .../client/lib}/commands/HKEYS.spec.ts | 0 .../client/lib}/commands/HKEYS.ts | 0 .../client/lib}/commands/HLEN.spec.ts | 0 {lib => packages/client/lib}/commands/HLEN.ts | 0 .../client/lib}/commands/HMGET.spec.ts | 0 .../client/lib}/commands/HMGET.ts | 0 .../client/lib}/commands/HRANDFIELD.spec.ts | 0 .../client/lib}/commands/HRANDFIELD.ts | 0 .../lib}/commands/HRANDFIELD_COUNT.spec.ts | 0 .../client/lib}/commands/HRANDFIELD_COUNT.ts | 0 .../HRANDFIELD_COUNT_WITHVALUES.spec.ts | 0 .../commands/HRANDFIELD_COUNT_WITHVALUES.ts | 0 .../client/lib}/commands/HSCAN.spec.ts | 0 .../client/lib}/commands/HSCAN.ts | 0 .../client/lib}/commands/HSET.spec.ts | 0 {lib => packages/client/lib}/commands/HSET.ts | 0 .../client/lib}/commands/HSETNX.spec.ts | 0 .../client/lib}/commands/HSETNX.ts | 0 .../client/lib}/commands/HSTRLEN.spec.ts | 0 .../client/lib}/commands/HSTRLEN.ts | 0 .../client/lib}/commands/HVALS.spec.ts | 0 .../client/lib}/commands/HVALS.ts | 0 .../client/lib}/commands/INCR.spec.ts | 0 {lib => packages/client/lib}/commands/INCR.ts | 0 .../client/lib}/commands/INCRBY.spec.ts | 0 .../client/lib}/commands/INCRBY.ts | 0 .../client/lib}/commands/INCRBYFLOAT.spec.ts | 0 .../client/lib}/commands/INCRBYFLOAT.ts | 0 .../client/lib}/commands/INFO.spec.ts | 0 {lib => packages/client/lib}/commands/INFO.ts | 0 .../client/lib}/commands/KEYS.spec.ts | 0 {lib => packages/client/lib}/commands/KEYS.ts | 0 .../client/lib}/commands/LASTSAVE.spec.ts | 0 .../client/lib}/commands/LASTSAVE.ts | 0 .../client/lib}/commands/LINDEX.spec.ts | 0 .../client/lib}/commands/LINDEX.ts | 0 .../client/lib}/commands/LINSERT.spec.ts | 0 .../client/lib}/commands/LINSERT.ts | 0 .../client/lib}/commands/LLEN.spec.ts | 0 {lib => packages/client/lib}/commands/LLEN.ts | 0 .../client/lib}/commands/LMOVE.spec.ts | 0 .../client/lib}/commands/LMOVE.ts | 0 .../client/lib}/commands/LOLWUT.spec.ts | 0 .../client/lib}/commands/LOLWUT.ts | 0 .../client/lib}/commands/LPOP.spec.ts | 0 {lib => packages/client/lib}/commands/LPOP.ts | 0 .../client/lib}/commands/LPOP_COUNT.spec.ts | 0 .../client/lib}/commands/LPOP_COUNT.ts | 0 .../client/lib}/commands/LPOS.spec.ts | 0 {lib => packages/client/lib}/commands/LPOS.ts | 0 .../client/lib}/commands/LPOS_COUNT.spec.ts | 0 .../client/lib}/commands/LPOS_COUNT.ts | 0 .../client/lib}/commands/LPUSH.spec.ts | 0 .../client/lib}/commands/LPUSH.ts | 0 .../client/lib}/commands/LPUSHX.spec.ts | 0 .../client/lib}/commands/LPUSHX.ts | 0 .../client/lib}/commands/LRANGE.spec.ts | 0 .../client/lib}/commands/LRANGE.ts | 0 .../client/lib}/commands/LREM.spec.ts | 0 {lib => packages/client/lib}/commands/LREM.ts | 0 .../client/lib}/commands/LSET.spec.ts | 0 {lib => packages/client/lib}/commands/LSET.ts | 0 .../client/lib}/commands/LTRIM.spec.ts | 0 .../client/lib}/commands/LTRIM.ts | 0 .../lib}/commands/MEMORY_DOCTOR.spec.ts | 0 .../client/lib}/commands/MEMORY_DOCTOR.ts | 0 .../lib}/commands/MEMORY_MALLOC-STATS.spec.ts | 0 .../lib}/commands/MEMORY_MALLOC-STATS.ts | 0 .../client/lib}/commands/MEMORY_PURGE.spec.ts | 0 .../client/lib}/commands/MEMORY_PURGE.ts | 0 .../client/lib}/commands/MEMORY_STATS.spec.ts | 0 .../client/lib}/commands/MEMORY_STATS.ts | 0 .../client/lib}/commands/MEMORY_USAGE.spec.ts | 0 .../client/lib}/commands/MEMORY_USAGE.ts | 0 .../client/lib}/commands/MGET.spec.ts | 0 {lib => packages/client/lib}/commands/MGET.ts | 0 .../client/lib}/commands/MIGRATE.spec.ts | 0 .../client/lib}/commands/MIGRATE.ts | 0 .../client/lib}/commands/MODULE_LIST.spec.ts | 0 .../client/lib}/commands/MODULE_LIST.ts | 0 .../client/lib}/commands/MODULE_LOAD.spec.ts | 0 .../client/lib}/commands/MODULE_LOAD.ts | 0 .../lib}/commands/MODULE_UNLOAD.spec.ts | 0 .../client/lib}/commands/MODULE_UNLOAD.ts | 0 .../client/lib}/commands/MOVE.spec.ts | 0 {lib => packages/client/lib}/commands/MOVE.ts | 0 .../client/lib}/commands/MSET.spec.ts | 0 {lib => packages/client/lib}/commands/MSET.ts | 0 .../client/lib}/commands/MSETNX.spec.ts | 0 .../client/lib}/commands/MSETNX.ts | 0 .../client/lib}/commands/PERSIST.spec.ts | 0 .../client/lib}/commands/PERSIST.ts | 0 .../client/lib}/commands/PEXPIRE.spec.ts | 0 .../client/lib}/commands/PEXPIRE.ts | 0 .../client/lib}/commands/PEXPIREAT.spec.ts | 0 .../client/lib}/commands/PEXPIREAT.ts | 0 .../client/lib}/commands/PFADD.spec.ts | 0 .../client/lib}/commands/PFADD.ts | 0 .../client/lib}/commands/PFCOUNT.spec.ts | 0 .../client/lib}/commands/PFCOUNT.ts | 0 .../client/lib}/commands/PFMERGE.spec.ts | 0 .../client/lib}/commands/PFMERGE.ts | 0 .../client/lib}/commands/PING.spec.ts | 0 {lib => packages/client/lib}/commands/PING.ts | 0 .../client/lib}/commands/PSETEX.spec.ts | 0 .../client/lib}/commands/PSETEX.ts | 0 .../client/lib}/commands/PTTL.spec.ts | 0 {lib => packages/client/lib}/commands/PTTL.ts | 0 .../client/lib}/commands/PUBLISH.spec.ts | 0 .../client/lib}/commands/PUBLISH.ts | 0 .../lib}/commands/PUBSUB_CHANNELS.spec.ts | 0 .../client/lib}/commands/PUBSUB_CHANNELS.ts | 0 .../lib}/commands/PUBSUB_NUMPAT.spec.ts | 0 .../client/lib}/commands/PUBSUB_NUMPAT.ts | 0 .../lib}/commands/PUBSUB_NUMSUB.spec.ts | 0 .../client/lib}/commands/PUBSUB_NUMSUB.ts | 0 .../client/lib}/commands/RANDOMKEY.spec.ts | 0 .../client/lib}/commands/RANDOMKEY.ts | 0 .../client/lib}/commands/READONLY.spec.ts | 0 .../client/lib}/commands/READONLY.ts | 0 .../client/lib}/commands/READWRITE.spec.ts | 0 .../client/lib}/commands/READWRITE.ts | 0 .../client/lib}/commands/RENAME.spec.ts | 0 .../client/lib}/commands/RENAME.ts | 0 .../client/lib}/commands/RENAMENX.spec.ts | 0 .../client/lib}/commands/RENAMENX.ts | 0 .../client/lib}/commands/REPLICAOF.spec.ts | 0 .../client/lib}/commands/REPLICAOF.ts | 0 .../lib}/commands/RESTORE-ASKING.spec.ts | 0 .../client/lib}/commands/RESTORE-ASKING.ts | 0 .../client/lib}/commands/ROLE.spec.ts | 0 {lib => packages/client/lib}/commands/ROLE.ts | 0 .../client/lib}/commands/RPOP.spec.ts | 0 {lib => packages/client/lib}/commands/RPOP.ts | 0 .../client/lib}/commands/RPOPLPUSH.spec.ts | 0 .../client/lib}/commands/RPOPLPUSH.ts | 0 .../client/lib}/commands/RPOP_COUNT.spec.ts | 0 .../client/lib}/commands/RPOP_COUNT.ts | 0 .../client/lib}/commands/RPUSH.spec.ts | 0 .../client/lib}/commands/RPUSH.ts | 0 .../client/lib}/commands/RPUSHX.spec.ts | 0 .../client/lib}/commands/RPUSHX.ts | 0 .../client/lib}/commands/SADD.spec.ts | 0 {lib => packages/client/lib}/commands/SADD.ts | 0 .../client/lib}/commands/SAVE.spec.ts | 0 {lib => packages/client/lib}/commands/SAVE.ts | 0 .../client/lib}/commands/SCAN.spec.ts | 0 {lib => packages/client/lib}/commands/SCAN.ts | 0 .../client/lib}/commands/SCARD.spec.ts | 0 .../client/lib}/commands/SCARD.ts | 0 .../client/lib}/commands/SCRIPT_DEBUG.spec.ts | 0 .../client/lib}/commands/SCRIPT_DEBUG.ts | 0 .../lib}/commands/SCRIPT_EXISTS.spec.ts | 0 .../client/lib}/commands/SCRIPT_EXISTS.ts | 0 .../client/lib}/commands/SCRIPT_FLUSH.spec.ts | 0 .../client/lib}/commands/SCRIPT_FLUSH.ts | 0 .../client/lib}/commands/SCRIPT_KILL.spec.ts | 0 .../client/lib}/commands/SCRIPT_KILL.ts | 0 .../client/lib}/commands/SCRIPT_LOAD.spec.ts | 0 .../client/lib}/commands/SCRIPT_LOAD.ts | 0 .../client/lib}/commands/SDIFF.spec.ts | 0 .../client/lib}/commands/SDIFF.ts | 0 .../client/lib}/commands/SDIFFSTORE.spec.ts | 0 .../client/lib}/commands/SDIFFSTORE.ts | 0 .../client/lib}/commands/SET.spec.ts | 0 {lib => packages/client/lib}/commands/SET.ts | 0 .../client/lib}/commands/SETBIT.spec.ts | 0 .../client/lib}/commands/SETBIT.ts | 0 .../client/lib}/commands/SETEX.spec.ts | 0 .../client/lib}/commands/SETEX.ts | 0 .../client/lib}/commands/SETNX .spec.ts | 0 .../client/lib}/commands/SETNX.ts | 0 .../client/lib}/commands/SETRANGE.spec.ts | 0 .../client/lib}/commands/SETRANGE.ts | 0 .../client/lib}/commands/SHUTDOWN.spec.ts | 0 .../client/lib}/commands/SHUTDOWN.ts | 0 .../client/lib}/commands/SINTER.spec.ts | 0 .../client/lib}/commands/SINTER.ts | 0 .../client/lib}/commands/SINTERSTORE.spec.ts | 0 .../client/lib}/commands/SINTERSTORE.ts | 0 .../client/lib}/commands/SISMEMBER.spec.ts | 0 .../client/lib}/commands/SISMEMBER.ts | 0 .../client/lib}/commands/SMEMBERS.spec.ts | 0 .../client/lib}/commands/SMEMBERS.ts | 0 .../client/lib}/commands/SMISMEMBER.spec.ts | 0 .../client/lib}/commands/SMISMEMBER.ts | 0 .../client/lib}/commands/SMOVE.spec.ts | 0 .../client/lib}/commands/SMOVE.ts | 0 .../client/lib}/commands/SORT.spec.ts | 0 {lib => packages/client/lib}/commands/SORT.ts | 0 .../client/lib}/commands/SPOP.spec.ts | 0 {lib => packages/client/lib}/commands/SPOP.ts | 0 .../client/lib}/commands/SRANDMEMBER.spec.ts | 0 .../client/lib}/commands/SRANDMEMBER.ts | 0 .../lib}/commands/SRANDMEMBER_COUNT.spec.ts | 0 .../client/lib}/commands/SRANDMEMBER_COUNT.ts | 0 .../client/lib}/commands/SREM.spec.ts | 0 {lib => packages/client/lib}/commands/SREM.ts | 0 .../client/lib}/commands/SSCAN.spec.ts | 0 .../client/lib}/commands/SSCAN.ts | 0 .../client/lib}/commands/STRLEN.spec.ts | 0 .../client/lib}/commands/STRLEN.ts | 0 .../client/lib}/commands/SUNION.spec.ts | 0 .../client/lib}/commands/SUNION.ts | 0 .../client/lib}/commands/SUNIONSTORE.spec.ts | 0 .../client/lib}/commands/SUNIONSTORE.ts | 0 .../client/lib}/commands/SWAPDB.spec.ts | 0 .../client/lib}/commands/SWAPDB.ts | 0 .../client/lib}/commands/TIME.spec.ts | 10 +- {lib => packages/client/lib}/commands/TIME.ts | 0 .../client/lib}/commands/TOUCH.spec.ts | 0 .../client/lib}/commands/TOUCH.ts | 0 .../client/lib}/commands/TTL.spec.ts | 0 {lib => packages/client/lib}/commands/TTL.ts | 0 .../client/lib}/commands/TYPE.spec.ts | 0 {lib => packages/client/lib}/commands/TYPE.ts | 0 .../client/lib}/commands/UNLINK.spec.ts | 0 .../client/lib}/commands/UNLINK.ts | 0 .../client/lib}/commands/UNWATCH.spec.ts | 0 .../client/lib}/commands/UNWATCH.ts | 0 .../client/lib}/commands/WAIT.spec.ts | 0 {lib => packages/client/lib}/commands/WAIT.ts | 0 .../client/lib}/commands/WATCH.spec.ts | 0 .../client/lib}/commands/WATCH.ts | 0 .../client/lib}/commands/XACK.spec.ts | 0 {lib => packages/client/lib}/commands/XACK.ts | 0 .../client/lib}/commands/XADD.spec.ts | 0 {lib => packages/client/lib}/commands/XADD.ts | 0 .../client/lib}/commands/XAUTOCLAIM.spec.ts | 0 .../client/lib}/commands/XAUTOCLAIM.ts | 0 .../lib}/commands/XAUTOCLAIM_JUSTID.spec.ts | 0 .../client/lib}/commands/XAUTOCLAIM_JUSTID.ts | 0 .../client/lib}/commands/XCLAIM.spec.ts | 0 .../client/lib}/commands/XCLAIM.ts | 0 .../lib}/commands/XCLAIM_JUSTID.spec.ts | 0 .../client/lib}/commands/XCLAIM_JUSTID.ts | 0 .../client/lib}/commands/XDEL.spec.ts | 0 {lib => packages/client/lib}/commands/XDEL.ts | 0 .../lib}/commands/XGROUP_CREATE.spec.ts | 0 .../client/lib}/commands/XGROUP_CREATE.ts | 0 .../commands/XGROUP_CREATECONSUMER.spec.ts | 0 .../lib}/commands/XGROUP_CREATECONSUMER.ts | 0 .../lib}/commands/XGROUP_DELCONSUMER.spec.ts | 0 .../lib}/commands/XGROUP_DELCONSUMER.ts | 0 .../lib}/commands/XGROUP_DESTROY.spec.ts | 0 .../client/lib}/commands/XGROUP_DESTROY.ts | 0 .../client/lib}/commands/XGROUP_SETID.spec.ts | 0 .../client/lib}/commands/XGROUP_SETID.ts | 0 .../lib}/commands/XINFO_CONSUMERS.spec.ts | 0 .../client/lib}/commands/XINFO_CONSUMERS.ts | 0 .../client/lib}/commands/XINFO_GROUPS.spec.ts | 0 .../client/lib}/commands/XINFO_GROUPS.ts | 0 .../client/lib}/commands/XINFO_STREAM.spec.ts | 0 .../client/lib}/commands/XINFO_STREAM.ts | 0 .../client/lib}/commands/XLEN.spec.ts | 0 {lib => packages/client/lib}/commands/XLEN.ts | 0 .../client/lib}/commands/XPENDING.spec.ts | 0 .../client/lib}/commands/XPENDING.ts | 0 .../lib}/commands/XPENDING_RANGE.spec.ts | 0 .../client/lib}/commands/XPENDING_RANGE.ts | 0 .../client/lib}/commands/XRANGE.spec.ts | 0 .../client/lib}/commands/XRANGE.ts | 0 .../client/lib}/commands/XREAD.spec.ts | 0 .../client/lib}/commands/XREAD.ts | 0 .../client/lib}/commands/XREADGROUP.spec.ts | 0 .../client/lib}/commands/XREADGROUP.ts | 0 .../client/lib}/commands/XREVRANGE.spec.ts | 0 .../client/lib}/commands/XREVRANGE.ts | 0 .../client/lib}/commands/XTRIM.spec.ts | 0 .../client/lib}/commands/XTRIM.ts | 0 .../client/lib}/commands/ZADD.spec.ts | 0 {lib => packages/client/lib}/commands/ZADD.ts | 0 .../client/lib}/commands/ZCARD.spec.ts | 0 .../client/lib}/commands/ZCARD.ts | 0 .../client/lib}/commands/ZCOUNT.spec.ts | 0 .../client/lib}/commands/ZCOUNT.ts | 0 .../client/lib}/commands/ZDIFF.spec.ts | 0 .../client/lib}/commands/ZDIFF.ts | 0 .../client/lib}/commands/ZDIFFSTORE.spec.ts | 0 .../client/lib}/commands/ZDIFFSTORE.ts | 0 .../lib}/commands/ZDIFF_WITHSCORES.spec.ts | 0 .../client/lib}/commands/ZDIFF_WITHSCORES.ts | 0 .../client/lib}/commands/ZINCRBY.spec.ts | 0 .../client/lib}/commands/ZINCRBY.ts | 0 .../client/lib}/commands/ZINTER.spec.ts | 0 .../client/lib}/commands/ZINTER.ts | 0 .../client/lib}/commands/ZINTERSTORE.spec.ts | 0 .../client/lib}/commands/ZINTERSTORE.ts | 0 .../lib}/commands/ZINTER_WITHSCORES.spec.ts | 0 .../client/lib}/commands/ZINTER_WITHSCORES.ts | 0 .../client/lib}/commands/ZLEXCOUNT.spec.ts | 0 .../client/lib}/commands/ZLEXCOUNT.ts | 0 .../client/lib}/commands/ZMSCORE.spec.ts | 0 .../client/lib}/commands/ZMSCORE.ts | 0 .../client/lib}/commands/ZPOPMAX.spec.ts | 0 .../client/lib}/commands/ZPOPMAX.ts | 0 .../lib}/commands/ZPOPMAX_COUNT.spec.ts | 0 .../client/lib}/commands/ZPOPMAX_COUNT.ts | 0 .../client/lib}/commands/ZPOPMIN.spec.ts | 0 .../client/lib}/commands/ZPOPMIN.ts | 0 .../lib}/commands/ZPOPMIN_COUNT.spec.ts | 0 .../client/lib}/commands/ZPOPMIN_COUNT.ts | 0 .../client/lib}/commands/ZRANDMEMBER.spec.ts | 0 .../client/lib}/commands/ZRANDMEMBER.ts | 0 .../lib}/commands/ZRANDMEMBER_COUNT.spec.ts | 0 .../client/lib}/commands/ZRANDMEMBER_COUNT.ts | 0 .../ZRANDMEMBER_COUNT_WITHSCORES.spec.ts | 0 .../commands/ZRANDMEMBER_COUNT_WITHSCORES.ts | 0 .../client/lib}/commands/ZRANGE.spec.ts | 0 .../client/lib}/commands/ZRANGE.ts | 0 .../client/lib}/commands/ZRANGEBYLEX.spec.ts | 0 .../client/lib}/commands/ZRANGEBYLEX.ts | 0 .../lib}/commands/ZRANGEBYSCORE.spec.ts | 0 .../client/lib}/commands/ZRANGEBYSCORE.ts | 0 .../commands/ZRANGEBYSCORE_WITHSCORES.spec.ts | 0 .../lib}/commands/ZRANGEBYSCORE_WITHSCORES.ts | 0 .../client/lib}/commands/ZRANGESTORE.spec.ts | 0 .../client/lib}/commands/ZRANGESTORE.ts | 0 .../lib}/commands/ZRANGE_WITHSCORES.spec.ts | 0 .../client/lib}/commands/ZRANGE_WITHSCORES.ts | 0 .../client/lib}/commands/ZRANK.spec.ts | 0 .../client/lib}/commands/ZRANK.ts | 0 .../client/lib}/commands/ZREM.spec.ts | 0 {lib => packages/client/lib}/commands/ZREM.ts | 0 .../lib}/commands/ZREMRANGEBYLEX.spec.ts | 0 .../client/lib}/commands/ZREMRANGEBYLEX.ts | 0 .../lib}/commands/ZREMRANGEBYRANK.spec.ts | 0 .../client/lib}/commands/ZREMRANGEBYRANK.ts | 0 .../lib}/commands/ZREMRANGEBYSCORE.spec.ts | 0 .../client/lib}/commands/ZREMRANGEBYSCORE.ts | 0 .../client/lib}/commands/ZREVRANK.spec.ts | 0 .../client/lib}/commands/ZREVRANK.ts | 0 .../client/lib}/commands/ZSCAN.spec.ts | 0 .../client/lib}/commands/ZSCAN.ts | 0 .../client/lib}/commands/ZSCORE.spec.ts | 0 .../client/lib}/commands/ZSCORE.ts | 0 .../client/lib}/commands/ZUNION.spec.ts | 0 .../client/lib}/commands/ZUNION.ts | 0 .../client/lib}/commands/ZUNIONSTORE.spec.ts | 0 .../client/lib}/commands/ZUNIONSTORE.ts | 0 .../lib}/commands/ZUNION_WITHSCORES.spec.ts | 0 .../client/lib}/commands/ZUNION_WITHSCORES.ts | 0 .../commands/generic-transformers.spec.ts | 0 .../lib}/commands/generic-transformers.ts | 0 .../client/lib}/commands/index.ts | 0 {lib => packages/client/lib}/errors.ts | 0 {lib => packages/client/lib}/lua-script.ts | 0 .../client/lib}/multi-command.spec.ts | 0 {lib => packages/client/lib}/multi-command.ts | 0 .../client/lib/test-utils.ts | 4 +- .../ts-declarations/cluster-key-slot.d.ts | 0 .../lib}/ts-declarations/redis-parser.d.ts | 0 {lib => packages/client/lib}/utils.ts | 0 packages/client/package.json | 49 + packages/client/tsconfig.json | 27 + packages/json/.nycrc.json | 4 + packages/json/lib/commands/ARRAPPEND.spec.ts | 30 + packages/json/lib/commands/ARRAPPEND.ts | 15 + packages/json/lib/commands/ARRINDEX.spec.ts | 37 + packages/json/lib/commands/ARRINDEX.ts | 21 + packages/json/lib/commands/ARRINSERT.spec.ts | 30 + packages/json/lib/commands/ARRINSERT.ts | 15 + packages/json/lib/commands/ARRLEN.spec.ts | 30 + packages/json/lib/commands/ARRLEN.ts | 15 + packages/json/lib/commands/ARRPOP.spec.ts | 37 + packages/json/lib/commands/ARRPOP.ts | 17 + packages/json/lib/commands/ARRTRIM.spec.ts | 21 + packages/json/lib/commands/ARRTRIM.ts | 7 + .../json/lib/commands/DEBUG_MEMORY.spec.ts | 28 + packages/json/lib/commands/DEBUG_MEMORY.ts | 13 + packages/json/lib/commands/DEL.spec.ts | 28 + packages/json/lib/commands/DEL.ts | 13 + packages/json/lib/commands/FORGET.spec.ts | 28 + packages/json/lib/commands/FORGET.ts | 13 + packages/json/lib/commands/GET.spec.ts | 78 ++ packages/json/lib/commands/GET.ts | 41 + packages/json/lib/commands/MGET.spec.ts | 19 + packages/json/lib/commands/MGET.ts | 15 + packages/json/lib/commands/NUMINCRBY.spec.ts | 21 + packages/json/lib/commands/NUMINCRBY.ts | 7 + packages/json/lib/commands/NUMMULTBY.spec.ts | 21 + packages/json/lib/commands/NUMMULTBY.ts | 7 + packages/json/lib/commands/OBJKEYS.spec.ts | 28 + packages/json/lib/commands/OBJKEYS.ts | 13 + packages/json/lib/commands/OBJLEN.spec.ts | 28 + packages/json/lib/commands/OBJLEN.ts | 13 + packages/json/lib/commands/RESP.spec.ts | 28 + packages/json/lib/commands/RESP.ts | 15 + packages/json/lib/commands/SET.spec.ts | 35 + packages/json/lib/commands/SET.ts | 25 + packages/json/lib/commands/STRAPPEND.spec.ts | 30 + packages/json/lib/commands/STRAPPEND.ts | 21 + packages/json/lib/commands/STRLEN.spec.ts | 30 + packages/json/lib/commands/STRLEN.ts | 15 + packages/json/lib/commands/TYPE.spec.ts | 28 + packages/json/lib/commands/TYPE.ts | 13 + packages/json/lib/commands/index.ts | 94 ++ packages/json/lib/index.ts | 1 + packages/json/lib/test-utils.ts | 21 + packages/json/package.json | 24 + packages/json/tsconfig.json | 9 + packages/search/.nycrc.json | 4 + .../search/lib/commands/AGGREGATE.spec.ts | 482 ++++++++++ packages/search/lib/commands/AGGREGATE.ts | 283 ++++++ packages/search/lib/commands/ALIASADD.spec.ts | 11 + packages/search/lib/commands/ALIASADD.ts | 5 + packages/search/lib/commands/ALIASDEL.spec.ts | 11 + packages/search/lib/commands/ALIASDEL.ts | 5 + .../search/lib/commands/ALIASUPDATE.spec.ts | 11 + packages/search/lib/commands/ALIASUPDATE.ts | 5 + .../search/lib/commands/CONFIG_GET.spec.ts | 25 + packages/search/lib/commands/CONFIG_GET.ts | 16 + .../search/lib/commands/CONFIG_SET.spec.ts | 12 + packages/search/lib/commands/CONFIG_SET.ts | 5 + packages/search/lib/commands/CREATE.spec.ts | 347 +++++++ packages/search/lib/commands/CREATE.ts | 222 +++++ packages/search/lib/commands/DICTADD.spec.ts | 28 + packages/search/lib/commands/DICTADD.ts | 8 + packages/search/lib/commands/DICTDEL.spec.ts | 28 + packages/search/lib/commands/DICTDEL.ts | 8 + packages/search/lib/commands/DICTDUMP.spec.ts | 21 + packages/search/lib/commands/DICTDUMP.ts | 5 + .../search/lib/commands/DROPINDEX.spec.ts | 33 + packages/search/lib/commands/DROPINDEX.ts | 15 + packages/search/lib/commands/EXPLAIN.spec.ts | 11 + packages/search/lib/commands/EXPLAIN.ts | 7 + .../search/lib/commands/EXPLAINCLI.spec.ts | 11 + packages/search/lib/commands/EXPLAINCLI.ts | 7 + packages/search/lib/commands/INFO.spec.ts | 65 ++ packages/search/lib/commands/INFO.ts | 171 ++++ packages/search/lib/commands/PROFILE.ts | 26 + packages/search/lib/commands/SEARCH.spec.ts | 243 +++++ packages/search/lib/commands/SEARCH.ts | 202 +++++ .../search/lib/commands/SPELLCHECK.spec.ts | 71 ++ packages/search/lib/commands/SPELLCHECK.ts | 57 ++ packages/search/lib/commands/SUGADD.spec.ts | 35 + packages/search/lib/commands/SUGADD.ts | 20 + packages/search/lib/commands/SUGDEL.spec.ts | 19 + packages/search/lib/commands/SUGDEL.ts | 5 + packages/search/lib/commands/SUGGET.spec.ts | 46 + packages/search/lib/commands/SUGGET.ts | 22 + .../lib/commands/SUGGET_WITHPAYLOADS.spec.ts | 33 + .../lib/commands/SUGGET_WITHPAYLOADS.ts | 29 + .../lib/commands/SUGGET_WITHSCORES.spec.ts | 33 + .../search/lib/commands/SUGGET_WITHSCORES.ts | 29 + .../SUGGET_WITHSCORES_WITHPAYLOADS.spec.ts | 34 + .../SUGGET_WITHSCORES_WITHPAYLOADS.ts | 30 + packages/search/lib/commands/SUGLEN.spec.ts | 19 + packages/search/lib/commands/SUGLEN.ts | 7 + packages/search/lib/commands/SYNDUMP.spec.ts | 23 + packages/search/lib/commands/SYNDUMP.ts | 5 + .../search/lib/commands/SYNUPDATE.spec.ts | 39 + packages/search/lib/commands/SYNUPDATE.ts | 23 + packages/search/lib/commands/TAGVALS.spec.ts | 24 + packages/search/lib/commands/TAGVALS.ts | 5 + packages/search/lib/commands/_LIST.spec.ts | 19 + packages/search/lib/commands/_LIST.ts | 5 + packages/search/lib/commands/index.spec.ts | 46 + packages/search/lib/commands/index.ts | 133 +++ packages/search/lib/index.ts | 1 + packages/search/lib/test-utils.ts | 21 + packages/search/package.json | 24 + packages/search/tsconfig.json | 9 + packages/test-utils/docker/Dockerfile | 9 + packages/test-utils/docker/entrypoint.sh | 7 + .../test-utils/lib}/dockers.ts | 17 +- .../test-utils/lib/index.ts | 50 +- packages/test-utils/package.json | 27 + packages/test-utils/tsconfig.json | 9 + tsconfig.json | 28 +- 689 files changed, 5321 insertions(+), 1712 deletions(-) delete mode 100644 .github/workflows/benchmark.yml delete mode 100644 .npmignore delete mode 100644 .nycrc.json delete mode 100644 benchmark/.gitignore delete mode 100644 benchmark/index.js delete mode 100644 benchmark/package-lock.json delete mode 100644 benchmark/package.json create mode 100644 packages/all-in-one/index.ts create mode 100644 packages/all-in-one/package.json create mode 100644 packages/all-in-one/tsconfig.json rename .eslintrc.json => packages/client/.eslintrc.json (100%) create mode 100644 packages/client/.gitignore create mode 100644 packages/client/.npmignore create mode 100644 packages/client/.nycrc.json rename CHANGELOG.md => packages/client/CHANGELOG.md (100%) create mode 100644 packages/client/LICENSE create mode 100644 packages/client/README.md rename {docs => packages/client/docs}/FAQ.md (100%) rename {docs => packages/client/docs}/client-configuration.md (98%) rename {docs => packages/client/docs}/clustering.md (82%) rename {docs => packages/client/docs}/isolated-execution.md (100%) rename {docs => packages/client/docs}/v3-to-v4.md (100%) rename {examples => packages/client/examples}/README.md (100%) rename {examples => packages/client/examples}/blocking-list-pop.js (100%) rename {examples => packages/client/examples}/command-with-modifiers.js (100%) rename {examples => packages/client/examples}/connect-as-acl-user.js (100%) rename {examples => packages/client/examples}/lua-multi-incr.js (100%) rename {examples => packages/client/examples}/package-lock.json (100%) rename {examples => packages/client/examples}/package.json (64%) rename {examples => packages/client/examples}/set-scan.js (100%) rename index.ts => packages/client/index.ts (100%) rename {lib => packages/client/lib}/client/commands-queue.ts (100%) rename {lib => packages/client/lib}/client/commands.ts (100%) rename {lib => packages/client/lib}/client/index.spec.ts (98%) rename {lib => packages/client/lib}/client/index.ts (100%) rename {lib => packages/client/lib}/client/multi-command.ts (100%) rename {lib => packages/client/lib}/client/socket.spec.ts (100%) rename {lib => packages/client/lib}/client/socket.ts (100%) rename {lib => packages/client/lib}/cluster/cluster-slots.ts (100%) rename {lib => packages/client/lib}/cluster/commands.ts (100%) rename {lib => packages/client/lib}/cluster/index.spec.ts (51%) rename {lib => packages/client/lib}/cluster/index.ts (100%) rename {lib => packages/client/lib}/cluster/multi-command.ts (100%) rename {lib => packages/client/lib}/command-options.ts (100%) rename {lib => packages/client/lib}/commander.spec.ts (100%) rename {lib => packages/client/lib}/commander.ts (100%) rename {lib => packages/client/lib}/commands/ACL_CAT.spec.ts (100%) rename {lib => packages/client/lib}/commands/ACL_CAT.ts (100%) rename {lib => packages/client/lib}/commands/ACL_DELUSER.spec.ts (100%) rename {lib => packages/client/lib}/commands/ACL_DELUSER.ts (100%) rename {lib => packages/client/lib}/commands/ACL_GENPASS.spec.ts (100%) rename {lib => packages/client/lib}/commands/ACL_GENPASS.ts (100%) rename {lib => packages/client/lib}/commands/ACL_GETUSER.spec.ts (100%) rename {lib => packages/client/lib}/commands/ACL_GETUSER.ts (100%) rename {lib => packages/client/lib}/commands/ACL_LIST.spec.ts (100%) rename {lib => packages/client/lib}/commands/ACL_LIST.ts (100%) rename {lib => packages/client/lib}/commands/ACL_LOAD.spec.ts (100%) rename {lib => packages/client/lib}/commands/ACL_LOAD.ts (100%) rename {lib => packages/client/lib}/commands/ACL_LOG.spec.ts (100%) rename {lib => packages/client/lib}/commands/ACL_LOG.ts (100%) rename {lib => packages/client/lib}/commands/ACL_LOG_RESET.spec.ts (100%) rename {lib => packages/client/lib}/commands/ACL_LOG_RESET.ts (100%) rename {lib => packages/client/lib}/commands/ACL_SAVE.spec.ts (100%) rename {lib => packages/client/lib}/commands/ACL_SAVE.ts (100%) rename {lib => packages/client/lib}/commands/ACL_SETUSER.spec.ts (100%) rename {lib => packages/client/lib}/commands/ACL_SETUSER.ts (100%) rename {lib => packages/client/lib}/commands/ACL_USERS.spec.ts (100%) rename {lib => packages/client/lib}/commands/ACL_USERS.ts (100%) rename {lib => packages/client/lib}/commands/ACL_WHOAMI.spec.ts (100%) rename {lib => packages/client/lib}/commands/ACL_WHOAMI.ts (100%) rename {lib => packages/client/lib}/commands/APPEND.spec.ts (100%) rename {lib => packages/client/lib}/commands/APPEND.ts (100%) rename {lib => packages/client/lib}/commands/ASKING.spec.ts (100%) rename {lib => packages/client/lib}/commands/ASKING.ts (100%) rename {lib => packages/client/lib}/commands/AUTH.spec.ts (100%) rename {lib => packages/client/lib}/commands/AUTH.ts (100%) rename {lib => packages/client/lib}/commands/BGREWRITEAOF.spec.ts (100%) rename {lib => packages/client/lib}/commands/BGREWRITEAOF.ts (100%) rename {lib => packages/client/lib}/commands/BGSAVE.spec.ts (100%) rename {lib => packages/client/lib}/commands/BGSAVE.ts (100%) rename {lib => packages/client/lib}/commands/BITCOUNT.spec.ts (100%) rename {lib => packages/client/lib}/commands/BITCOUNT.ts (100%) rename {lib => packages/client/lib}/commands/BITFIELD.spec.ts (100%) rename {lib => packages/client/lib}/commands/BITFIELD.ts (100%) rename {lib => packages/client/lib}/commands/BITOP.spec.ts (100%) rename {lib => packages/client/lib}/commands/BITOP.ts (100%) rename {lib => packages/client/lib}/commands/BITPOS.spec.ts (100%) rename {lib => packages/client/lib}/commands/BITPOS.ts (100%) rename {lib => packages/client/lib}/commands/BLMOVE.spec.ts (100%) rename {lib => packages/client/lib}/commands/BLMOVE.ts (100%) rename {lib => packages/client/lib}/commands/BLPOP.spec.ts (100%) rename {lib => packages/client/lib}/commands/BLPOP.ts (100%) rename {lib => packages/client/lib}/commands/BRPOP.spec.ts (100%) rename {lib => packages/client/lib}/commands/BRPOP.ts (100%) rename {lib => packages/client/lib}/commands/BRPOPLPUSH.spec.ts (100%) rename {lib => packages/client/lib}/commands/BRPOPLPUSH.ts (100%) rename {lib => packages/client/lib}/commands/BZPOPMAX.spec.ts (100%) rename {lib => packages/client/lib}/commands/BZPOPMAX.ts (100%) rename {lib => packages/client/lib}/commands/BZPOPMIN.spec.ts (100%) rename {lib => packages/client/lib}/commands/BZPOPMIN.ts (100%) rename {lib => packages/client/lib}/commands/CLIENT_ID.spec.ts (100%) rename {lib => packages/client/lib}/commands/CLIENT_ID.ts (100%) rename {lib => packages/client/lib}/commands/CLIENT_INFO.spec.ts (100%) rename {lib => packages/client/lib}/commands/CLIENT_INFO.ts (100%) rename {lib => packages/client/lib}/commands/CLUSTER_ADDSLOTS.spec.ts (100%) rename {lib => packages/client/lib}/commands/CLUSTER_ADDSLOTS.ts (100%) rename {lib => packages/client/lib}/commands/CLUSTER_FLUSHSLOTS.spec.ts (100%) rename {lib => packages/client/lib}/commands/CLUSTER_FLUSHSLOTS.ts (100%) rename {lib => packages/client/lib}/commands/CLUSTER_GETKEYSINSLOT.spec.ts (100%) rename {lib => packages/client/lib}/commands/CLUSTER_GETKEYSINSLOT.ts (100%) rename {lib => packages/client/lib}/commands/CLUSTER_INFO.spec.ts (100%) rename {lib => packages/client/lib}/commands/CLUSTER_INFO.ts (100%) rename {lib => packages/client/lib}/commands/CLUSTER_MEET.spec.ts (100%) rename {lib => packages/client/lib}/commands/CLUSTER_MEET.ts (100%) rename {lib => packages/client/lib}/commands/CLUSTER_NODES.spec.ts (100%) rename {lib => packages/client/lib}/commands/CLUSTER_NODES.ts (100%) rename {lib => packages/client/lib}/commands/CLUSTER_RESET.spec.ts (100%) rename {lib => packages/client/lib}/commands/CLUSTER_RESET.ts (100%) rename {lib => packages/client/lib}/commands/CLUSTER_SETSLOT.spec.ts (100%) rename {lib => packages/client/lib}/commands/CLUSTER_SETSLOT.ts (100%) rename {lib => packages/client/lib}/commands/CLUSTER_SLOTS.spec.ts (100%) rename {lib => packages/client/lib}/commands/CLUSTER_SLOTS.ts (100%) rename {lib => packages/client/lib}/commands/COMMAND.spec.ts (65%) rename {lib => packages/client/lib}/commands/COMMAND.ts (100%) rename {lib => packages/client/lib}/commands/COMMAND_COUNT.spec.ts (100%) rename {lib => packages/client/lib}/commands/COMMAND_COUNT.ts (100%) rename {lib => packages/client/lib}/commands/COMMAND_GETKEYS.spec.ts (100%) rename {lib => packages/client/lib}/commands/COMMAND_GETKEYS.ts (100%) rename {lib => packages/client/lib}/commands/COMMAND_INFO.spec.ts (100%) rename {lib => packages/client/lib}/commands/COMMAND_INFO.ts (100%) rename {lib => packages/client/lib}/commands/CONFIG_GET.spec.ts (100%) rename {lib => packages/client/lib}/commands/CONFIG_GET.ts (100%) rename {lib => packages/client/lib}/commands/CONFIG_RESETSTAT.spec.ts (100%) rename {lib => packages/client/lib}/commands/CONFIG_RESETSTAT.ts (100%) rename {lib => packages/client/lib}/commands/CONFIG_REWRITE.spec.ts (100%) rename {lib => packages/client/lib}/commands/CONFIG_REWRITE.ts (100%) rename {lib => packages/client/lib}/commands/CONFIG_SET.spec.ts (100%) rename {lib => packages/client/lib}/commands/CONFIG_SET.ts (100%) rename {lib => packages/client/lib}/commands/COPY.spec.ts (100%) rename {lib => packages/client/lib}/commands/COPY.ts (100%) rename {lib => packages/client/lib}/commands/DBSIZE.spec.ts (100%) rename {lib => packages/client/lib}/commands/DBSIZE.ts (100%) rename {lib => packages/client/lib}/commands/DECR.spec.ts (100%) rename {lib => packages/client/lib}/commands/DECR.ts (100%) rename {lib => packages/client/lib}/commands/DECRBY.spec.ts (100%) rename {lib => packages/client/lib}/commands/DECRBY.ts (100%) rename {lib => packages/client/lib}/commands/DEL.spec.ts (100%) rename {lib => packages/client/lib}/commands/DEL.ts (100%) rename {lib => packages/client/lib}/commands/DISCARD.spec.ts (100%) rename {lib => packages/client/lib}/commands/DISCARD.ts (100%) rename {lib => packages/client/lib}/commands/DUMP.spec.ts (100%) rename {lib => packages/client/lib}/commands/DUMP.ts (100%) rename {lib => packages/client/lib}/commands/ECHO.spec.ts (100%) rename {lib => packages/client/lib}/commands/ECHO.ts (100%) rename {lib => packages/client/lib}/commands/EVAL.spec.ts (100%) rename {lib => packages/client/lib}/commands/EVAL.ts (100%) rename {lib => packages/client/lib}/commands/EVALSHA.spec.ts (100%) rename {lib => packages/client/lib}/commands/EVALSHA.ts (100%) rename {lib => packages/client/lib}/commands/EXISTS.spec.ts (100%) rename {lib => packages/client/lib}/commands/EXISTS.ts (100%) rename {lib => packages/client/lib}/commands/EXPIRE.spec.ts (100%) rename {lib => packages/client/lib}/commands/EXPIRE.ts (100%) rename {lib => packages/client/lib}/commands/EXPIREAT.spec.ts (100%) rename {lib => packages/client/lib}/commands/EXPIREAT.ts (100%) rename {lib => packages/client/lib}/commands/FAILOVER.spec.ts (100%) rename {lib => packages/client/lib}/commands/FAILOVER.ts (100%) rename {lib => packages/client/lib}/commands/FLUSHALL.spec.ts (100%) rename {lib => packages/client/lib}/commands/FLUSHALL.ts (100%) rename {lib => packages/client/lib}/commands/FLUSHDB.spec.ts (100%) rename {lib => packages/client/lib}/commands/FLUSHDB.ts (100%) rename {lib => packages/client/lib}/commands/GEOADD.spec.ts (100%) rename {lib => packages/client/lib}/commands/GEOADD.ts (100%) rename {lib => packages/client/lib}/commands/GEODIST.spec.ts (100%) rename {lib => packages/client/lib}/commands/GEODIST.ts (100%) rename {lib => packages/client/lib}/commands/GEOHASH.spec.ts (100%) rename {lib => packages/client/lib}/commands/GEOHASH.ts (100%) rename {lib => packages/client/lib}/commands/GEOPOS.spec.ts (100%) rename {lib => packages/client/lib}/commands/GEOPOS.ts (100%) rename {lib => packages/client/lib}/commands/GEOSEARCH.spec.ts (100%) rename {lib => packages/client/lib}/commands/GEOSEARCH.ts (100%) rename {lib => packages/client/lib}/commands/GEOSEARCHSTORE.spec.ts (100%) rename {lib => packages/client/lib}/commands/GEOSEARCHSTORE.ts (100%) rename {lib => packages/client/lib}/commands/GEOSEARCH_WITH.spec.ts (100%) rename {lib => packages/client/lib}/commands/GEOSEARCH_WITH.ts (100%) rename {lib => packages/client/lib}/commands/GET.spec.ts (100%) rename {lib => packages/client/lib}/commands/GET.ts (100%) rename {lib => packages/client/lib}/commands/GETBIT.spec.ts (100%) rename {lib => packages/client/lib}/commands/GETBIT.ts (100%) rename {lib => packages/client/lib}/commands/GETDEL.spec.ts (100%) rename {lib => packages/client/lib}/commands/GETDEL.ts (100%) rename {lib => packages/client/lib}/commands/GETEX.spec.ts (100%) rename {lib => packages/client/lib}/commands/GETEX.ts (100%) rename {lib => packages/client/lib}/commands/GETRANGE.spec.ts (100%) rename {lib => packages/client/lib}/commands/GETRANGE.ts (100%) rename {lib => packages/client/lib}/commands/GETSET.spec.ts (100%) rename {lib => packages/client/lib}/commands/GETSET.ts (100%) rename {lib => packages/client/lib}/commands/GET_BUFFER.spec.ts (100%) rename {lib => packages/client/lib}/commands/GET_BUFFER.ts (100%) rename {lib => packages/client/lib}/commands/HDEL.spec.ts (100%) rename {lib => packages/client/lib}/commands/HDEL.ts (100%) rename {lib => packages/client/lib}/commands/HELLO.spec.ts (100%) rename {lib => packages/client/lib}/commands/HELLO.ts (100%) rename {lib => packages/client/lib}/commands/HEXISTS.spec.ts (100%) rename {lib => packages/client/lib}/commands/HEXISTS.ts (100%) rename {lib => packages/client/lib}/commands/HGET.spec.ts (100%) rename {lib => packages/client/lib}/commands/HGET.ts (100%) rename {lib => packages/client/lib}/commands/HGETALL.spec.ts (100%) rename {lib => packages/client/lib}/commands/HGETALL.ts (100%) rename {lib => packages/client/lib}/commands/HINCRBY.spec.ts (100%) rename {lib => packages/client/lib}/commands/HINCRBY.ts (100%) rename {lib => packages/client/lib}/commands/HINCRBYFLOAT.spec.ts (100%) rename {lib => packages/client/lib}/commands/HINCRBYFLOAT.ts (100%) rename {lib => packages/client/lib}/commands/HKEYS.spec.ts (100%) rename {lib => packages/client/lib}/commands/HKEYS.ts (100%) rename {lib => packages/client/lib}/commands/HLEN.spec.ts (100%) rename {lib => packages/client/lib}/commands/HLEN.ts (100%) rename {lib => packages/client/lib}/commands/HMGET.spec.ts (100%) rename {lib => packages/client/lib}/commands/HMGET.ts (100%) rename {lib => packages/client/lib}/commands/HRANDFIELD.spec.ts (100%) rename {lib => packages/client/lib}/commands/HRANDFIELD.ts (100%) rename {lib => packages/client/lib}/commands/HRANDFIELD_COUNT.spec.ts (100%) rename {lib => packages/client/lib}/commands/HRANDFIELD_COUNT.ts (100%) rename {lib => packages/client/lib}/commands/HRANDFIELD_COUNT_WITHVALUES.spec.ts (100%) rename {lib => packages/client/lib}/commands/HRANDFIELD_COUNT_WITHVALUES.ts (100%) rename {lib => packages/client/lib}/commands/HSCAN.spec.ts (100%) rename {lib => packages/client/lib}/commands/HSCAN.ts (100%) rename {lib => packages/client/lib}/commands/HSET.spec.ts (100%) rename {lib => packages/client/lib}/commands/HSET.ts (100%) rename {lib => packages/client/lib}/commands/HSETNX.spec.ts (100%) rename {lib => packages/client/lib}/commands/HSETNX.ts (100%) rename {lib => packages/client/lib}/commands/HSTRLEN.spec.ts (100%) rename {lib => packages/client/lib}/commands/HSTRLEN.ts (100%) rename {lib => packages/client/lib}/commands/HVALS.spec.ts (100%) rename {lib => packages/client/lib}/commands/HVALS.ts (100%) rename {lib => packages/client/lib}/commands/INCR.spec.ts (100%) rename {lib => packages/client/lib}/commands/INCR.ts (100%) rename {lib => packages/client/lib}/commands/INCRBY.spec.ts (100%) rename {lib => packages/client/lib}/commands/INCRBY.ts (100%) rename {lib => packages/client/lib}/commands/INCRBYFLOAT.spec.ts (100%) rename {lib => packages/client/lib}/commands/INCRBYFLOAT.ts (100%) rename {lib => packages/client/lib}/commands/INFO.spec.ts (100%) rename {lib => packages/client/lib}/commands/INFO.ts (100%) rename {lib => packages/client/lib}/commands/KEYS.spec.ts (100%) rename {lib => packages/client/lib}/commands/KEYS.ts (100%) rename {lib => packages/client/lib}/commands/LASTSAVE.spec.ts (100%) rename {lib => packages/client/lib}/commands/LASTSAVE.ts (100%) rename {lib => packages/client/lib}/commands/LINDEX.spec.ts (100%) rename {lib => packages/client/lib}/commands/LINDEX.ts (100%) rename {lib => packages/client/lib}/commands/LINSERT.spec.ts (100%) rename {lib => packages/client/lib}/commands/LINSERT.ts (100%) rename {lib => packages/client/lib}/commands/LLEN.spec.ts (100%) rename {lib => packages/client/lib}/commands/LLEN.ts (100%) rename {lib => packages/client/lib}/commands/LMOVE.spec.ts (100%) rename {lib => packages/client/lib}/commands/LMOVE.ts (100%) rename {lib => packages/client/lib}/commands/LOLWUT.spec.ts (100%) rename {lib => packages/client/lib}/commands/LOLWUT.ts (100%) rename {lib => packages/client/lib}/commands/LPOP.spec.ts (100%) rename {lib => packages/client/lib}/commands/LPOP.ts (100%) rename {lib => packages/client/lib}/commands/LPOP_COUNT.spec.ts (100%) rename {lib => packages/client/lib}/commands/LPOP_COUNT.ts (100%) rename {lib => packages/client/lib}/commands/LPOS.spec.ts (100%) rename {lib => packages/client/lib}/commands/LPOS.ts (100%) rename {lib => packages/client/lib}/commands/LPOS_COUNT.spec.ts (100%) rename {lib => packages/client/lib}/commands/LPOS_COUNT.ts (100%) rename {lib => packages/client/lib}/commands/LPUSH.spec.ts (100%) rename {lib => packages/client/lib}/commands/LPUSH.ts (100%) rename {lib => packages/client/lib}/commands/LPUSHX.spec.ts (100%) rename {lib => packages/client/lib}/commands/LPUSHX.ts (100%) rename {lib => packages/client/lib}/commands/LRANGE.spec.ts (100%) rename {lib => packages/client/lib}/commands/LRANGE.ts (100%) rename {lib => packages/client/lib}/commands/LREM.spec.ts (100%) rename {lib => packages/client/lib}/commands/LREM.ts (100%) rename {lib => packages/client/lib}/commands/LSET.spec.ts (100%) rename {lib => packages/client/lib}/commands/LSET.ts (100%) rename {lib => packages/client/lib}/commands/LTRIM.spec.ts (100%) rename {lib => packages/client/lib}/commands/LTRIM.ts (100%) rename {lib => packages/client/lib}/commands/MEMORY_DOCTOR.spec.ts (100%) rename {lib => packages/client/lib}/commands/MEMORY_DOCTOR.ts (100%) rename {lib => packages/client/lib}/commands/MEMORY_MALLOC-STATS.spec.ts (100%) rename {lib => packages/client/lib}/commands/MEMORY_MALLOC-STATS.ts (100%) rename {lib => packages/client/lib}/commands/MEMORY_PURGE.spec.ts (100%) rename {lib => packages/client/lib}/commands/MEMORY_PURGE.ts (100%) rename {lib => packages/client/lib}/commands/MEMORY_STATS.spec.ts (100%) rename {lib => packages/client/lib}/commands/MEMORY_STATS.ts (100%) rename {lib => packages/client/lib}/commands/MEMORY_USAGE.spec.ts (100%) rename {lib => packages/client/lib}/commands/MEMORY_USAGE.ts (100%) rename {lib => packages/client/lib}/commands/MGET.spec.ts (100%) rename {lib => packages/client/lib}/commands/MGET.ts (100%) rename {lib => packages/client/lib}/commands/MIGRATE.spec.ts (100%) rename {lib => packages/client/lib}/commands/MIGRATE.ts (100%) rename {lib => packages/client/lib}/commands/MODULE_LIST.spec.ts (100%) rename {lib => packages/client/lib}/commands/MODULE_LIST.ts (100%) rename {lib => packages/client/lib}/commands/MODULE_LOAD.spec.ts (100%) rename {lib => packages/client/lib}/commands/MODULE_LOAD.ts (100%) rename {lib => packages/client/lib}/commands/MODULE_UNLOAD.spec.ts (100%) rename {lib => packages/client/lib}/commands/MODULE_UNLOAD.ts (100%) rename {lib => packages/client/lib}/commands/MOVE.spec.ts (100%) rename {lib => packages/client/lib}/commands/MOVE.ts (100%) rename {lib => packages/client/lib}/commands/MSET.spec.ts (100%) rename {lib => packages/client/lib}/commands/MSET.ts (100%) rename {lib => packages/client/lib}/commands/MSETNX.spec.ts (100%) rename {lib => packages/client/lib}/commands/MSETNX.ts (100%) rename {lib => packages/client/lib}/commands/PERSIST.spec.ts (100%) rename {lib => packages/client/lib}/commands/PERSIST.ts (100%) rename {lib => packages/client/lib}/commands/PEXPIRE.spec.ts (100%) rename {lib => packages/client/lib}/commands/PEXPIRE.ts (100%) rename {lib => packages/client/lib}/commands/PEXPIREAT.spec.ts (100%) rename {lib => packages/client/lib}/commands/PEXPIREAT.ts (100%) rename {lib => packages/client/lib}/commands/PFADD.spec.ts (100%) rename {lib => packages/client/lib}/commands/PFADD.ts (100%) rename {lib => packages/client/lib}/commands/PFCOUNT.spec.ts (100%) rename {lib => packages/client/lib}/commands/PFCOUNT.ts (100%) rename {lib => packages/client/lib}/commands/PFMERGE.spec.ts (100%) rename {lib => packages/client/lib}/commands/PFMERGE.ts (100%) rename {lib => packages/client/lib}/commands/PING.spec.ts (100%) rename {lib => packages/client/lib}/commands/PING.ts (100%) rename {lib => packages/client/lib}/commands/PSETEX.spec.ts (100%) rename {lib => packages/client/lib}/commands/PSETEX.ts (100%) rename {lib => packages/client/lib}/commands/PTTL.spec.ts (100%) rename {lib => packages/client/lib}/commands/PTTL.ts (100%) rename {lib => packages/client/lib}/commands/PUBLISH.spec.ts (100%) rename {lib => packages/client/lib}/commands/PUBLISH.ts (100%) rename {lib => packages/client/lib}/commands/PUBSUB_CHANNELS.spec.ts (100%) rename {lib => packages/client/lib}/commands/PUBSUB_CHANNELS.ts (100%) rename {lib => packages/client/lib}/commands/PUBSUB_NUMPAT.spec.ts (100%) rename {lib => packages/client/lib}/commands/PUBSUB_NUMPAT.ts (100%) rename {lib => packages/client/lib}/commands/PUBSUB_NUMSUB.spec.ts (100%) rename {lib => packages/client/lib}/commands/PUBSUB_NUMSUB.ts (100%) rename {lib => packages/client/lib}/commands/RANDOMKEY.spec.ts (100%) rename {lib => packages/client/lib}/commands/RANDOMKEY.ts (100%) rename {lib => packages/client/lib}/commands/READONLY.spec.ts (100%) rename {lib => packages/client/lib}/commands/READONLY.ts (100%) rename {lib => packages/client/lib}/commands/READWRITE.spec.ts (100%) rename {lib => packages/client/lib}/commands/READWRITE.ts (100%) rename {lib => packages/client/lib}/commands/RENAME.spec.ts (100%) rename {lib => packages/client/lib}/commands/RENAME.ts (100%) rename {lib => packages/client/lib}/commands/RENAMENX.spec.ts (100%) rename {lib => packages/client/lib}/commands/RENAMENX.ts (100%) rename {lib => packages/client/lib}/commands/REPLICAOF.spec.ts (100%) rename {lib => packages/client/lib}/commands/REPLICAOF.ts (100%) rename {lib => packages/client/lib}/commands/RESTORE-ASKING.spec.ts (100%) rename {lib => packages/client/lib}/commands/RESTORE-ASKING.ts (100%) rename {lib => packages/client/lib}/commands/ROLE.spec.ts (100%) rename {lib => packages/client/lib}/commands/ROLE.ts (100%) rename {lib => packages/client/lib}/commands/RPOP.spec.ts (100%) rename {lib => packages/client/lib}/commands/RPOP.ts (100%) rename {lib => packages/client/lib}/commands/RPOPLPUSH.spec.ts (100%) rename {lib => packages/client/lib}/commands/RPOPLPUSH.ts (100%) rename {lib => packages/client/lib}/commands/RPOP_COUNT.spec.ts (100%) rename {lib => packages/client/lib}/commands/RPOP_COUNT.ts (100%) rename {lib => packages/client/lib}/commands/RPUSH.spec.ts (100%) rename {lib => packages/client/lib}/commands/RPUSH.ts (100%) rename {lib => packages/client/lib}/commands/RPUSHX.spec.ts (100%) rename {lib => packages/client/lib}/commands/RPUSHX.ts (100%) rename {lib => packages/client/lib}/commands/SADD.spec.ts (100%) rename {lib => packages/client/lib}/commands/SADD.ts (100%) rename {lib => packages/client/lib}/commands/SAVE.spec.ts (100%) rename {lib => packages/client/lib}/commands/SAVE.ts (100%) rename {lib => packages/client/lib}/commands/SCAN.spec.ts (100%) rename {lib => packages/client/lib}/commands/SCAN.ts (100%) rename {lib => packages/client/lib}/commands/SCARD.spec.ts (100%) rename {lib => packages/client/lib}/commands/SCARD.ts (100%) rename {lib => packages/client/lib}/commands/SCRIPT_DEBUG.spec.ts (100%) rename {lib => packages/client/lib}/commands/SCRIPT_DEBUG.ts (100%) rename {lib => packages/client/lib}/commands/SCRIPT_EXISTS.spec.ts (100%) rename {lib => packages/client/lib}/commands/SCRIPT_EXISTS.ts (100%) rename {lib => packages/client/lib}/commands/SCRIPT_FLUSH.spec.ts (100%) rename {lib => packages/client/lib}/commands/SCRIPT_FLUSH.ts (100%) rename {lib => packages/client/lib}/commands/SCRIPT_KILL.spec.ts (100%) rename {lib => packages/client/lib}/commands/SCRIPT_KILL.ts (100%) rename {lib => packages/client/lib}/commands/SCRIPT_LOAD.spec.ts (100%) rename {lib => packages/client/lib}/commands/SCRIPT_LOAD.ts (100%) rename {lib => packages/client/lib}/commands/SDIFF.spec.ts (100%) rename {lib => packages/client/lib}/commands/SDIFF.ts (100%) rename {lib => packages/client/lib}/commands/SDIFFSTORE.spec.ts (100%) rename {lib => packages/client/lib}/commands/SDIFFSTORE.ts (100%) rename {lib => packages/client/lib}/commands/SET.spec.ts (100%) rename {lib => packages/client/lib}/commands/SET.ts (100%) rename {lib => packages/client/lib}/commands/SETBIT.spec.ts (100%) rename {lib => packages/client/lib}/commands/SETBIT.ts (100%) rename {lib => packages/client/lib}/commands/SETEX.spec.ts (100%) rename {lib => packages/client/lib}/commands/SETEX.ts (100%) rename {lib => packages/client/lib}/commands/SETNX .spec.ts (100%) rename {lib => packages/client/lib}/commands/SETNX.ts (100%) rename {lib => packages/client/lib}/commands/SETRANGE.spec.ts (100%) rename {lib => packages/client/lib}/commands/SETRANGE.ts (100%) rename {lib => packages/client/lib}/commands/SHUTDOWN.spec.ts (100%) rename {lib => packages/client/lib}/commands/SHUTDOWN.ts (100%) rename {lib => packages/client/lib}/commands/SINTER.spec.ts (100%) rename {lib => packages/client/lib}/commands/SINTER.ts (100%) rename {lib => packages/client/lib}/commands/SINTERSTORE.spec.ts (100%) rename {lib => packages/client/lib}/commands/SINTERSTORE.ts (100%) rename {lib => packages/client/lib}/commands/SISMEMBER.spec.ts (100%) rename {lib => packages/client/lib}/commands/SISMEMBER.ts (100%) rename {lib => packages/client/lib}/commands/SMEMBERS.spec.ts (100%) rename {lib => packages/client/lib}/commands/SMEMBERS.ts (100%) rename {lib => packages/client/lib}/commands/SMISMEMBER.spec.ts (100%) rename {lib => packages/client/lib}/commands/SMISMEMBER.ts (100%) rename {lib => packages/client/lib}/commands/SMOVE.spec.ts (100%) rename {lib => packages/client/lib}/commands/SMOVE.ts (100%) rename {lib => packages/client/lib}/commands/SORT.spec.ts (100%) rename {lib => packages/client/lib}/commands/SORT.ts (100%) rename {lib => packages/client/lib}/commands/SPOP.spec.ts (100%) rename {lib => packages/client/lib}/commands/SPOP.ts (100%) rename {lib => packages/client/lib}/commands/SRANDMEMBER.spec.ts (100%) rename {lib => packages/client/lib}/commands/SRANDMEMBER.ts (100%) rename {lib => packages/client/lib}/commands/SRANDMEMBER_COUNT.spec.ts (100%) rename {lib => packages/client/lib}/commands/SRANDMEMBER_COUNT.ts (100%) rename {lib => packages/client/lib}/commands/SREM.spec.ts (100%) rename {lib => packages/client/lib}/commands/SREM.ts (100%) rename {lib => packages/client/lib}/commands/SSCAN.spec.ts (100%) rename {lib => packages/client/lib}/commands/SSCAN.ts (100%) rename {lib => packages/client/lib}/commands/STRLEN.spec.ts (100%) rename {lib => packages/client/lib}/commands/STRLEN.ts (100%) rename {lib => packages/client/lib}/commands/SUNION.spec.ts (100%) rename {lib => packages/client/lib}/commands/SUNION.ts (100%) rename {lib => packages/client/lib}/commands/SUNIONSTORE.spec.ts (100%) rename {lib => packages/client/lib}/commands/SUNIONSTORE.ts (100%) rename {lib => packages/client/lib}/commands/SWAPDB.spec.ts (100%) rename {lib => packages/client/lib}/commands/SWAPDB.ts (100%) rename {lib => packages/client/lib}/commands/TIME.spec.ts (55%) rename {lib => packages/client/lib}/commands/TIME.ts (100%) rename {lib => packages/client/lib}/commands/TOUCH.spec.ts (100%) rename {lib => packages/client/lib}/commands/TOUCH.ts (100%) rename {lib => packages/client/lib}/commands/TTL.spec.ts (100%) rename {lib => packages/client/lib}/commands/TTL.ts (100%) rename {lib => packages/client/lib}/commands/TYPE.spec.ts (100%) rename {lib => packages/client/lib}/commands/TYPE.ts (100%) rename {lib => packages/client/lib}/commands/UNLINK.spec.ts (100%) rename {lib => packages/client/lib}/commands/UNLINK.ts (100%) rename {lib => packages/client/lib}/commands/UNWATCH.spec.ts (100%) rename {lib => packages/client/lib}/commands/UNWATCH.ts (100%) rename {lib => packages/client/lib}/commands/WAIT.spec.ts (100%) rename {lib => packages/client/lib}/commands/WAIT.ts (100%) rename {lib => packages/client/lib}/commands/WATCH.spec.ts (100%) rename {lib => packages/client/lib}/commands/WATCH.ts (100%) rename {lib => packages/client/lib}/commands/XACK.spec.ts (100%) rename {lib => packages/client/lib}/commands/XACK.ts (100%) rename {lib => packages/client/lib}/commands/XADD.spec.ts (100%) rename {lib => packages/client/lib}/commands/XADD.ts (100%) rename {lib => packages/client/lib}/commands/XAUTOCLAIM.spec.ts (100%) rename {lib => packages/client/lib}/commands/XAUTOCLAIM.ts (100%) rename {lib => packages/client/lib}/commands/XAUTOCLAIM_JUSTID.spec.ts (100%) rename {lib => packages/client/lib}/commands/XAUTOCLAIM_JUSTID.ts (100%) rename {lib => packages/client/lib}/commands/XCLAIM.spec.ts (100%) rename {lib => packages/client/lib}/commands/XCLAIM.ts (100%) rename {lib => packages/client/lib}/commands/XCLAIM_JUSTID.spec.ts (100%) rename {lib => packages/client/lib}/commands/XCLAIM_JUSTID.ts (100%) rename {lib => packages/client/lib}/commands/XDEL.spec.ts (100%) rename {lib => packages/client/lib}/commands/XDEL.ts (100%) rename {lib => packages/client/lib}/commands/XGROUP_CREATE.spec.ts (100%) rename {lib => packages/client/lib}/commands/XGROUP_CREATE.ts (100%) rename {lib => packages/client/lib}/commands/XGROUP_CREATECONSUMER.spec.ts (100%) rename {lib => packages/client/lib}/commands/XGROUP_CREATECONSUMER.ts (100%) rename {lib => packages/client/lib}/commands/XGROUP_DELCONSUMER.spec.ts (100%) rename {lib => packages/client/lib}/commands/XGROUP_DELCONSUMER.ts (100%) rename {lib => packages/client/lib}/commands/XGROUP_DESTROY.spec.ts (100%) rename {lib => packages/client/lib}/commands/XGROUP_DESTROY.ts (100%) rename {lib => packages/client/lib}/commands/XGROUP_SETID.spec.ts (100%) rename {lib => packages/client/lib}/commands/XGROUP_SETID.ts (100%) rename {lib => packages/client/lib}/commands/XINFO_CONSUMERS.spec.ts (100%) rename {lib => packages/client/lib}/commands/XINFO_CONSUMERS.ts (100%) rename {lib => packages/client/lib}/commands/XINFO_GROUPS.spec.ts (100%) rename {lib => packages/client/lib}/commands/XINFO_GROUPS.ts (100%) rename {lib => packages/client/lib}/commands/XINFO_STREAM.spec.ts (100%) rename {lib => packages/client/lib}/commands/XINFO_STREAM.ts (100%) rename {lib => packages/client/lib}/commands/XLEN.spec.ts (100%) rename {lib => packages/client/lib}/commands/XLEN.ts (100%) rename {lib => packages/client/lib}/commands/XPENDING.spec.ts (100%) rename {lib => packages/client/lib}/commands/XPENDING.ts (100%) rename {lib => packages/client/lib}/commands/XPENDING_RANGE.spec.ts (100%) rename {lib => packages/client/lib}/commands/XPENDING_RANGE.ts (100%) rename {lib => packages/client/lib}/commands/XRANGE.spec.ts (100%) rename {lib => packages/client/lib}/commands/XRANGE.ts (100%) rename {lib => packages/client/lib}/commands/XREAD.spec.ts (100%) rename {lib => packages/client/lib}/commands/XREAD.ts (100%) rename {lib => packages/client/lib}/commands/XREADGROUP.spec.ts (100%) rename {lib => packages/client/lib}/commands/XREADGROUP.ts (100%) rename {lib => packages/client/lib}/commands/XREVRANGE.spec.ts (100%) rename {lib => packages/client/lib}/commands/XREVRANGE.ts (100%) rename {lib => packages/client/lib}/commands/XTRIM.spec.ts (100%) rename {lib => packages/client/lib}/commands/XTRIM.ts (100%) rename {lib => packages/client/lib}/commands/ZADD.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZADD.ts (100%) rename {lib => packages/client/lib}/commands/ZCARD.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZCARD.ts (100%) rename {lib => packages/client/lib}/commands/ZCOUNT.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZCOUNT.ts (100%) rename {lib => packages/client/lib}/commands/ZDIFF.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZDIFF.ts (100%) rename {lib => packages/client/lib}/commands/ZDIFFSTORE.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZDIFFSTORE.ts (100%) rename {lib => packages/client/lib}/commands/ZDIFF_WITHSCORES.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZDIFF_WITHSCORES.ts (100%) rename {lib => packages/client/lib}/commands/ZINCRBY.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZINCRBY.ts (100%) rename {lib => packages/client/lib}/commands/ZINTER.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZINTER.ts (100%) rename {lib => packages/client/lib}/commands/ZINTERSTORE.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZINTERSTORE.ts (100%) rename {lib => packages/client/lib}/commands/ZINTER_WITHSCORES.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZINTER_WITHSCORES.ts (100%) rename {lib => packages/client/lib}/commands/ZLEXCOUNT.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZLEXCOUNT.ts (100%) rename {lib => packages/client/lib}/commands/ZMSCORE.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZMSCORE.ts (100%) rename {lib => packages/client/lib}/commands/ZPOPMAX.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZPOPMAX.ts (100%) rename {lib => packages/client/lib}/commands/ZPOPMAX_COUNT.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZPOPMAX_COUNT.ts (100%) rename {lib => packages/client/lib}/commands/ZPOPMIN.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZPOPMIN.ts (100%) rename {lib => packages/client/lib}/commands/ZPOPMIN_COUNT.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZPOPMIN_COUNT.ts (100%) rename {lib => packages/client/lib}/commands/ZRANDMEMBER.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZRANDMEMBER.ts (100%) rename {lib => packages/client/lib}/commands/ZRANDMEMBER_COUNT.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZRANDMEMBER_COUNT.ts (100%) rename {lib => packages/client/lib}/commands/ZRANDMEMBER_COUNT_WITHSCORES.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZRANDMEMBER_COUNT_WITHSCORES.ts (100%) rename {lib => packages/client/lib}/commands/ZRANGE.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZRANGE.ts (100%) rename {lib => packages/client/lib}/commands/ZRANGEBYLEX.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZRANGEBYLEX.ts (100%) rename {lib => packages/client/lib}/commands/ZRANGEBYSCORE.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZRANGEBYSCORE.ts (100%) rename {lib => packages/client/lib}/commands/ZRANGEBYSCORE_WITHSCORES.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZRANGEBYSCORE_WITHSCORES.ts (100%) rename {lib => packages/client/lib}/commands/ZRANGESTORE.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZRANGESTORE.ts (100%) rename {lib => packages/client/lib}/commands/ZRANGE_WITHSCORES.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZRANGE_WITHSCORES.ts (100%) rename {lib => packages/client/lib}/commands/ZRANK.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZRANK.ts (100%) rename {lib => packages/client/lib}/commands/ZREM.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZREM.ts (100%) rename {lib => packages/client/lib}/commands/ZREMRANGEBYLEX.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZREMRANGEBYLEX.ts (100%) rename {lib => packages/client/lib}/commands/ZREMRANGEBYRANK.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZREMRANGEBYRANK.ts (100%) rename {lib => packages/client/lib}/commands/ZREMRANGEBYSCORE.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZREMRANGEBYSCORE.ts (100%) rename {lib => packages/client/lib}/commands/ZREVRANK.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZREVRANK.ts (100%) rename {lib => packages/client/lib}/commands/ZSCAN.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZSCAN.ts (100%) rename {lib => packages/client/lib}/commands/ZSCORE.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZSCORE.ts (100%) rename {lib => packages/client/lib}/commands/ZUNION.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZUNION.ts (100%) rename {lib => packages/client/lib}/commands/ZUNIONSTORE.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZUNIONSTORE.ts (100%) rename {lib => packages/client/lib}/commands/ZUNION_WITHSCORES.spec.ts (100%) rename {lib => packages/client/lib}/commands/ZUNION_WITHSCORES.ts (100%) rename {lib => packages/client/lib}/commands/generic-transformers.spec.ts (100%) rename {lib => packages/client/lib}/commands/generic-transformers.ts (100%) rename {lib => packages/client/lib}/commands/index.ts (100%) rename {lib => packages/client/lib}/errors.ts (100%) rename {lib => packages/client/lib}/lua-script.ts (100%) rename {lib => packages/client/lib}/multi-command.spec.ts (100%) rename {lib => packages/client/lib}/multi-command.ts (100%) rename lib/test-utils/index.ts => packages/client/lib/test-utils.ts (93%) rename {lib => packages/client/lib}/ts-declarations/cluster-key-slot.d.ts (100%) rename {lib => packages/client/lib}/ts-declarations/redis-parser.d.ts (100%) rename {lib => packages/client/lib}/utils.ts (100%) create mode 100644 packages/client/package.json create mode 100644 packages/client/tsconfig.json create mode 100644 packages/json/.nycrc.json create mode 100644 packages/json/lib/commands/ARRAPPEND.spec.ts create mode 100644 packages/json/lib/commands/ARRAPPEND.ts create mode 100644 packages/json/lib/commands/ARRINDEX.spec.ts create mode 100644 packages/json/lib/commands/ARRINDEX.ts create mode 100644 packages/json/lib/commands/ARRINSERT.spec.ts create mode 100644 packages/json/lib/commands/ARRINSERT.ts create mode 100644 packages/json/lib/commands/ARRLEN.spec.ts create mode 100644 packages/json/lib/commands/ARRLEN.ts create mode 100644 packages/json/lib/commands/ARRPOP.spec.ts create mode 100644 packages/json/lib/commands/ARRPOP.ts create mode 100644 packages/json/lib/commands/ARRTRIM.spec.ts create mode 100644 packages/json/lib/commands/ARRTRIM.ts create mode 100644 packages/json/lib/commands/DEBUG_MEMORY.spec.ts create mode 100644 packages/json/lib/commands/DEBUG_MEMORY.ts create mode 100644 packages/json/lib/commands/DEL.spec.ts create mode 100644 packages/json/lib/commands/DEL.ts create mode 100644 packages/json/lib/commands/FORGET.spec.ts create mode 100644 packages/json/lib/commands/FORGET.ts create mode 100644 packages/json/lib/commands/GET.spec.ts create mode 100644 packages/json/lib/commands/GET.ts create mode 100644 packages/json/lib/commands/MGET.spec.ts create mode 100644 packages/json/lib/commands/MGET.ts create mode 100644 packages/json/lib/commands/NUMINCRBY.spec.ts create mode 100644 packages/json/lib/commands/NUMINCRBY.ts create mode 100644 packages/json/lib/commands/NUMMULTBY.spec.ts create mode 100644 packages/json/lib/commands/NUMMULTBY.ts create mode 100644 packages/json/lib/commands/OBJKEYS.spec.ts create mode 100644 packages/json/lib/commands/OBJKEYS.ts create mode 100644 packages/json/lib/commands/OBJLEN.spec.ts create mode 100644 packages/json/lib/commands/OBJLEN.ts create mode 100644 packages/json/lib/commands/RESP.spec.ts create mode 100644 packages/json/lib/commands/RESP.ts create mode 100644 packages/json/lib/commands/SET.spec.ts create mode 100644 packages/json/lib/commands/SET.ts create mode 100644 packages/json/lib/commands/STRAPPEND.spec.ts create mode 100644 packages/json/lib/commands/STRAPPEND.ts create mode 100644 packages/json/lib/commands/STRLEN.spec.ts create mode 100644 packages/json/lib/commands/STRLEN.ts create mode 100644 packages/json/lib/commands/TYPE.spec.ts create mode 100644 packages/json/lib/commands/TYPE.ts create mode 100644 packages/json/lib/commands/index.ts create mode 100644 packages/json/lib/index.ts create mode 100644 packages/json/lib/test-utils.ts create mode 100644 packages/json/package.json create mode 100644 packages/json/tsconfig.json create mode 100644 packages/search/.nycrc.json create mode 100644 packages/search/lib/commands/AGGREGATE.spec.ts create mode 100644 packages/search/lib/commands/AGGREGATE.ts create mode 100644 packages/search/lib/commands/ALIASADD.spec.ts create mode 100644 packages/search/lib/commands/ALIASADD.ts create mode 100644 packages/search/lib/commands/ALIASDEL.spec.ts create mode 100644 packages/search/lib/commands/ALIASDEL.ts create mode 100644 packages/search/lib/commands/ALIASUPDATE.spec.ts create mode 100644 packages/search/lib/commands/ALIASUPDATE.ts create mode 100644 packages/search/lib/commands/CONFIG_GET.spec.ts create mode 100644 packages/search/lib/commands/CONFIG_GET.ts create mode 100644 packages/search/lib/commands/CONFIG_SET.spec.ts create mode 100644 packages/search/lib/commands/CONFIG_SET.ts create mode 100644 packages/search/lib/commands/CREATE.spec.ts create mode 100644 packages/search/lib/commands/CREATE.ts create mode 100644 packages/search/lib/commands/DICTADD.spec.ts create mode 100644 packages/search/lib/commands/DICTADD.ts create mode 100644 packages/search/lib/commands/DICTDEL.spec.ts create mode 100644 packages/search/lib/commands/DICTDEL.ts create mode 100644 packages/search/lib/commands/DICTDUMP.spec.ts create mode 100644 packages/search/lib/commands/DICTDUMP.ts create mode 100644 packages/search/lib/commands/DROPINDEX.spec.ts create mode 100644 packages/search/lib/commands/DROPINDEX.ts create mode 100644 packages/search/lib/commands/EXPLAIN.spec.ts create mode 100644 packages/search/lib/commands/EXPLAIN.ts create mode 100644 packages/search/lib/commands/EXPLAINCLI.spec.ts create mode 100644 packages/search/lib/commands/EXPLAINCLI.ts create mode 100644 packages/search/lib/commands/INFO.spec.ts create mode 100644 packages/search/lib/commands/INFO.ts create mode 100644 packages/search/lib/commands/PROFILE.ts create mode 100644 packages/search/lib/commands/SEARCH.spec.ts create mode 100644 packages/search/lib/commands/SEARCH.ts create mode 100644 packages/search/lib/commands/SPELLCHECK.spec.ts create mode 100644 packages/search/lib/commands/SPELLCHECK.ts create mode 100644 packages/search/lib/commands/SUGADD.spec.ts create mode 100644 packages/search/lib/commands/SUGADD.ts create mode 100644 packages/search/lib/commands/SUGDEL.spec.ts create mode 100644 packages/search/lib/commands/SUGDEL.ts create mode 100644 packages/search/lib/commands/SUGGET.spec.ts create mode 100644 packages/search/lib/commands/SUGGET.ts create mode 100644 packages/search/lib/commands/SUGGET_WITHPAYLOADS.spec.ts create mode 100644 packages/search/lib/commands/SUGGET_WITHPAYLOADS.ts create mode 100644 packages/search/lib/commands/SUGGET_WITHSCORES.spec.ts create mode 100644 packages/search/lib/commands/SUGGET_WITHSCORES.ts create mode 100644 packages/search/lib/commands/SUGGET_WITHSCORES_WITHPAYLOADS.spec.ts create mode 100644 packages/search/lib/commands/SUGGET_WITHSCORES_WITHPAYLOADS.ts create mode 100644 packages/search/lib/commands/SUGLEN.spec.ts create mode 100644 packages/search/lib/commands/SUGLEN.ts create mode 100644 packages/search/lib/commands/SYNDUMP.spec.ts create mode 100644 packages/search/lib/commands/SYNDUMP.ts create mode 100644 packages/search/lib/commands/SYNUPDATE.spec.ts create mode 100644 packages/search/lib/commands/SYNUPDATE.ts create mode 100644 packages/search/lib/commands/TAGVALS.spec.ts create mode 100644 packages/search/lib/commands/TAGVALS.ts create mode 100644 packages/search/lib/commands/_LIST.spec.ts create mode 100644 packages/search/lib/commands/_LIST.ts create mode 100644 packages/search/lib/commands/index.spec.ts create mode 100644 packages/search/lib/commands/index.ts create mode 100644 packages/search/lib/index.ts create mode 100644 packages/search/lib/test-utils.ts create mode 100644 packages/search/package.json create mode 100644 packages/search/tsconfig.json create mode 100644 packages/test-utils/docker/Dockerfile create mode 100755 packages/test-utils/docker/entrypoint.sh rename {lib/test-utils => packages/test-utils/lib}/dockers.ts (90%) rename lib/test-utils/test-utils.ts => packages/test-utils/lib/index.ts (83%) create mode 100644 packages/test-utils/package.json create mode 100644 packages/test-utils/tsconfig.json diff --git a/.github/release-drafter-config.yml b/.github/release-drafter-config.yml index f17a2992fad..9a98b1c08a3 100644 --- a/.github/release-drafter-config.yml +++ b/.github/release-drafter-config.yml @@ -41,4 +41,3 @@ template: | We'd like to thank all the contributors who worked on this release! $CONTRIBUTORS - diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml deleted file mode 100644 index 2df438eb19c..00000000000 --- a/.github/workflows/benchmark.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: Benchmark - -on: - push: - branches: - - master - - v4.0 - -jobs: - benchmark: - name: Benchmark - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - node-version: [16.x] - redis-version: [6.x] - - steps: - - uses: actions/checkout@v2.3.4 - with: - fetch-depth: 1 - - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2.3.0 - with: - node-version: ${{ matrix.node-version }} - - - name: Setup Redis - uses: shogo82148/actions-setup-redis@v1.12.0 - with: - redis-version: ${{ matrix.redis-version }} - - - name: Install Packages - run: npm ci - - - name: Build - run: npm run build - - - name: Install Benchmark Packages - run: npm ci - working-directory: ./benchmark - - - name: Benchmark - run: npm run start - working-directory: ./benchmark diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index b6b2dd050eb..59421208396 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -28,6 +28,9 @@ jobs: - name: Install Packages run: npm ci + - name: Build tests tools + run: npm run build:tests-tools + - name: Run Tests run: npm run test -- --forbid-only --redis-version=${{ matrix.redis-version }} diff --git a/.gitignore b/.gitignore index 8d752019aa0..9ee58bfbd30 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,8 @@ -.vscode/ .idea/ -node_modules/ -dist/ .nyc_output/ +.vscode/ coverage/ -dump.rdb -documentation/ +dist/ +node_modules/ .DS_Store +dump.rdb diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 115395e3fbb..00000000000 --- a/.npmignore +++ /dev/null @@ -1,20 +0,0 @@ -.vscode/ -.idea/ -node_modules/ -.nyc_output/ -coverage/ -dump.rdb -documentation/ -CONTRIBUTING.md -tsconfig.json -.deepsource.toml -.nycrc.json -benchmark/ -.github/ -scripts/ -lib/ -index.ts -*.spec.* -dist/lib/test-utils.* -.DS_Store -examples/ diff --git a/.nycrc.json b/.nycrc.json deleted file mode 100644 index 918b308a898..00000000000 --- a/.nycrc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "@istanbuljs/nyc-config-typescript", - "exclude": ["**/*.spec.ts", "lib/test-utils/**/*.ts"] -} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fbad5205081..a041584e6fd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -47,10 +47,7 @@ Node Redis has a full test suite with coverage setup. To run the tests, run `npm install` to install dependencies, then run `npm test`. -Note that the test suite assumes that a few tools are installed in your environment, such as: - -- redis (make sure redis-server is not running when starting the tests, it's part of the test-suite to start it and you'll end up with a "port already in use" error) -- stunnel (for TLS tests) +Note that the test suite assumes that [`docker`](https://www.docker.com/) is installed in your environment. ### Submitting Code for Review diff --git a/README.md b/README.md index 9fe9e70a253..35648bd72ef 100644 --- a/README.md +++ b/README.md @@ -1,296 +1,18 @@ -

- - - -

Node Redis

-

+# Node-Redis monorpo - +### Clients ---- +| Name | Description | +|------------------------------------|-------------| +| [redis](./packages/all-in-one) | | +| [@redis/client](./packages/client) | | -## Installation +### [Modules](https://redis.io/modules) -```bash -npm install redis@next -``` - -> :warning: The new interface is clean and cool, but if you have an existing code base, you'll want to read the [migration guide](./docs/v3-to-v4.md). - -## Usage - -### Basic Example - -```typescript -import { createClient } from 'redis'; - -(async () => { - const client = createClient(); - - client.on('error', (err) => console.log('Redis Client Error', err)); - - await client.connect(); - - await client.set('key', 'value'); - const value = await client.get('key'); -})(); -``` - -The above code connects to localhost on port 6379. To connect to a different host or port, use a connection string in the format `redis[s]://[[username][:password]@][host][:port][/db-number]`: - -```typescript -createClient({ - url: 'redis://alice:foobared@awesome.redis.server:6380' -}); -``` - -You can also use discrete parameters, UNIX sockets, and even TLS to connect. Details can be found in the [client configuration guide](./docs/client-configuration.md). - -### Redis Commands - -There is built-in support for all of the [out-of-the-box Redis commands](https://redis.io/commands). They are exposed using the raw Redis command names (`HSET`, `HGETALL`, etc.) and a friendlier camel-cased version (`hSet`, `hGetAll`, etc.): - -```typescript -// raw Redis commands -await client.HSET('key', 'field', 'value'); -await client.HGETALL('key'); - -// friendly JavaScript commands -await client.hSet('key', 'field', 'value'); -await client.hGetAll('key'); -``` - -Modifiers to commands are specified using a JavaScript object: - -```typescript -await client.set('key', 'value', { - EX: 10, - NX: true -}); -``` - -Replies will be transformed into useful data structures: - -```typescript -await client.hGetAll('key'); // { field1: 'value1', field2: 'value2' } -await client.hVals('key'); // ['value1', 'value2'] -``` - -### Unsupported Redis Commands - -If you want to run commands and/or use arguments that Node Redis doesn't know about (yet!) use `.sendCommand()`: - -```typescript -await client.sendCommand(['SET', 'key', 'value', 'NX']); // 'OK' - -await client.sendCommand(['HGETALL', 'key']); // ['key1', 'field1', 'key2', 'field2'] -``` - -### Transactions (Multi/Exec) - -Start a [transaction](https://redis.io/topics/transactions) by calling `.multi()`, then chaining your commands. When you're done, call `.exec()` and you'll get an array back with your results: - -```typescript -await client.set('another-key', 'another-value'); - -const [setKeyReply, otherKeyValue] = await client - .multi() - .set('key', 'value') - .get('another-key') - .exec(); // ['OK', 'another-value'] -``` - -You can also [watch](https://redis.io/topics/transactions#optimistic-locking-using-check-and-set) keys by calling `.watch()`. Your transaction will abort if any of the watched keys change. - -To dig deeper into transactions, check out the [Isolated Execution Guide](./docs/isolated-execution.md). - -### Blocking Commands - -Any command can be run on a new connection by specifying the `isolated` option. The newly created connection is closed when the command's `Promise` is fulfilled. - -This pattern works especially well for blocking commands—such as `BLPOP` and `BLMOVE`: - -```typescript -import { commandOptions } from 'redis'; - -const blPopPromise = client.blPop(commandOptions({ isolated: true }), 'key', 0); - -await client.lPush('key', ['1', '2']); - -await blPopPromise; // '2' -``` - -To learn more about isolated execution, check out the [guide](./docs/isolated-execution.md). - -### Pub/Sub - -Subscribing to a channel requires a dedicated stand-alone connection. You can easily get one by `.duplicate()`ing an existing Redis connection. - -```typescript -const subscriber = client.duplicate(); - -await subscriber.connect(); -``` - -Once you have one, simply subscribe and unsubscribe as needed: - -```typescript -await subscriber.subscribe('channel', (message) => { - console.log(message); // 'message' -}); - -await subscriber.pSubscribe('channe*', (message, channel) => { - console.log(message, channel); // 'message', 'channel' -}); - -await subscriber.unsubscribe('channel'); - -await subscriber.pUnsubscribe('channe*'); -``` - -Publish a message on a channel: - -```typescript -await publisher.publish('channel', 'message'); -``` - -### Scan Iterator - -[`SCAN`](https://redis.io/commands/scan) results can be looped over using [async iterators](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator): - -```typescript -for await (const key of client.scanIterator()) { - // use the key! - await client.get(key); -} -``` - -This works with `HSCAN`, `SSCAN`, and `ZSCAN` too: - -```typescript -for await (const { field, value } of client.hScanIterator('hash')) {} -for await (const member of client.sScanIterator('set')) {} -for await (const { score, member } of client.zScanIterator('sorted-set')) {} -``` - -You can override the default options by providing a configuration object: - -```typescript -client.scanIterator({ - TYPE: 'string', // `SCAN` only - MATCH: 'patter*', - COUNT: 100 -}); -``` - -### Lua Scripts - -Define new functions using [Lua scripts](https://redis.io/commands/eval) which execute on the Redis server: - -```typescript -import { createClient, defineScript } from 'redis'; - -(async () => { - const client = createClient({ - scripts: { - add: defineScript({ - NUMBER_OF_KEYS: 1, - SCRIPT: - "local val = redis.pcall('GET', KEYS[1]);" + "return val + ARGV[1];", - transformArguments(key: string, toAdd: number): Array { - return [key, toAdd.toString()]; - }, - transformReply(reply: number): number { - return reply; - } - }) - } - }); - - await client.connect(); - - await client.set('key', '1'); - await client.add('key', 2); // 3 -})(); -``` - -### Disconnecting - -There are two functions that disconnect a client from the Redis server. In most scenarios you should use `.quit()` to ensure that pending commands are sent to Redis before closing a connection. - -#### `.QUIT()`/`.quit()` - -Gracefully close a client's connection to Redis, by sending the [`QUIT`](https://redis.io/commands/quit) command to the server. Before quitting, the client executes any remaining commands in its queue, and will receive replies from Redis for each of them. - -```typescript -const [ping, get, quit] = await Promise.all([ - client.ping(), - client.get('key'), - client.quit() -]); // ['PONG', null, 'OK'] - -try { - await client.get('key'); -} catch (err) { - // ClosedClient Error -} -``` - -#### `.disconnect()` - -Forcibly close a client's connection to Redis immediately. Calling `disconnect` will not send further pending commands to the Redis server, or wait for or parse outstanding responses. - -```typescript -await client.disconnect(); -``` - -### Auto-Pipelining - -Node Redis will automatically pipeline requests that are made during the same "tick". - -```typescript -client.set('Tm9kZSBSZWRpcw==', 'users:1'); -client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw=='); -``` - -Of course, if you don't do something with your Promises you're certain to get [unhandled Promise exceptions](https://nodejs.org/api/process.html#process_event_unhandledrejection). To take advantage of auto-pipelining and handle your Promises, use `Promise.all()`. - -```typescript -await Promise.all([ - client.set('Tm9kZSBSZWRpcw==', 'users:1'), - client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw==') -]); -``` - -### Clustering - -Check out the [Clustering Guide](./docs/clustering.md) when using Node Redis to connect to a Redis Cluster. - -## Supported Redis versions - -Node Redis is supported with the following versions of Redis: - -| Version | Supported | -|---------|--------------------| -| 6.2.z | :heavy_check_mark: | -| 6.0.z | :heavy_check_mark: | -| 5.y.z | :heavy_check_mark: | -| < 5.0 | :x: | - -> Node Redis should work with older versions of Redis, but it is not fully tested and we cannot offer support. +| Name | Description | +|------------------------------------|------------------------------------------------------------| +| [@redis/json](./packages/json) | [Redis JSON](https://oss.redis.com/redisjson/) commands | +| [@redis/search](./packages/search) | [Redis Search](https://oss.redis.com/redisearch/) commands | ## Contributing diff --git a/benchmark/.gitignore b/benchmark/.gitignore deleted file mode 100644 index 3c3629e647f..00000000000 --- a/benchmark/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/benchmark/index.js b/benchmark/index.js deleted file mode 100644 index 37f88176653..00000000000 --- a/benchmark/index.js +++ /dev/null @@ -1,81 +0,0 @@ -import { add, suite, cycle, complete } from 'benny'; -import v4 from 'v4'; -import v3 from 'v3'; -import { once } from 'events'; - -const v4Client = v4.createClient(), - v4LegacyClient = v4.createClient({ - legacyMode: true - }), - v3Client = v3.createClient(); - -await Promise.all([ - v4Client.connect(), - v4LegacyClient.connect(), - once(v3Client, 'connect') -]); - -const key = random(100), - value = random(100); - -function random(size) { - const result = []; - - for (let i = 0; i < size; i++) { - result.push(Math.floor(Math.random() * 10)); - } - - return result.join(''); -} - -suite( - 'SET GET', - add('v4', async () => { - await Promise.all([ - v4Client.set(key, value), - v4Client.get(key) - ]); - }), - add('v4 - legacy mode', () => { - return new Promise((resolve, reject) => { - v4LegacyClient.set(key, value); - v4LegacyClient.get(key, (err, reply) => { - if (err) { - reject(err); - } else { - resolve(reply); - } - }); - }); - }), - add('v3', () => { - return new Promise((resolve, reject) => { - v3Client.set(key, value); - v3Client.get(key, (err, reply) => { - if (err) { - reject(err); - } else { - resolve(reply); - } - }); - }); - }), - cycle(), - complete(), - complete(() => { - return Promise.all([ - v4Client.disconnect(), - v4LegacyClient.disconnect(), - new Promise((resolve, reject) => { - v3Client.quit((err) => { - if (err) { - reject(err); - } else { - resolve(err); - } - }); - }) - ]); - }) -); - diff --git a/benchmark/package-lock.json b/benchmark/package-lock.json deleted file mode 100644 index 4afaf8c305c..00000000000 --- a/benchmark/package-lock.json +++ /dev/null @@ -1,849 +0,0 @@ -{ - "name": "benchmark", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "benchmark", - "license": "ISC", - "dependencies": { - "benny": "3.6.15", - "v3": "npm:redis@3.1.2", - "v4": "file:../" - } - }, - "..": { - "name": "redis", - "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.10.3", - "@types/sinon": "^10.0.4", - "@types/which": "^2.0.1", - "@types/yallist": "^4.0.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.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": { - "node": ">=12" - } - }, - "node_modules/@arrows/array": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@arrows/array/-/array-1.4.1.tgz", - "integrity": "sha512-MGYS8xi3c4tTy1ivhrVntFvufoNzje0PchjEz6G/SsWRgUKxL4tKwS6iPdO8vsaJYldagAeWMd5KRD0aX3Q39g==", - "dependencies": { - "@arrows/composition": "^1.2.2" - } - }, - "node_modules/@arrows/composition": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@arrows/composition/-/composition-1.2.2.tgz", - "integrity": "sha512-9fh1yHwrx32lundiB3SlZ/VwuStPB4QakPsSLrGJFH6rCXvdrd060ivAZ7/2vlqPnEjBkPRRXOcG1YOu19p2GQ==" - }, - "node_modules/@arrows/dispatch": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@arrows/dispatch/-/dispatch-1.0.3.tgz", - "integrity": "sha512-v/HwvrFonitYZM2PmBlAlCqVqxrkIIoiEuy5bQgn0BdfvlL0ooSBzcPzTMrtzY8eYktPyYcHg8fLbSgyybXEqw==", - "dependencies": { - "@arrows/composition": "^1.2.2" - } - }, - "node_modules/@arrows/error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@arrows/error/-/error-1.0.2.tgz", - "integrity": "sha512-yvkiv1ay4Z3+Z6oQsUkedsQm5aFdyPpkBUQs8vejazU/RmANABx6bMMcBPPHI4aW43VPQmXFfBzr/4FExwWTEA==" - }, - "node_modules/@arrows/multimethod": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@arrows/multimethod/-/multimethod-1.1.7.tgz", - "integrity": "sha512-EjHD3XuGAV4G28rm7mu8k7zQJh/EOizh104/p9i2ofGcnL5mgKONFH/Bq6H3SJjM+WDAlKcR9WBpNhaAKCnH2g==", - "dependencies": { - "@arrows/array": "^1.4.0", - "@arrows/composition": "^1.2.2", - "@arrows/error": "^1.0.2", - "fast-deep-equal": "^3.1.1" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/benchmark": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", - "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=", - "dependencies": { - "lodash": "^4.17.4", - "platform": "^1.3.3" - } - }, - "node_modules/benny": { - "version": "3.6.15", - "resolved": "https://registry.npmjs.org/benny/-/benny-3.6.15.tgz", - "integrity": "sha512-kq6XVGGYVou3Y8KNPs3SEF881vi5fJ8sIf9w69D2rreiNfRicWVWK6u6/mObMw6BiexoHHumtipn5gcu0Tngng==", - "dependencies": { - "@arrows/composition": "^1.0.0", - "@arrows/dispatch": "^1.0.2", - "@arrows/multimethod": "^1.1.6", - "benchmark": "^2.1.4", - "fs-extra": "^9.0.1", - "json2csv": "^5.0.4", - "kleur": "^4.1.3", - "log-update": "^4.0.0", - "prettier": "^2.1.2", - "stats-median": "^1.0.1" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/denque": { - "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" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/graceful-fs": { - "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", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/json2csv": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/json2csv/-/json2csv-5.0.6.tgz", - "integrity": "sha512-0/4Lv6IenJV0qj2oBdgPIAmFiKKnh8qh7bmLFJ+/ZZHLjSeiL3fKKGX3UryvKPbxFbhV+JcYo9KUC19GJ/Z/4A==", - "dependencies": { - "commander": "^6.1.0", - "jsonparse": "^1.3.1", - "lodash.get": "^4.4.2" - }, - "bin": { - "json2csv": "bin/json2csv.js" - }, - "engines": { - "node": ">= 10", - "npm": ">= 6.13.0" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/kleur": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz", - "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" - }, - "node_modules/prettier": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/redis-commands": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", - "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "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", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/stats-median": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stats-median/-/stats-median-1.0.1.tgz", - "integrity": "sha512-IYsheLg6dasD3zT/w9+8Iq9tcIQqqu91ZIpJOnIEM25C3X/g4Tl8mhXwW2ZQpbrsJISr9+wizEYgsibN5/b32Q==" - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "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.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/v3": { - "name": "redis", - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", - "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", - "dependencies": { - "denque": "^1.5.0", - "redis-commands": "^1.7.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-redis" - } - }, - "node_modules/v4": { - "resolved": "..", - "link": true - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - } - }, - "dependencies": { - "@arrows/array": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@arrows/array/-/array-1.4.1.tgz", - "integrity": "sha512-MGYS8xi3c4tTy1ivhrVntFvufoNzje0PchjEz6G/SsWRgUKxL4tKwS6iPdO8vsaJYldagAeWMd5KRD0aX3Q39g==", - "requires": { - "@arrows/composition": "^1.2.2" - } - }, - "@arrows/composition": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@arrows/composition/-/composition-1.2.2.tgz", - "integrity": "sha512-9fh1yHwrx32lundiB3SlZ/VwuStPB4QakPsSLrGJFH6rCXvdrd060ivAZ7/2vlqPnEjBkPRRXOcG1YOu19p2GQ==" - }, - "@arrows/dispatch": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@arrows/dispatch/-/dispatch-1.0.3.tgz", - "integrity": "sha512-v/HwvrFonitYZM2PmBlAlCqVqxrkIIoiEuy5bQgn0BdfvlL0ooSBzcPzTMrtzY8eYktPyYcHg8fLbSgyybXEqw==", - "requires": { - "@arrows/composition": "^1.2.2" - } - }, - "@arrows/error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@arrows/error/-/error-1.0.2.tgz", - "integrity": "sha512-yvkiv1ay4Z3+Z6oQsUkedsQm5aFdyPpkBUQs8vejazU/RmANABx6bMMcBPPHI4aW43VPQmXFfBzr/4FExwWTEA==" - }, - "@arrows/multimethod": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@arrows/multimethod/-/multimethod-1.1.7.tgz", - "integrity": "sha512-EjHD3XuGAV4G28rm7mu8k7zQJh/EOizh104/p9i2ofGcnL5mgKONFH/Bq6H3SJjM+WDAlKcR9WBpNhaAKCnH2g==", - "requires": { - "@arrows/array": "^1.4.0", - "@arrows/composition": "^1.2.2", - "@arrows/error": "^1.0.2", - "fast-deep-equal": "^3.1.1" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "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", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, - "benchmark": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", - "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=", - "requires": { - "lodash": "^4.17.4", - "platform": "^1.3.3" - } - }, - "benny": { - "version": "3.6.15", - "resolved": "https://registry.npmjs.org/benny/-/benny-3.6.15.tgz", - "integrity": "sha512-kq6XVGGYVou3Y8KNPs3SEF881vi5fJ8sIf9w69D2rreiNfRicWVWK6u6/mObMw6BiexoHHumtipn5gcu0Tngng==", - "requires": { - "@arrows/composition": "^1.0.0", - "@arrows/dispatch": "^1.0.2", - "@arrows/multimethod": "^1.1.6", - "benchmark": "^2.1.4", - "fs-extra": "^9.0.1", - "json2csv": "^5.0.4", - "kleur": "^4.1.3", - "log-update": "^4.0.0", - "prettier": "^2.1.2", - "stats-median": "^1.0.1" - } - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" - }, - "denque": { - "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", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "graceful-fs": { - "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", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "json2csv": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/json2csv/-/json2csv-5.0.6.tgz", - "integrity": "sha512-0/4Lv6IenJV0qj2oBdgPIAmFiKKnh8qh7bmLFJ+/ZZHLjSeiL3fKKGX3UryvKPbxFbhV+JcYo9KUC19GJ/Z/4A==", - "requires": { - "commander": "^6.1.0", - "jsonparse": "^1.3.1", - "lodash.get": "^4.4.2" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" - }, - "kleur": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.4.tgz", - "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==" - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" - }, - "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" - }, - "prettier": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==" - }, - "redis-commands": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", - "integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ==" - }, - "redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=" - }, - "redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", - "requires": { - "redis-errors": "^1.0.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "signal-exit": { - "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", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "stats-median": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stats-median/-/stats-median-1.0.1.tgz", - "integrity": "sha512-IYsheLg6dasD3zT/w9+8Iq9tcIQqqu91ZIpJOnIEM25C3X/g4Tl8mhXwW2ZQpbrsJISr9+wizEYgsibN5/b32Q==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "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.1" - } - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - }, - "v3": { - "version": "npm:redis@3.1.2", - "resolved": "https://registry.npmjs.org/redis/-/redis-3.1.2.tgz", - "integrity": "sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw==", - "requires": { - "denque": "^1.5.0", - "redis-commands": "^1.7.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0" - } - }, - "v4": { - "version": "file:..", - "requires": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@tsconfig/node12": "^1.0.9", - "@types/mocha": "^9.0.0", - "@types/node": "^16.10.3", - "@types/sinon": "^10.0.4", - "@types/which": "^2.0.1", - "@types/yallist": "^4.0.1", - "cluster-key-slot": "1.1.0", - "generic-pool": "3.8.2", - "mocha": "^9.1.2", - "nyc": "^15.1.0", - "redis-parser": "3.0.0", - "release-it": "^14.11.6", - "sinon": "^11.1.2", - "source-map-support": "^0.5.20", - "ts-node": "^10.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" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } -} diff --git a/benchmark/package.json b/benchmark/package.json deleted file mode 100644 index ab874090c4b..00000000000 --- a/benchmark/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "benchmark", - "private": true, - "description": "", - "main": "index.js", - "type": "module", - "scripts": { - "start": "node ./" - }, - "author": "", - "license": "ISC", - "dependencies": { - "benny": "3.6.15", - "v3": "npm:redis@3.1.2", - "v4": "file:../" - } -} diff --git a/package-lock.json b/package-lock.json index ff1b2e6e569..87ae980524c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,44 +1,15 @@ { - "name": "redis", - "version": "4.0.0-rc.3", + "name": "redis-monorepo", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "redis", - "version": "4.0.0-rc.3", - "license": "MIT", - "dependencies": { - "cluster-key-slot": "1.1.0", - "generic-pool": "3.8.2", - "redis-parser": "3.0.0", - "yallist": "4.0.0" - }, + "name": "redis-monorepo", + "workspaces": [ + "./packages/*" + ], "devDependencies": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@tsconfig/node12": "^1.0.9", - "@types/mocha": "^9.0.0", - "@types/node": "^16.11.6", - "@types/sinon": "^10.0.6", - "@types/yallist": "^4.0.1", - "@types/yargs": "^17.0.5", - "@typescript-eslint/eslint-plugin": "^5.2.0", - "@typescript-eslint/parser": "^5.2.0", - "eslint": "^8.1.0", - "mocha": "^9.1.3", - "nyc": "^15.1.0", - "release-it": "^14.11.6", - "sinon": "^11.1.2", - "source-map-support": "^0.5.20", - "ts-node": "^10.4.0", - "typedoc": "^0.22.7", - "typedoc-github-wiki-theme": "^0.6.0", - "typedoc-plugin-markdown": "^3.11.3", - "typescript": "^4.4.4", - "yargs": "^17.2.1" - }, - "engines": { - "node": ">=12" + "@tsconfig/node12": "^1.0.9" } }, "node_modules/@babel/code-frame": { @@ -392,9 +363,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.0.tgz", - "integrity": "sha512-TEHWXf0xxpi9wKVyBCmRcSSDjbJ/cl6LUdlbYUHEaNQUJGhreJbZrXT6sR4+fZLxVUJqNRB4KyOvjuy/D9009A==", + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.2.tgz", + "integrity": "sha512-RUVpT0G2h6rOZwqLDTrKk7ksNv7YpAilTnYe1/Q+eDjxEceRMKVWbCsX7t8h6C1qCFi/1Y8WZjcEPBAFG27GPw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -481,9 +452,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.3.tgz", - "integrity": "sha512-DHI1wDPoKCBPoLZA3qDR91+3te/wDSc1YhKg3jR8NxKKRJq2hwHwcWv31cSwSYvIBrmbENoYMWcenW8uproQqg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", + "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -492,7 +463,7 @@ "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, @@ -500,15 +471,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/@eslint/eslintrc/node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -518,19 +480,6 @@ "node": ">= 4" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", @@ -546,9 +495,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, "node_modules/@iarna/toml": { @@ -849,6 +798,26 @@ "@octokit/openapi-types": "^11.2.0" } }, + "node_modules/@redis/client": { + "resolved": "packages/client", + "link": true + }, + "node_modules/@redis/json": { + "resolved": "packages/json", + "link": true + }, + "node_modules/@redis/search": { + "resolved": "packages/search", + "link": true + }, + "node_modules/@redis/test-utils": { + "resolved": "packages/test-utils", + "link": true + }, + "node_modules/@redis/time-series": { + "resolved": "packages/time-series", + "link": true + }, "node_modules/@sindresorhus/is": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", @@ -972,9 +941,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", - "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==", + "version": "16.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", + "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==", "dev": true }, "node_modules/@types/parse-json": { @@ -1023,13 +992,13 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.2.0.tgz", - "integrity": "sha512-qQwg7sqYkBF4CIQSyRQyqsYvP+g/J0To9ZPVNJpfxfekl5RmdvQnFFTVVwpRtaUDFNvjfe/34TgY/dpc3MgNTw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.3.1.tgz", + "integrity": "sha512-cFImaoIr5Ojj358xI/SDhjog57OK2NqlpxwdcgyxDA3bJlZcJq5CPzUXtpD7CxI2Hm6ATU7w5fQnnkVnmwpHqw==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "5.2.0", - "@typescript-eslint/scope-manager": "5.2.0", + "@typescript-eslint/experimental-utils": "5.3.1", + "@typescript-eslint/scope-manager": "5.3.1", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -1055,15 +1024,15 @@ } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.2.0.tgz", - "integrity": "sha512-fWyT3Agf7n7HuZZRpvUYdFYbPk3iDCq6fgu3ulia4c7yxmPnwVBovdSOX7RL+k8u6hLbrXcdAehlWUVpGh6IEw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.1.tgz", + "integrity": "sha512-RgFn5asjZ5daUhbK5Sp0peq0SSMytqcrkNfU4pnDma2D8P3ElZ6JbYjY8IMSFfZAJ0f3x3tnO3vXHweYg0g59w==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.2.0", - "@typescript-eslint/types": "5.2.0", - "@typescript-eslint/typescript-estree": "5.2.0", + "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/typescript-estree": "5.3.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -1079,14 +1048,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.2.0.tgz", - "integrity": "sha512-Uyy4TjJBlh3NuA8/4yIQptyJb95Qz5PX//6p8n7zG0QnN4o3NF9Je3JHbVU7fxf5ncSXTmnvMtd/LDQWDk0YqA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.3.1.tgz", + "integrity": "sha512-TD+ONlx5c+Qhk21x9gsJAMRohWAUMavSOmJgv3JGy9dgPhuBd5Wok0lmMClZDyJNLLZK1JRKiATzCKZNUmoyfw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.2.0", - "@typescript-eslint/types": "5.2.0", - "@typescript-eslint/typescript-estree": "5.2.0", + "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/typescript-estree": "5.3.1", "debug": "^4.3.2" }, "engines": { @@ -1106,13 +1075,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.2.0.tgz", - "integrity": "sha512-RW+wowZqPzQw8MUFltfKYZfKXqA2qgyi6oi/31J1zfXJRpOn6tCaZtd9b5u9ubnDG2n/EMvQLeZrsLNPpaUiFQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.3.1.tgz", + "integrity": "sha512-XksFVBgAq0Y9H40BDbuPOTUIp7dn4u8oOuhcgGq7EoDP50eqcafkMVGrypyVGvDYHzjhdUCUwuwVUK4JhkMAMg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.2.0", - "@typescript-eslint/visitor-keys": "5.2.0" + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1123,9 +1092,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.2.0.tgz", - "integrity": "sha512-cTk6x08qqosps6sPyP2j7NxyFPlCNsJwSDasqPNjEQ8JMD5xxj2NHxcLin5AJQ8pAVwpQ8BMI3bTxR0zxmK9qQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.1.tgz", + "integrity": "sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1136,13 +1105,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.2.0.tgz", - "integrity": "sha512-RsdXq2XmVgKbm9nLsE3mjNUM7BTr/K4DYR9WfFVMUuozHWtH5gMpiNZmtrMG8GR385EOSQ3kC9HiEMJWimxd/g==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.3.1.tgz", + "integrity": "sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.2.0", - "@typescript-eslint/visitor-keys": "5.2.0", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -1163,12 +1132,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.2.0.tgz", - "integrity": "sha512-Nk7HizaXWWCUBfLA/rPNKMzXzWS8Wg9qHMuGtT+v2/YpPij4nVXrVJc24N/r5WrrmqK31jCrZxeHqIgqRzs0Xg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.1.tgz", + "integrity": "sha512-3cHUzUuVTuNHx0Gjjt5pEHa87+lzyqOiHXy/Gz+SJOCW1mpw9xQHIIEwnKn+Thph1mgWyZ90nboOcSuZr/jTTQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.2.0", + "@typescript-eslint/types": "5.3.1", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -1495,13 +1464,13 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.5.tgz", - "integrity": "sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA==", + "version": "4.17.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz", + "integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==", "dev": true, "dependencies": { - "caniuse-lite": "^1.0.30001271", - "electron-to-chromium": "^1.3.878", + "caniuse-lite": "^1.0.30001274", + "electron-to-chromium": "^1.3.886", "escalade": "^3.1.1", "node-releases": "^2.0.1", "picocolors": "^1.0.0" @@ -1636,9 +1605,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001274", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001274.tgz", - "integrity": "sha512-+Nkvv0fHyhISkiMIjnyjmf5YJcQ1IQHZN6U9TLUMroWR38FNwpsC51Gb68yueafX1V6ifOisInSgP9WJFS13ew==", + "version": "1.0.30001278", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001278.tgz", + "integrity": "sha512-mpF9KeH8u5cMoEmIic/cr7PNS+F5LWBk0t2ekGT60lFf0Wq+n9LspAj0g3P+o7DQhD3sUdlMln4YFAWhFYn9jg==", "dev": true, "funding": { "type": "opencollective", @@ -2097,9 +2066,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.3.885", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.885.tgz", - "integrity": "sha512-JXKFJcVWrdHa09n4CNZYfYaK6EW5aAew7/wr3L1OnsD1L+JHL+RCtd7QgIsxUbFPeTwPlvnpqNNTOLkoefmtXg==", + "version": "1.3.891", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.891.tgz", + "integrity": "sha512-3cpwR82QkIS01CN/dup/4Yr3BiOiRLlZlcAFn/5FbNCunMO9ojqDgEP9JEo1QNLflu3pEnPWve50gHOEKc7r6w==", "dev": true }, "node_modules/emoji-regex": { @@ -2175,12 +2144,12 @@ } }, "node_modules/eslint": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.1.0.tgz", - "integrity": "sha512-JZvNneArGSUsluHWJ8g8MMs3CfIEzwaLx9KyH4tZ2i+R2/rPWzL8c0zg3rHdwYVpN/1sB9gqnjHwz9HoeJpGHw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.2.0.tgz", + "integrity": "sha512-erw7XmM+CLxTOickrimJ1SiF55jiNlVSp2qqm0NuBWPtHYQCegD5ZMaW0c3i5ytPqL+SSLaCxdvQXFPLJn+ABw==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.0.3", + "@eslint/eslintrc": "^1.0.4", "@humanwhocodes/config-array": "^0.6.0", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -2214,7 +2183,7 @@ "progress": "^2.0.0", "regexpp": "^3.2.0", "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" @@ -2270,9 +2239,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", - "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", + "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3060,9 +3029,9 @@ ] }, "node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", "dev": true, "engines": { "node": ">= 4" @@ -5096,6 +5065,10 @@ "node": ">= 0.10" } }, + "node_modules/redis": { + "resolved": "packages/all-in-one", + "link": true + }, "node_modules/redis-errors": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", @@ -5883,9 +5856,9 @@ } }, "node_modules/typedoc": { - "version": "0.22.7", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.7.tgz", - "integrity": "sha512-ndxxp+tU1Wczvdxp4u2/PvT1qjD6hdFdSdehpORHjE+JXmMkl2bftXCR0upHmsnesBG7VCcr8vfgloGHIH8glQ==", + "version": "0.22.8", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.8.tgz", + "integrity": "sha512-92S+YzyhospdXN5rnkYUTgirdTYqNWY7NP9vco+IqQQoiSXzVSUsawVro+tMyEEsWUS7EMaJ2YOjB9uE0CBi6A==", "dev": true, "dependencies": { "glob": "^7.2.0", @@ -5960,9 +5933,9 @@ } }, "node_modules/uglify-js": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz", - "integrity": "sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==", + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz", + "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==", "dev": true, "optional": true, "bin": { @@ -6385,6 +6358,124 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "packages/all-in-one": { + "name": "redis", + "version": "4.0.0-rc.3", + "license": "MIT", + "dependencies": { + "@redis/client": "^4.0.0-rc", + "@redis/json": "^1.0.0-rc", + "@redis/search": "^1.0.0-rc" + }, + "devDependencies": { + "release-it": "^14.11.6", + "typescript": "^4.4.4" + } + }, + "packages/client": { + "name": "@redis/client", + "version": "4.0.0-rc.3", + "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", + "@redis/test-utils": "*", + "@types/node": "^16.11.6", + "@types/sinon": "^10.0.6", + "@types/yallist": "^4.0.1", + "@typescript-eslint/eslint-plugin": "^5.2.0", + "@typescript-eslint/parser": "^5.2.0", + "eslint": "^8.1.0", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "sinon": "^11.1.2", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typedoc": "^0.22.7", + "typedoc-github-wiki-theme": "^0.6.0", + "typedoc-plugin-markdown": "^3.11.3", + "typescript": "^4.4.4" + }, + "engines": { + "node": ">=12" + } + }, + "packages/json": { + "name": "@redis/json", + "version": "1.0.0-rc.0", + "license": "MIT", + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@redis/test-utils": "*", + "@types/node": "^16.11.6", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4" + }, + "peerDependencies": { + "@redis/client": "^4.0.0-rc" + } + }, + "packages/search": { + "name": "@redis/search", + "version": "1.0.0-rc.0", + "license": "MIT", + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@redis/test-utils": "*", + "@types/node": "^16.11.6", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4" + }, + "peerDependencies": { + "@redis/client": "^4.0.0-rc" + } + }, + "packages/test-utils": { + "name": "@redis/test-utils", + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@tsconfig/node12": "^1.0.9", + "@types/mocha": "^9.0.0", + "@types/node": "^16.11.6", + "@types/yargs": "^17.0.5", + "mocha": "^9.1.3", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4", + "yargs": "^17.2.1" + }, + "peerDependencies": { + "@redis/client": "^4.0.0-rc" + } + }, + "packages/time-series": { + "name": "@redis/time-series", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@redis/test-utils": "*", + "@types/node": "^16.11.6", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4" + } } }, "dependencies": { @@ -6660,9 +6751,9 @@ } }, "@babel/parser": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.0.tgz", - "integrity": "sha512-TEHWXf0xxpi9wKVyBCmRcSSDjbJ/cl6LUdlbYUHEaNQUJGhreJbZrXT6sR4+fZLxVUJqNRB4KyOvjuy/D9009A==", + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.2.tgz", + "integrity": "sha512-RUVpT0G2h6rOZwqLDTrKk7ksNv7YpAilTnYe1/Q+eDjxEceRMKVWbCsX7t8h6C1qCFi/1Y8WZjcEPBAFG27GPw==", "dev": true }, "@babel/template": { @@ -6727,9 +6818,9 @@ } }, "@eslint/eslintrc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.3.tgz", - "integrity": "sha512-DHI1wDPoKCBPoLZA3qDR91+3te/wDSc1YhKg3jR8NxKKRJq2hwHwcWv31cSwSYvIBrmbENoYMWcenW8uproQqg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", + "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", "dev": true, "requires": { "ajv": "^6.12.4", @@ -6738,35 +6829,16 @@ "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", + "js-yaml": "^4.1.0", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" }, "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } } } }, @@ -6782,9 +6854,9 @@ } }, "@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, "@iarna/toml": { @@ -7035,6 +7107,88 @@ "@octokit/openapi-types": "^11.2.0" } }, + "@redis/client": { + "version": "file:packages/client", + "requires": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@redis/test-utils": "*", + "@types/node": "^16.11.6", + "@types/sinon": "^10.0.6", + "@types/yallist": "^4.0.1", + "@typescript-eslint/eslint-plugin": "^5.2.0", + "@typescript-eslint/parser": "^5.2.0", + "cluster-key-slot": "1.1.0", + "eslint": "^8.1.0", + "generic-pool": "3.8.2", + "nyc": "^15.1.0", + "redis-parser": "3.0.0", + "release-it": "^14.11.6", + "sinon": "^11.1.2", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typedoc": "^0.22.7", + "typedoc-github-wiki-theme": "^0.6.0", + "typedoc-plugin-markdown": "^3.11.3", + "typescript": "^4.4.4", + "yallist": "4.0.0" + } + }, + "@redis/json": { + "version": "file:packages/json", + "requires": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@redis/test-utils": "*", + "@types/node": "^16.11.6", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4" + } + }, + "@redis/search": { + "version": "file:packages/search", + "requires": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@redis/test-utils": "*", + "@types/node": "^16.11.6", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4" + } + }, + "@redis/test-utils": { + "version": "file:packages/test-utils", + "requires": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@tsconfig/node12": "^1.0.9", + "@types/mocha": "^9.0.0", + "@types/node": "^16.11.6", + "@types/yargs": "^17.0.5", + "mocha": "^9.1.3", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4", + "yargs": "^17.2.1" + } + }, + "@redis/time-series": { + "version": "file:packages/time-series", + "requires": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@redis/test-utils": "*", + "@types/node": "^16.11.6", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4" + } + }, "@sindresorhus/is": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", @@ -7149,9 +7303,9 @@ "dev": true }, "@types/node": { - "version": "16.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", - "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==", + "version": "16.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", + "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==", "dev": true }, "@types/parse-json": { @@ -7200,13 +7354,13 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.2.0.tgz", - "integrity": "sha512-qQwg7sqYkBF4CIQSyRQyqsYvP+g/J0To9ZPVNJpfxfekl5RmdvQnFFTVVwpRtaUDFNvjfe/34TgY/dpc3MgNTw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.3.1.tgz", + "integrity": "sha512-cFImaoIr5Ojj358xI/SDhjog57OK2NqlpxwdcgyxDA3bJlZcJq5CPzUXtpD7CxI2Hm6ATU7w5fQnnkVnmwpHqw==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "5.2.0", - "@typescript-eslint/scope-manager": "5.2.0", + "@typescript-eslint/experimental-utils": "5.3.1", + "@typescript-eslint/scope-manager": "5.3.1", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -7216,55 +7370,55 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.2.0.tgz", - "integrity": "sha512-fWyT3Agf7n7HuZZRpvUYdFYbPk3iDCq6fgu3ulia4c7yxmPnwVBovdSOX7RL+k8u6hLbrXcdAehlWUVpGh6IEw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.1.tgz", + "integrity": "sha512-RgFn5asjZ5daUhbK5Sp0peq0SSMytqcrkNfU4pnDma2D8P3ElZ6JbYjY8IMSFfZAJ0f3x3tnO3vXHweYg0g59w==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.2.0", - "@typescript-eslint/types": "5.2.0", - "@typescript-eslint/typescript-estree": "5.2.0", + "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/typescript-estree": "5.3.1", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/parser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.2.0.tgz", - "integrity": "sha512-Uyy4TjJBlh3NuA8/4yIQptyJb95Qz5PX//6p8n7zG0QnN4o3NF9Je3JHbVU7fxf5ncSXTmnvMtd/LDQWDk0YqA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.3.1.tgz", + "integrity": "sha512-TD+ONlx5c+Qhk21x9gsJAMRohWAUMavSOmJgv3JGy9dgPhuBd5Wok0lmMClZDyJNLLZK1JRKiATzCKZNUmoyfw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.2.0", - "@typescript-eslint/types": "5.2.0", - "@typescript-eslint/typescript-estree": "5.2.0", + "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/typescript-estree": "5.3.1", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.2.0.tgz", - "integrity": "sha512-RW+wowZqPzQw8MUFltfKYZfKXqA2qgyi6oi/31J1zfXJRpOn6tCaZtd9b5u9ubnDG2n/EMvQLeZrsLNPpaUiFQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.3.1.tgz", + "integrity": "sha512-XksFVBgAq0Y9H40BDbuPOTUIp7dn4u8oOuhcgGq7EoDP50eqcafkMVGrypyVGvDYHzjhdUCUwuwVUK4JhkMAMg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.2.0", - "@typescript-eslint/visitor-keys": "5.2.0" + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1" } }, "@typescript-eslint/types": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.2.0.tgz", - "integrity": "sha512-cTk6x08qqosps6sPyP2j7NxyFPlCNsJwSDasqPNjEQ8JMD5xxj2NHxcLin5AJQ8pAVwpQ8BMI3bTxR0zxmK9qQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.1.tgz", + "integrity": "sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.2.0.tgz", - "integrity": "sha512-RsdXq2XmVgKbm9nLsE3mjNUM7BTr/K4DYR9WfFVMUuozHWtH5gMpiNZmtrMG8GR385EOSQ3kC9HiEMJWimxd/g==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.3.1.tgz", + "integrity": "sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.2.0", - "@typescript-eslint/visitor-keys": "5.2.0", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -7273,12 +7427,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.2.0.tgz", - "integrity": "sha512-Nk7HizaXWWCUBfLA/rPNKMzXzWS8Wg9qHMuGtT+v2/YpPij4nVXrVJc24N/r5WrrmqK31jCrZxeHqIgqRzs0Xg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.1.tgz", + "integrity": "sha512-3cHUzUuVTuNHx0Gjjt5pEHa87+lzyqOiHXy/Gz+SJOCW1mpw9xQHIIEwnKn+Thph1mgWyZ90nboOcSuZr/jTTQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.2.0", + "@typescript-eslint/types": "5.3.1", "eslint-visitor-keys": "^3.0.0" } }, @@ -7519,13 +7673,13 @@ "dev": true }, "browserslist": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.5.tgz", - "integrity": "sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA==", + "version": "4.17.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz", + "integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001271", - "electron-to-chromium": "^1.3.878", + "caniuse-lite": "^1.0.30001274", + "electron-to-chromium": "^1.3.886", "escalade": "^3.1.1", "node-releases": "^2.0.1", "picocolors": "^1.0.0" @@ -7614,9 +7768,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001274", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001274.tgz", - "integrity": "sha512-+Nkvv0fHyhISkiMIjnyjmf5YJcQ1IQHZN6U9TLUMroWR38FNwpsC51Gb68yueafX1V6ifOisInSgP9WJFS13ew==", + "version": "1.0.30001278", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001278.tgz", + "integrity": "sha512-mpF9KeH8u5cMoEmIic/cr7PNS+F5LWBk0t2ekGT60lFf0Wq+n9LspAj0g3P+o7DQhD3sUdlMln4YFAWhFYn9jg==", "dev": true }, "chalk": { @@ -7963,9 +8117,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.885", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.885.tgz", - "integrity": "sha512-JXKFJcVWrdHa09n4CNZYfYaK6EW5aAew7/wr3L1OnsD1L+JHL+RCtd7QgIsxUbFPeTwPlvnpqNNTOLkoefmtXg==", + "version": "1.3.891", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.891.tgz", + "integrity": "sha512-3cpwR82QkIS01CN/dup/4Yr3BiOiRLlZlcAFn/5FbNCunMO9ojqDgEP9JEo1QNLflu3pEnPWve50gHOEKc7r6w==", "dev": true }, "emoji-regex": { @@ -8026,12 +8180,12 @@ "dev": true }, "eslint": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.1.0.tgz", - "integrity": "sha512-JZvNneArGSUsluHWJ8g8MMs3CfIEzwaLx9KyH4tZ2i+R2/rPWzL8c0zg3rHdwYVpN/1sB9gqnjHwz9HoeJpGHw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.2.0.tgz", + "integrity": "sha512-erw7XmM+CLxTOickrimJ1SiF55jiNlVSp2qqm0NuBWPtHYQCegD5ZMaW0c3i5ytPqL+SSLaCxdvQXFPLJn+ABw==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.0.3", + "@eslint/eslintrc": "^1.0.4", "@humanwhocodes/config-array": "^0.6.0", "ajv": "^6.10.0", "chalk": "^4.0.0", @@ -8065,7 +8219,7 @@ "progress": "^2.0.0", "regexpp": "^3.2.0", "semver": "^7.2.1", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" @@ -8123,9 +8277,9 @@ } }, "eslint-visitor-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", - "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", + "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", "dev": true }, "espree": { @@ -8667,9 +8821,9 @@ "dev": true }, "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", "dev": true }, "import-cwd": { @@ -10220,6 +10374,16 @@ "resolve": "^1.1.6" } }, + "redis": { + "version": "file:packages/all-in-one", + "requires": { + "@redis/client": "^4.0.0-rc", + "@redis/json": "^1.0.0-rc", + "@redis/search": "^1.0.0-rc", + "release-it": "^14.11.6", + "typescript": "^4.4.4" + } + }, "redis-errors": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", @@ -10803,9 +10967,9 @@ } }, "typedoc": { - "version": "0.22.7", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.7.tgz", - "integrity": "sha512-ndxxp+tU1Wczvdxp4u2/PvT1qjD6hdFdSdehpORHjE+JXmMkl2bftXCR0upHmsnesBG7VCcr8vfgloGHIH8glQ==", + "version": "0.22.8", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.8.tgz", + "integrity": "sha512-92S+YzyhospdXN5rnkYUTgirdTYqNWY7NP9vco+IqQQoiSXzVSUsawVro+tMyEEsWUS7EMaJ2YOjB9uE0CBi6A==", "dev": true, "requires": { "glob": "^7.2.0", @@ -10854,9 +11018,9 @@ "dev": true }, "uglify-js": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.2.tgz", - "integrity": "sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==", + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz", + "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==", "dev": true, "optional": true }, diff --git a/package.json b/package.json index f252e4a0fa3..e7de3fc8674 100644 --- a/package.json +++ b/package.json @@ -1,60 +1,19 @@ { - "name": "redis", - "version": "4.0.0-rc.3", - "description": "A high performance Redis client.", - "keywords": [ - "database", - "redis", - "pubsub" + "name": "redis-monorepo", + "private": true, + "workspaces": [ + "./packages/*" ], - "author": "Matt Ranney ", - "license": "MIT", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", "scripts": { - "test": "nyc -r text-summary -r html mocha -r source-map-support/register -r ts-node/register './lib/**/*.spec.ts'", - "build": "tsc", - "lint": "eslint ./*.ts ./lib/**/*.ts", - "documentation": "typedoc" - }, - "dependencies": { - "cluster-key-slot": "1.1.0", - "generic-pool": "3.8.2", - "redis-parser": "3.0.0", - "yallist": "4.0.0" + "test": "npm run test -ws --if-present", + "build:client": "npm run build -w ./packages/client", + "build:test-utils": "npm run build -w ./packages/test-utils", + "build:tests-tools": "npm run build:client && npm run build:test-utils", + "build:modules": "find ./packages -mindepth 1 -maxdepth 1 -type d ! -name 'client' ! -name 'test-utils' ! -name 'all-in-one' -exec npm run build -w {} \\;", + "build:all-in-one": "npm run build -w ./packages/all-in-one", + "build": "npm run build:client && npm run build:test-utils && npm run build:modules && npm run build:all-in-one" }, "devDependencies": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@tsconfig/node12": "^1.0.9", - "@types/mocha": "^9.0.0", - "@types/node": "^16.11.6", - "@types/sinon": "^10.0.6", - "@types/yallist": "^4.0.1", - "@types/yargs": "^17.0.5", - "@typescript-eslint/eslint-plugin": "^5.2.0", - "@typescript-eslint/parser": "^5.2.0", - "eslint": "^8.1.0", - "mocha": "^9.1.3", - "nyc": "^15.1.0", - "release-it": "^14.11.6", - "sinon": "^11.1.2", - "source-map-support": "^0.5.20", - "ts-node": "^10.4.0", - "typedoc": "^0.22.7", - "typedoc-github-wiki-theme": "^0.6.0", - "typedoc-plugin-markdown": "^3.11.3", - "typescript": "^4.4.4", - "yargs": "^17.2.1" - }, - "engines": { - "node": ">=12" - }, - "repository": { - "type": "git", - "url": "git://github.com/redis/node-redis.git" - }, - "bugs": { - "url": "https://github.com/redis/node-redis/issues" - }, - "homepage": "https://github.com/redis/node-redis" + "@tsconfig/node12": "^1.0.9" + } } diff --git a/packages/all-in-one/index.ts b/packages/all-in-one/index.ts new file mode 100644 index 00000000000..b0cd5c1f8f7 --- /dev/null +++ b/packages/all-in-one/index.ts @@ -0,0 +1,19 @@ +import { createClient as _createClient } from '@redis/client'; +import { RedisScripts } from '@redis/client/dist/lib/commands'; +import { RedisClientOptions, RedisClientType } from '@redis/client/dist/lib/client'; +import RedisJSON from '@redis/json'; +import RediSearch from '@redis/search'; + +const modules = { + json: RedisJSON, + ft: RediSearch +}; + +export function createClient>( + options?: Omit, 'modules'> +): RedisClientType { + return _createClient({ + ...options, + modules + }); +} diff --git a/packages/all-in-one/package.json b/packages/all-in-one/package.json new file mode 100644 index 00000000000..8fdb7149717 --- /dev/null +++ b/packages/all-in-one/package.json @@ -0,0 +1,27 @@ +{ + "name": "redis", + "version": "4.0.0-rc.3", + "license": "MIT", + "main": "./dist/index.js", + "types": "./dist/index.ts", + "scripts": { + "build": "tsc" + }, + "dependencies": { + "@redis/client": "^4.0.0-rc", + "@redis/json": "^1.0.0-rc", + "@redis/search": "^1.0.0-rc" + }, + "devDependencies": { + "release-it": "^14.11.6", + "typescript": "^4.4.4" + }, + "repository": { + "type": "git", + "url": "git://github.com/redis/node-redis.git" + }, + "bugs": { + "url": "https://github.com/redis/node-redis/issues" + }, + "homepage": "https://github.com/redis/node-redis" +} diff --git a/packages/all-in-one/tsconfig.json b/packages/all-in-one/tsconfig.json new file mode 100644 index 00000000000..103760b874b --- /dev/null +++ b/packages/all-in-one/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig", + "compilerOptions": { + "outDir": "./dist" + }, + "include": [ + "./index.ts" + ] + } diff --git a/.eslintrc.json b/packages/client/.eslintrc.json similarity index 100% rename from .eslintrc.json rename to packages/client/.eslintrc.json diff --git a/packages/client/.gitignore b/packages/client/.gitignore new file mode 100644 index 00000000000..2d7ddbc106e --- /dev/null +++ b/packages/client/.gitignore @@ -0,0 +1 @@ +documentation/ diff --git a/packages/client/.npmignore b/packages/client/.npmignore new file mode 100644 index 00000000000..b7310e15767 --- /dev/null +++ b/packages/client/.npmignore @@ -0,0 +1,9 @@ +.nyc_output/ +coverage/ +documentation/ +examples/ +lib/ +.nycrc.json +dump.rdb +index.ts +tsconfig.json diff --git a/packages/client/.nycrc.json b/packages/client/.nycrc.json new file mode 100644 index 00000000000..b4e671e178f --- /dev/null +++ b/packages/client/.nycrc.json @@ -0,0 +1,4 @@ +{ + "extends": "@istanbuljs/nyc-config-typescript", + "exclude": ["**/*.spec.ts", "lib/test-utils.ts"] +} diff --git a/CHANGELOG.md b/packages/client/CHANGELOG.md similarity index 100% rename from CHANGELOG.md rename to packages/client/CHANGELOG.md diff --git a/packages/client/LICENSE b/packages/client/LICENSE new file mode 100644 index 00000000000..db86cc4de7f --- /dev/null +++ b/packages/client/LICENSE @@ -0,0 +1,24 @@ +MIT License + +Copyright (c) 2016-present Node Redis contributors. + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/client/README.md b/packages/client/README.md new file mode 100644 index 00000000000..813f9830efd --- /dev/null +++ b/packages/client/README.md @@ -0,0 +1,294 @@ +

+ + + +

Node Redis

+

+ + + +--- + +## Installation + +```bash +npm install redis@next +``` + +> :warning: The new interface is clean and cool, but if you have an existing code base, you'll want to read the [migration guide](./docs/v3-to-v4.md). + +## Usage + +### Basic Example + +```typescript +import { createClient } from 'redis'; + +(async () => { + const client = createClient(); + + client.on('error', (err) => console.log('Redis Client Error', err)); + + await client.connect(); + + await client.set('key', 'value'); + const value = await client.get('key'); +})(); +``` + +The above code connects to localhost on port 6379. To connect to a different host or port, use a connection string in the format `redis[s]://[[username][:password]@][host][:port][/db-number]`: + +```typescript +createClient({ + url: 'redis://alice:foobared@awesome.redis.server:6380' +}); +``` + +You can also use discrete parameters, UNIX sockets, and even TLS to connect. Details can be found in the [client configuration guide](./docs/client-configuration.md). + +### Redis Commands + +There is built-in support for all of the [out-of-the-box Redis commands](https://redis.io/commands). They are exposed using the raw Redis command names (`HSET`, `HGETALL`, etc.) and a friendlier camel-cased version (`hSet`, `hGetAll`, etc.): + +```typescript +// raw Redis commands +await client.HSET('key', 'field', 'value'); +await client.HGETALL('key'); + +// friendly JavaScript commands +await client.hSet('key', 'field', 'value'); +await client.hGetAll('key'); +``` + +Modifiers to commands are specified using a JavaScript object: + +```typescript +await client.set('key', 'value', { + EX: 10, + NX: true +}); +``` + +Replies will be transformed into useful data structures: + +```typescript +await client.hGetAll('key'); // { field1: 'value1', field2: 'value2' } +await client.hVals('key'); // ['value1', 'value2'] +``` + +### Unsupported Redis Commands + +If you want to run commands and/or use arguments that Node Redis doesn't know about (yet!) use `.sendCommand()`: + +```typescript +await client.sendCommand(['SET', 'key', 'value', 'NX']); // 'OK' + +await client.sendCommand(['HGETALL', 'key']); // ['key1', 'field1', 'key2', 'field2'] +``` + +### Transactions (Multi/Exec) + +Start a [transaction](https://redis.io/topics/transactions) by calling `.multi()`, then chaining your commands. When you're done, call `.exec()` and you'll get an array back with your results: + +```typescript +await client.set('another-key', 'another-value'); + +const [setKeyReply, otherKeyValue] = await client + .multi() + .set('key', 'value') + .get('another-key') + .exec(); // ['OK', 'another-value'] +``` + +You can also [watch](https://redis.io/topics/transactions#optimistic-locking-using-check-and-set) keys by calling `.watch()`. Your transaction will abort if any of the watched keys change. + +To dig deeper into transactions, check out the [Isolated Execution Guide](./docs/isolated-execution.md). + +### Blocking Commands + +Any command can be run on a new connection by specifying the `isolated` option. The newly created connection is closed when the command's `Promise` is fulfilled. + +This pattern works especially well for blocking commands—such as `BLPOP` and `BLMOVE`: + +```typescript +import { commandOptions } from 'redis'; + +const blPopPromise = client.blPop(commandOptions({ isolated: true }), 'key', 0); + +await client.lPush('key', ['1', '2']); + +await blPopPromise; // '2' +``` + +To learn more about isolated execution, check out the [guide](./docs/isolated-execution.md). + +### Pub/Sub + +Subscribing to a channel requires a dedicated stand-alone connection. You can easily get one by `.duplicate()`ing an existing Redis connection. + +```typescript +const subscriber = client.duplicate(); + +await subscriber.connect(); +``` + +Once you have one, simply subscribe and unsubscribe as needed: + +```typescript +await subscriber.subscribe('channel', (message) => { + console.log(message); // 'message' +}); + +await subscriber.pSubscribe('channe*', (message, channel) => { + console.log(message, channel); // 'message', 'channel' +}); + +await subscriber.unsubscribe('channel'); + +await subscriber.pUnsubscribe('channe*'); +``` + +Publish a message on a channel: + +```typescript +await publisher.publish('channel', 'message'); +``` + +### Scan Iterator + +[`SCAN`](https://redis.io/commands/scan) results can be looped over using [async iterators](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator): + +```typescript +for await (const key of client.scanIterator()) { + // use the key! + await client.get(key); +} +``` + +This works with `HSCAN`, `SSCAN`, and `ZSCAN` too: + +```typescript +for await (const { field, value } of client.hScanIterator('hash')) {} +for await (const member of client.sScanIterator('set')) {} +for await (const { score, member } of client.zScanIterator('sorted-set')) {} +``` + +You can override the default options by providing a configuration object: + +```typescript +client.scanIterator({ + TYPE: 'string', // `SCAN` only + MATCH: 'patter*', + COUNT: 100 +}); +``` + +### Lua Scripts + +Define new functions using [Lua scripts](https://redis.io/commands/eval) which execute on the Redis server: + +```typescript +import { createClient, defineScript } from 'redis'; + +(async () => { + const client = createClient({ + scripts: { + add: defineScript({ + NUMBER_OF_KEYS: 1, + SCRIPT: + 'local val = redis.pcall("GET", KEYS[1]);' + + 'return val + ARGV[1];', + transformArguments(key: string, toAdd: number): Array { + return [key, toAdd.toString()]; + }, + transformReply(reply: number): number { + return reply; + } + }) + } + }); + + await client.connect(); + + await client.set('key', '1'); + await client.add('key', 2); // 3 +})(); +``` + +### Disconnecting + +There are two functions that disconnect a client from the Redis server. In most scenarios you should use `.quit()` to ensure that pending commands are sent to Redis before closing a connection. + +#### `.QUIT()`/`.quit()` + +Gracefully close a client's connection to Redis, by sending the [`QUIT`](https://redis.io/commands/quit) command to the server. Before quitting, the client executes any remaining commands in its queue, and will receive replies from Redis for each of them. + +```typescript +const [ping, get, quit] = await Promise.all([ + client.ping(), + client.get('key'), + client.quit() +]); // ['PONG', null, 'OK'] + +try { + await client.get('key'); +} catch (err) { + // ClosedClient Error +} +``` + +#### `.disconnect()` + +Forcibly close a client's connection to Redis immediately. Calling `disconnect` will not send further pending commands to the Redis server, or wait for or parse outstanding responses. + +```typescript +await client.disconnect(); +``` + +### Auto-Pipelining + +Node Redis will automatically pipeline requests that are made during the same "tick". + +```typescript +client.set('Tm9kZSBSZWRpcw==', 'users:1'); +client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw=='); +``` + +Of course, if you don't do something with your Promises you're certain to get [unhandled Promise exceptions](https://nodejs.org/api/process.html#process_event_unhandledrejection). To take advantage of auto-pipelining and handle your Promises, use `Promise.all()`. + +```typescript +await Promise.all([ + client.set('Tm9kZSBSZWRpcw==', 'users:1'), + client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw==') +]); +``` + +### Clustering + +Check out the [Clustering Guide](./docs/clustering.md) when using Node Redis to connect to a Redis Cluster. + +## Supported Redis versions + +Node Redis is supported with the following versions of Redis: + +| Version | Supported | +|---------|--------------------| +| 6.2.z | :heavy_check_mark: | +| 6.0.z | :heavy_check_mark: | +| 5.y.z | :heavy_check_mark: | +| < 5.0 | :x: | + +> Node Redis should work with older versions of Redis, but it is not fully tested and we cannot offer support. diff --git a/docs/FAQ.md b/packages/client/docs/FAQ.md similarity index 100% rename from docs/FAQ.md rename to packages/client/docs/FAQ.md diff --git a/docs/client-configuration.md b/packages/client/docs/client-configuration.md similarity index 98% rename from docs/client-configuration.md rename to packages/client/docs/client-configuration.md index 11fdb0a6819..3b6b7dcad73 100644 --- a/docs/client-configuration.md +++ b/packages/client/docs/client-configuration.md @@ -15,7 +15,7 @@ | username | | ACL username ([see ACL guide](https://redis.io/topics/acl)) | | password | | ACL password or the old "--requirepass" password | | database | | Database number to connect to (see [`SELECT`](https://redis.io/commands/select) command) | -| modules | | Object defining which [Redis Modules](https://redis.io/modules) to include (TODO - document) | +| modules | | Object defining which [Redis Modules](../../README.md#modules) to include | | scripts | | Object defining Lua Scripts to use with this client (see [Lua Scripts](../README.md#lua-scripts)) | | commandsQueueMaxLength | | Maximum length of the client's internal command queue | | readonly | `false` | Connect in [`READONLY`](https://redis.io/commands/readonly) mode | diff --git a/docs/clustering.md b/packages/client/docs/clustering.md similarity index 82% rename from docs/clustering.md rename to packages/client/docs/clustering.md index a84dc3b1aa4..3b5ef94a5c7 100644 --- a/docs/clustering.md +++ b/packages/client/docs/clustering.md @@ -37,7 +37,9 @@ import { createCluster } from 'redis'; | rootNodes | | An array of root nodes that are part of the cluster, which will be used to get the cluster topology. Each element in the array is a client configuration object. There is no need to specify every node in the cluster, 3 should be enough to reliably connect and obtain the cluster configuration from the server | | defaults | | The default configuration values for every client in the cluster. Use this for example when specifying an ACL user to connect with | | useReplicas | `false` | When `true`, distribute load by executing readonly commands (such as `GET`, `GEOSEARCH`, etc.) across all cluster nodes. When `false`, only use master nodes | -| maxCommandRedirections | `16` | The maximum number of times a command will be redirected due to `MOVED` or `ASK` errors | | +| maxCommandRedirections | `16` | The maximum number of times a command will be redirected due to `MOVED` or `ASK` errors | +| modules | | Object defining which [Redis Modules](../../README.md#modules) to include | +| scripts | | Object defining Lua Scripts to use with this client (see [Lua Scripts](../README.md#lua-scripts)) | ## Command Routing diff --git a/docs/isolated-execution.md b/packages/client/docs/isolated-execution.md similarity index 100% rename from docs/isolated-execution.md rename to packages/client/docs/isolated-execution.md diff --git a/docs/v3-to-v4.md b/packages/client/docs/v3-to-v4.md similarity index 100% rename from docs/v3-to-v4.md rename to packages/client/docs/v3-to-v4.md diff --git a/examples/README.md b/packages/client/examples/README.md similarity index 100% rename from examples/README.md rename to packages/client/examples/README.md diff --git a/examples/blocking-list-pop.js b/packages/client/examples/blocking-list-pop.js similarity index 100% rename from examples/blocking-list-pop.js rename to packages/client/examples/blocking-list-pop.js diff --git a/examples/command-with-modifiers.js b/packages/client/examples/command-with-modifiers.js similarity index 100% rename from examples/command-with-modifiers.js rename to packages/client/examples/command-with-modifiers.js diff --git a/examples/connect-as-acl-user.js b/packages/client/examples/connect-as-acl-user.js similarity index 100% rename from examples/connect-as-acl-user.js rename to packages/client/examples/connect-as-acl-user.js diff --git a/examples/lua-multi-incr.js b/packages/client/examples/lua-multi-incr.js similarity index 100% rename from examples/lua-multi-incr.js rename to packages/client/examples/lua-multi-incr.js diff --git a/examples/package-lock.json b/packages/client/examples/package-lock.json similarity index 100% rename from examples/package-lock.json rename to packages/client/examples/package-lock.json diff --git a/examples/package.json b/packages/client/examples/package.json similarity index 64% rename from examples/package.json rename to packages/client/examples/package.json index 4963094b0ba..edb8cdacdb2 100644 --- a/examples/package.json +++ b/packages/client/examples/package.json @@ -4,11 +4,6 @@ "description": "node-redis 4 example script", "main": "index.js", "private": true, - "scripts": { - }, - "type": "module", - "dependencies": { - "redis": "../" - } + "type": "module" } diff --git a/examples/set-scan.js b/packages/client/examples/set-scan.js similarity index 100% rename from examples/set-scan.js rename to packages/client/examples/set-scan.js diff --git a/index.ts b/packages/client/index.ts similarity index 100% rename from index.ts rename to packages/client/index.ts diff --git a/lib/client/commands-queue.ts b/packages/client/lib/client/commands-queue.ts similarity index 100% rename from lib/client/commands-queue.ts rename to packages/client/lib/client/commands-queue.ts diff --git a/lib/client/commands.ts b/packages/client/lib/client/commands.ts similarity index 100% rename from lib/client/commands.ts rename to packages/client/lib/client/commands.ts diff --git a/lib/client/index.spec.ts b/packages/client/lib/client/index.spec.ts similarity index 98% rename from lib/client/index.spec.ts rename to packages/client/lib/client/index.spec.ts index 51dded18b1f..21abe8a25f1 100644 --- a/lib/client/index.spec.ts +++ b/packages/client/lib/client/index.spec.ts @@ -444,16 +444,16 @@ describe('Client', () => { } }); - testUtils.testWithClient('executeIsolated', async client => { - await client.sendCommand(['CLIENT', 'SETNAME', 'client']); - - assert.equal( - await client.executeIsolated(isolatedClient => - isolatedClient.sendCommand(['CLIENT', 'GETNAME']) - ), - null - ); - }, GLOBAL.SERVERS.OPEN); + // testUtils.testWithClient('executeIsolated', async client => { + // await client.sendCommand(['CLIENT', 'SETNAME', 'client']); + + // assert.equal( + // await client.executeIsolated(isolatedClient => + // isolatedClient.sendCommand(['CLIENT', 'GETNAME']) + // ), + // null + // ); + // }, GLOBAL.SERVERS.OPEN); async function killClient(client: RedisClientType): Promise { const onceErrorPromise = once(client, 'error'); diff --git a/lib/client/index.ts b/packages/client/lib/client/index.ts similarity index 100% rename from lib/client/index.ts rename to packages/client/lib/client/index.ts diff --git a/lib/client/multi-command.ts b/packages/client/lib/client/multi-command.ts similarity index 100% rename from lib/client/multi-command.ts rename to packages/client/lib/client/multi-command.ts diff --git a/lib/client/socket.spec.ts b/packages/client/lib/client/socket.spec.ts similarity index 100% rename from lib/client/socket.spec.ts rename to packages/client/lib/client/socket.spec.ts diff --git a/lib/client/socket.ts b/packages/client/lib/client/socket.ts similarity index 100% rename from lib/client/socket.ts rename to packages/client/lib/client/socket.ts diff --git a/lib/cluster/cluster-slots.ts b/packages/client/lib/cluster/cluster-slots.ts similarity index 100% rename from lib/cluster/cluster-slots.ts rename to packages/client/lib/cluster/cluster-slots.ts diff --git a/lib/cluster/commands.ts b/packages/client/lib/cluster/commands.ts similarity index 100% rename from lib/cluster/commands.ts rename to packages/client/lib/cluster/commands.ts diff --git a/lib/cluster/index.spec.ts b/packages/client/lib/cluster/index.spec.ts similarity index 51% rename from lib/cluster/index.spec.ts rename to packages/client/lib/cluster/index.spec.ts index 66319460f63..43492a6500f 100644 --- a/lib/cluster/index.spec.ts +++ b/packages/client/lib/cluster/index.spec.ts @@ -47,47 +47,47 @@ describe('Cluster', () => { } }); - testUtils.testWithCluster('should handle live resharding', async cluster => { - const key = 'key', - value = 'value'; - await cluster.set(key, value); + // testUtils.testWithCluster('should handle live resharding', async cluster => { + // const key = 'key', + // value = 'value'; + // await cluster.set(key, value); - const slot = calculateSlot(key), - from = cluster.getSlotMaster(slot), - to = cluster.getMasters().find(node => node.id !== from.id); + // const slot = calculateSlot(key), + // from = cluster.getSlotMaster(slot), + // to = cluster.getMasters().find(node => node.id !== from.id); - await to!.client.clusterSetSlot(slot, ClusterSlotStates.IMPORTING, from.id); + // await to!.client.clusterSetSlot(slot, ClusterSlotStates.IMPORTING, from.id); - // should be able to get the key from the original node before it was migrated - assert.equal( - await cluster.get(key), - value - ); + // // should be able to get the key from the original node before it was migrated + // assert.equal( + // await cluster.get(key), + // value + // ); - await from.client.clusterSetSlot(slot, ClusterSlotStates.MIGRATING, to!.id); + // await from.client.clusterSetSlot(slot, ClusterSlotStates.MIGRATING, to!.id); - // should be able to get the key from the original node using the "ASKING" command - assert.equal( - await cluster.get(key), - value - ); + // // should be able to get the key from the original node using the "ASKING" command + // assert.equal( + // await cluster.get(key), + // value + // ); - const { port: toPort } = to!.client.options!.socket; + // const { port: toPort } = to!.client.options!.socket; - await from.client.migrate( - '127.0.0.1', - toPort, - key, - 0, - 10 - ); + // await from.client.migrate( + // '127.0.0.1', + // toPort, + // key, + // 0, + // 10 + // ); - // should be able to get the key from the new node - assert.equal( - await cluster.get(key), - value - ); - }, { - serverArguments: [] - }); + // // should be able to get the key from the new node + // assert.equal( + // await cluster.get(key), + // value + // ); + // }, { + // serverArguments: [] + // }); }); diff --git a/lib/cluster/index.ts b/packages/client/lib/cluster/index.ts similarity index 100% rename from lib/cluster/index.ts rename to packages/client/lib/cluster/index.ts diff --git a/lib/cluster/multi-command.ts b/packages/client/lib/cluster/multi-command.ts similarity index 100% rename from lib/cluster/multi-command.ts rename to packages/client/lib/cluster/multi-command.ts diff --git a/lib/command-options.ts b/packages/client/lib/command-options.ts similarity index 100% rename from lib/command-options.ts rename to packages/client/lib/command-options.ts diff --git a/lib/commander.spec.ts b/packages/client/lib/commander.spec.ts similarity index 100% rename from lib/commander.spec.ts rename to packages/client/lib/commander.spec.ts diff --git a/lib/commander.ts b/packages/client/lib/commander.ts similarity index 100% rename from lib/commander.ts rename to packages/client/lib/commander.ts diff --git a/lib/commands/ACL_CAT.spec.ts b/packages/client/lib/commands/ACL_CAT.spec.ts similarity index 100% rename from lib/commands/ACL_CAT.spec.ts rename to packages/client/lib/commands/ACL_CAT.spec.ts diff --git a/lib/commands/ACL_CAT.ts b/packages/client/lib/commands/ACL_CAT.ts similarity index 100% rename from lib/commands/ACL_CAT.ts rename to packages/client/lib/commands/ACL_CAT.ts diff --git a/lib/commands/ACL_DELUSER.spec.ts b/packages/client/lib/commands/ACL_DELUSER.spec.ts similarity index 100% rename from lib/commands/ACL_DELUSER.spec.ts rename to packages/client/lib/commands/ACL_DELUSER.spec.ts diff --git a/lib/commands/ACL_DELUSER.ts b/packages/client/lib/commands/ACL_DELUSER.ts similarity index 100% rename from lib/commands/ACL_DELUSER.ts rename to packages/client/lib/commands/ACL_DELUSER.ts diff --git a/lib/commands/ACL_GENPASS.spec.ts b/packages/client/lib/commands/ACL_GENPASS.spec.ts similarity index 100% rename from lib/commands/ACL_GENPASS.spec.ts rename to packages/client/lib/commands/ACL_GENPASS.spec.ts diff --git a/lib/commands/ACL_GENPASS.ts b/packages/client/lib/commands/ACL_GENPASS.ts similarity index 100% rename from lib/commands/ACL_GENPASS.ts rename to packages/client/lib/commands/ACL_GENPASS.ts diff --git a/lib/commands/ACL_GETUSER.spec.ts b/packages/client/lib/commands/ACL_GETUSER.spec.ts similarity index 100% rename from lib/commands/ACL_GETUSER.spec.ts rename to packages/client/lib/commands/ACL_GETUSER.spec.ts diff --git a/lib/commands/ACL_GETUSER.ts b/packages/client/lib/commands/ACL_GETUSER.ts similarity index 100% rename from lib/commands/ACL_GETUSER.ts rename to packages/client/lib/commands/ACL_GETUSER.ts diff --git a/lib/commands/ACL_LIST.spec.ts b/packages/client/lib/commands/ACL_LIST.spec.ts similarity index 100% rename from lib/commands/ACL_LIST.spec.ts rename to packages/client/lib/commands/ACL_LIST.spec.ts diff --git a/lib/commands/ACL_LIST.ts b/packages/client/lib/commands/ACL_LIST.ts similarity index 100% rename from lib/commands/ACL_LIST.ts rename to packages/client/lib/commands/ACL_LIST.ts diff --git a/lib/commands/ACL_LOAD.spec.ts b/packages/client/lib/commands/ACL_LOAD.spec.ts similarity index 100% rename from lib/commands/ACL_LOAD.spec.ts rename to packages/client/lib/commands/ACL_LOAD.spec.ts diff --git a/lib/commands/ACL_LOAD.ts b/packages/client/lib/commands/ACL_LOAD.ts similarity index 100% rename from lib/commands/ACL_LOAD.ts rename to packages/client/lib/commands/ACL_LOAD.ts diff --git a/lib/commands/ACL_LOG.spec.ts b/packages/client/lib/commands/ACL_LOG.spec.ts similarity index 100% rename from lib/commands/ACL_LOG.spec.ts rename to packages/client/lib/commands/ACL_LOG.spec.ts diff --git a/lib/commands/ACL_LOG.ts b/packages/client/lib/commands/ACL_LOG.ts similarity index 100% rename from lib/commands/ACL_LOG.ts rename to packages/client/lib/commands/ACL_LOG.ts diff --git a/lib/commands/ACL_LOG_RESET.spec.ts b/packages/client/lib/commands/ACL_LOG_RESET.spec.ts similarity index 100% rename from lib/commands/ACL_LOG_RESET.spec.ts rename to packages/client/lib/commands/ACL_LOG_RESET.spec.ts diff --git a/lib/commands/ACL_LOG_RESET.ts b/packages/client/lib/commands/ACL_LOG_RESET.ts similarity index 100% rename from lib/commands/ACL_LOG_RESET.ts rename to packages/client/lib/commands/ACL_LOG_RESET.ts diff --git a/lib/commands/ACL_SAVE.spec.ts b/packages/client/lib/commands/ACL_SAVE.spec.ts similarity index 100% rename from lib/commands/ACL_SAVE.spec.ts rename to packages/client/lib/commands/ACL_SAVE.spec.ts diff --git a/lib/commands/ACL_SAVE.ts b/packages/client/lib/commands/ACL_SAVE.ts similarity index 100% rename from lib/commands/ACL_SAVE.ts rename to packages/client/lib/commands/ACL_SAVE.ts diff --git a/lib/commands/ACL_SETUSER.spec.ts b/packages/client/lib/commands/ACL_SETUSER.spec.ts similarity index 100% rename from lib/commands/ACL_SETUSER.spec.ts rename to packages/client/lib/commands/ACL_SETUSER.spec.ts diff --git a/lib/commands/ACL_SETUSER.ts b/packages/client/lib/commands/ACL_SETUSER.ts similarity index 100% rename from lib/commands/ACL_SETUSER.ts rename to packages/client/lib/commands/ACL_SETUSER.ts diff --git a/lib/commands/ACL_USERS.spec.ts b/packages/client/lib/commands/ACL_USERS.spec.ts similarity index 100% rename from lib/commands/ACL_USERS.spec.ts rename to packages/client/lib/commands/ACL_USERS.spec.ts diff --git a/lib/commands/ACL_USERS.ts b/packages/client/lib/commands/ACL_USERS.ts similarity index 100% rename from lib/commands/ACL_USERS.ts rename to packages/client/lib/commands/ACL_USERS.ts diff --git a/lib/commands/ACL_WHOAMI.spec.ts b/packages/client/lib/commands/ACL_WHOAMI.spec.ts similarity index 100% rename from lib/commands/ACL_WHOAMI.spec.ts rename to packages/client/lib/commands/ACL_WHOAMI.spec.ts diff --git a/lib/commands/ACL_WHOAMI.ts b/packages/client/lib/commands/ACL_WHOAMI.ts similarity index 100% rename from lib/commands/ACL_WHOAMI.ts rename to packages/client/lib/commands/ACL_WHOAMI.ts diff --git a/lib/commands/APPEND.spec.ts b/packages/client/lib/commands/APPEND.spec.ts similarity index 100% rename from lib/commands/APPEND.spec.ts rename to packages/client/lib/commands/APPEND.spec.ts diff --git a/lib/commands/APPEND.ts b/packages/client/lib/commands/APPEND.ts similarity index 100% rename from lib/commands/APPEND.ts rename to packages/client/lib/commands/APPEND.ts diff --git a/lib/commands/ASKING.spec.ts b/packages/client/lib/commands/ASKING.spec.ts similarity index 100% rename from lib/commands/ASKING.spec.ts rename to packages/client/lib/commands/ASKING.spec.ts diff --git a/lib/commands/ASKING.ts b/packages/client/lib/commands/ASKING.ts similarity index 100% rename from lib/commands/ASKING.ts rename to packages/client/lib/commands/ASKING.ts diff --git a/lib/commands/AUTH.spec.ts b/packages/client/lib/commands/AUTH.spec.ts similarity index 100% rename from lib/commands/AUTH.spec.ts rename to packages/client/lib/commands/AUTH.spec.ts diff --git a/lib/commands/AUTH.ts b/packages/client/lib/commands/AUTH.ts similarity index 100% rename from lib/commands/AUTH.ts rename to packages/client/lib/commands/AUTH.ts diff --git a/lib/commands/BGREWRITEAOF.spec.ts b/packages/client/lib/commands/BGREWRITEAOF.spec.ts similarity index 100% rename from lib/commands/BGREWRITEAOF.spec.ts rename to packages/client/lib/commands/BGREWRITEAOF.spec.ts diff --git a/lib/commands/BGREWRITEAOF.ts b/packages/client/lib/commands/BGREWRITEAOF.ts similarity index 100% rename from lib/commands/BGREWRITEAOF.ts rename to packages/client/lib/commands/BGREWRITEAOF.ts diff --git a/lib/commands/BGSAVE.spec.ts b/packages/client/lib/commands/BGSAVE.spec.ts similarity index 100% rename from lib/commands/BGSAVE.spec.ts rename to packages/client/lib/commands/BGSAVE.spec.ts diff --git a/lib/commands/BGSAVE.ts b/packages/client/lib/commands/BGSAVE.ts similarity index 100% rename from lib/commands/BGSAVE.ts rename to packages/client/lib/commands/BGSAVE.ts diff --git a/lib/commands/BITCOUNT.spec.ts b/packages/client/lib/commands/BITCOUNT.spec.ts similarity index 100% rename from lib/commands/BITCOUNT.spec.ts rename to packages/client/lib/commands/BITCOUNT.spec.ts diff --git a/lib/commands/BITCOUNT.ts b/packages/client/lib/commands/BITCOUNT.ts similarity index 100% rename from lib/commands/BITCOUNT.ts rename to packages/client/lib/commands/BITCOUNT.ts diff --git a/lib/commands/BITFIELD.spec.ts b/packages/client/lib/commands/BITFIELD.spec.ts similarity index 100% rename from lib/commands/BITFIELD.spec.ts rename to packages/client/lib/commands/BITFIELD.spec.ts diff --git a/lib/commands/BITFIELD.ts b/packages/client/lib/commands/BITFIELD.ts similarity index 100% rename from lib/commands/BITFIELD.ts rename to packages/client/lib/commands/BITFIELD.ts diff --git a/lib/commands/BITOP.spec.ts b/packages/client/lib/commands/BITOP.spec.ts similarity index 100% rename from lib/commands/BITOP.spec.ts rename to packages/client/lib/commands/BITOP.spec.ts diff --git a/lib/commands/BITOP.ts b/packages/client/lib/commands/BITOP.ts similarity index 100% rename from lib/commands/BITOP.ts rename to packages/client/lib/commands/BITOP.ts diff --git a/lib/commands/BITPOS.spec.ts b/packages/client/lib/commands/BITPOS.spec.ts similarity index 100% rename from lib/commands/BITPOS.spec.ts rename to packages/client/lib/commands/BITPOS.spec.ts diff --git a/lib/commands/BITPOS.ts b/packages/client/lib/commands/BITPOS.ts similarity index 100% rename from lib/commands/BITPOS.ts rename to packages/client/lib/commands/BITPOS.ts diff --git a/lib/commands/BLMOVE.spec.ts b/packages/client/lib/commands/BLMOVE.spec.ts similarity index 100% rename from lib/commands/BLMOVE.spec.ts rename to packages/client/lib/commands/BLMOVE.spec.ts diff --git a/lib/commands/BLMOVE.ts b/packages/client/lib/commands/BLMOVE.ts similarity index 100% rename from lib/commands/BLMOVE.ts rename to packages/client/lib/commands/BLMOVE.ts diff --git a/lib/commands/BLPOP.spec.ts b/packages/client/lib/commands/BLPOP.spec.ts similarity index 100% rename from lib/commands/BLPOP.spec.ts rename to packages/client/lib/commands/BLPOP.spec.ts diff --git a/lib/commands/BLPOP.ts b/packages/client/lib/commands/BLPOP.ts similarity index 100% rename from lib/commands/BLPOP.ts rename to packages/client/lib/commands/BLPOP.ts diff --git a/lib/commands/BRPOP.spec.ts b/packages/client/lib/commands/BRPOP.spec.ts similarity index 100% rename from lib/commands/BRPOP.spec.ts rename to packages/client/lib/commands/BRPOP.spec.ts diff --git a/lib/commands/BRPOP.ts b/packages/client/lib/commands/BRPOP.ts similarity index 100% rename from lib/commands/BRPOP.ts rename to packages/client/lib/commands/BRPOP.ts diff --git a/lib/commands/BRPOPLPUSH.spec.ts b/packages/client/lib/commands/BRPOPLPUSH.spec.ts similarity index 100% rename from lib/commands/BRPOPLPUSH.spec.ts rename to packages/client/lib/commands/BRPOPLPUSH.spec.ts diff --git a/lib/commands/BRPOPLPUSH.ts b/packages/client/lib/commands/BRPOPLPUSH.ts similarity index 100% rename from lib/commands/BRPOPLPUSH.ts rename to packages/client/lib/commands/BRPOPLPUSH.ts diff --git a/lib/commands/BZPOPMAX.spec.ts b/packages/client/lib/commands/BZPOPMAX.spec.ts similarity index 100% rename from lib/commands/BZPOPMAX.spec.ts rename to packages/client/lib/commands/BZPOPMAX.spec.ts diff --git a/lib/commands/BZPOPMAX.ts b/packages/client/lib/commands/BZPOPMAX.ts similarity index 100% rename from lib/commands/BZPOPMAX.ts rename to packages/client/lib/commands/BZPOPMAX.ts diff --git a/lib/commands/BZPOPMIN.spec.ts b/packages/client/lib/commands/BZPOPMIN.spec.ts similarity index 100% rename from lib/commands/BZPOPMIN.spec.ts rename to packages/client/lib/commands/BZPOPMIN.spec.ts diff --git a/lib/commands/BZPOPMIN.ts b/packages/client/lib/commands/BZPOPMIN.ts similarity index 100% rename from lib/commands/BZPOPMIN.ts rename to packages/client/lib/commands/BZPOPMIN.ts diff --git a/lib/commands/CLIENT_ID.spec.ts b/packages/client/lib/commands/CLIENT_ID.spec.ts similarity index 100% rename from lib/commands/CLIENT_ID.spec.ts rename to packages/client/lib/commands/CLIENT_ID.spec.ts diff --git a/lib/commands/CLIENT_ID.ts b/packages/client/lib/commands/CLIENT_ID.ts similarity index 100% rename from lib/commands/CLIENT_ID.ts rename to packages/client/lib/commands/CLIENT_ID.ts diff --git a/lib/commands/CLIENT_INFO.spec.ts b/packages/client/lib/commands/CLIENT_INFO.spec.ts similarity index 100% rename from lib/commands/CLIENT_INFO.spec.ts rename to packages/client/lib/commands/CLIENT_INFO.spec.ts diff --git a/lib/commands/CLIENT_INFO.ts b/packages/client/lib/commands/CLIENT_INFO.ts similarity index 100% rename from lib/commands/CLIENT_INFO.ts rename to packages/client/lib/commands/CLIENT_INFO.ts diff --git a/lib/commands/CLUSTER_ADDSLOTS.spec.ts b/packages/client/lib/commands/CLUSTER_ADDSLOTS.spec.ts similarity index 100% rename from lib/commands/CLUSTER_ADDSLOTS.spec.ts rename to packages/client/lib/commands/CLUSTER_ADDSLOTS.spec.ts diff --git a/lib/commands/CLUSTER_ADDSLOTS.ts b/packages/client/lib/commands/CLUSTER_ADDSLOTS.ts similarity index 100% rename from lib/commands/CLUSTER_ADDSLOTS.ts rename to packages/client/lib/commands/CLUSTER_ADDSLOTS.ts diff --git a/lib/commands/CLUSTER_FLUSHSLOTS.spec.ts b/packages/client/lib/commands/CLUSTER_FLUSHSLOTS.spec.ts similarity index 100% rename from lib/commands/CLUSTER_FLUSHSLOTS.spec.ts rename to packages/client/lib/commands/CLUSTER_FLUSHSLOTS.spec.ts diff --git a/lib/commands/CLUSTER_FLUSHSLOTS.ts b/packages/client/lib/commands/CLUSTER_FLUSHSLOTS.ts similarity index 100% rename from lib/commands/CLUSTER_FLUSHSLOTS.ts rename to packages/client/lib/commands/CLUSTER_FLUSHSLOTS.ts diff --git a/lib/commands/CLUSTER_GETKEYSINSLOT.spec.ts b/packages/client/lib/commands/CLUSTER_GETKEYSINSLOT.spec.ts similarity index 100% rename from lib/commands/CLUSTER_GETKEYSINSLOT.spec.ts rename to packages/client/lib/commands/CLUSTER_GETKEYSINSLOT.spec.ts diff --git a/lib/commands/CLUSTER_GETKEYSINSLOT.ts b/packages/client/lib/commands/CLUSTER_GETKEYSINSLOT.ts similarity index 100% rename from lib/commands/CLUSTER_GETKEYSINSLOT.ts rename to packages/client/lib/commands/CLUSTER_GETKEYSINSLOT.ts diff --git a/lib/commands/CLUSTER_INFO.spec.ts b/packages/client/lib/commands/CLUSTER_INFO.spec.ts similarity index 100% rename from lib/commands/CLUSTER_INFO.spec.ts rename to packages/client/lib/commands/CLUSTER_INFO.spec.ts diff --git a/lib/commands/CLUSTER_INFO.ts b/packages/client/lib/commands/CLUSTER_INFO.ts similarity index 100% rename from lib/commands/CLUSTER_INFO.ts rename to packages/client/lib/commands/CLUSTER_INFO.ts diff --git a/lib/commands/CLUSTER_MEET.spec.ts b/packages/client/lib/commands/CLUSTER_MEET.spec.ts similarity index 100% rename from lib/commands/CLUSTER_MEET.spec.ts rename to packages/client/lib/commands/CLUSTER_MEET.spec.ts diff --git a/lib/commands/CLUSTER_MEET.ts b/packages/client/lib/commands/CLUSTER_MEET.ts similarity index 100% rename from lib/commands/CLUSTER_MEET.ts rename to packages/client/lib/commands/CLUSTER_MEET.ts diff --git a/lib/commands/CLUSTER_NODES.spec.ts b/packages/client/lib/commands/CLUSTER_NODES.spec.ts similarity index 100% rename from lib/commands/CLUSTER_NODES.spec.ts rename to packages/client/lib/commands/CLUSTER_NODES.spec.ts diff --git a/lib/commands/CLUSTER_NODES.ts b/packages/client/lib/commands/CLUSTER_NODES.ts similarity index 100% rename from lib/commands/CLUSTER_NODES.ts rename to packages/client/lib/commands/CLUSTER_NODES.ts diff --git a/lib/commands/CLUSTER_RESET.spec.ts b/packages/client/lib/commands/CLUSTER_RESET.spec.ts similarity index 100% rename from lib/commands/CLUSTER_RESET.spec.ts rename to packages/client/lib/commands/CLUSTER_RESET.spec.ts diff --git a/lib/commands/CLUSTER_RESET.ts b/packages/client/lib/commands/CLUSTER_RESET.ts similarity index 100% rename from lib/commands/CLUSTER_RESET.ts rename to packages/client/lib/commands/CLUSTER_RESET.ts diff --git a/lib/commands/CLUSTER_SETSLOT.spec.ts b/packages/client/lib/commands/CLUSTER_SETSLOT.spec.ts similarity index 100% rename from lib/commands/CLUSTER_SETSLOT.spec.ts rename to packages/client/lib/commands/CLUSTER_SETSLOT.spec.ts diff --git a/lib/commands/CLUSTER_SETSLOT.ts b/packages/client/lib/commands/CLUSTER_SETSLOT.ts similarity index 100% rename from lib/commands/CLUSTER_SETSLOT.ts rename to packages/client/lib/commands/CLUSTER_SETSLOT.ts diff --git a/lib/commands/CLUSTER_SLOTS.spec.ts b/packages/client/lib/commands/CLUSTER_SLOTS.spec.ts similarity index 100% rename from lib/commands/CLUSTER_SLOTS.spec.ts rename to packages/client/lib/commands/CLUSTER_SLOTS.spec.ts diff --git a/lib/commands/CLUSTER_SLOTS.ts b/packages/client/lib/commands/CLUSTER_SLOTS.ts similarity index 100% rename from lib/commands/CLUSTER_SLOTS.ts rename to packages/client/lib/commands/CLUSTER_SLOTS.ts diff --git a/lib/commands/COMMAND.spec.ts b/packages/client/lib/commands/COMMAND.spec.ts similarity index 65% rename from lib/commands/COMMAND.spec.ts rename to packages/client/lib/commands/COMMAND.spec.ts index baad79845ab..04ceab2a07c 100644 --- a/lib/commands/COMMAND.spec.ts +++ b/packages/client/lib/commands/COMMAND.spec.ts @@ -11,7 +11,7 @@ describe('COMMAND', () => { ); }); - testUtils.testWithClient('client.command', async client => { - assertPingCommand((await client.command()).find(command => command.name === 'ping')); - }, GLOBAL.SERVERS.OPEN); + // testUtils.testWithClient('client.command', async client => { + // assertPingCommand((await client.command()).find(command => command.name === 'ping')); + // }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/COMMAND.ts b/packages/client/lib/commands/COMMAND.ts similarity index 100% rename from lib/commands/COMMAND.ts rename to packages/client/lib/commands/COMMAND.ts diff --git a/lib/commands/COMMAND_COUNT.spec.ts b/packages/client/lib/commands/COMMAND_COUNT.spec.ts similarity index 100% rename from lib/commands/COMMAND_COUNT.spec.ts rename to packages/client/lib/commands/COMMAND_COUNT.spec.ts diff --git a/lib/commands/COMMAND_COUNT.ts b/packages/client/lib/commands/COMMAND_COUNT.ts similarity index 100% rename from lib/commands/COMMAND_COUNT.ts rename to packages/client/lib/commands/COMMAND_COUNT.ts diff --git a/lib/commands/COMMAND_GETKEYS.spec.ts b/packages/client/lib/commands/COMMAND_GETKEYS.spec.ts similarity index 100% rename from lib/commands/COMMAND_GETKEYS.spec.ts rename to packages/client/lib/commands/COMMAND_GETKEYS.spec.ts diff --git a/lib/commands/COMMAND_GETKEYS.ts b/packages/client/lib/commands/COMMAND_GETKEYS.ts similarity index 100% rename from lib/commands/COMMAND_GETKEYS.ts rename to packages/client/lib/commands/COMMAND_GETKEYS.ts diff --git a/lib/commands/COMMAND_INFO.spec.ts b/packages/client/lib/commands/COMMAND_INFO.spec.ts similarity index 100% rename from lib/commands/COMMAND_INFO.spec.ts rename to packages/client/lib/commands/COMMAND_INFO.spec.ts diff --git a/lib/commands/COMMAND_INFO.ts b/packages/client/lib/commands/COMMAND_INFO.ts similarity index 100% rename from lib/commands/COMMAND_INFO.ts rename to packages/client/lib/commands/COMMAND_INFO.ts diff --git a/lib/commands/CONFIG_GET.spec.ts b/packages/client/lib/commands/CONFIG_GET.spec.ts similarity index 100% rename from lib/commands/CONFIG_GET.spec.ts rename to packages/client/lib/commands/CONFIG_GET.spec.ts diff --git a/lib/commands/CONFIG_GET.ts b/packages/client/lib/commands/CONFIG_GET.ts similarity index 100% rename from lib/commands/CONFIG_GET.ts rename to packages/client/lib/commands/CONFIG_GET.ts diff --git a/lib/commands/CONFIG_RESETSTAT.spec.ts b/packages/client/lib/commands/CONFIG_RESETSTAT.spec.ts similarity index 100% rename from lib/commands/CONFIG_RESETSTAT.spec.ts rename to packages/client/lib/commands/CONFIG_RESETSTAT.spec.ts diff --git a/lib/commands/CONFIG_RESETSTAT.ts b/packages/client/lib/commands/CONFIG_RESETSTAT.ts similarity index 100% rename from lib/commands/CONFIG_RESETSTAT.ts rename to packages/client/lib/commands/CONFIG_RESETSTAT.ts diff --git a/lib/commands/CONFIG_REWRITE.spec.ts b/packages/client/lib/commands/CONFIG_REWRITE.spec.ts similarity index 100% rename from lib/commands/CONFIG_REWRITE.spec.ts rename to packages/client/lib/commands/CONFIG_REWRITE.spec.ts diff --git a/lib/commands/CONFIG_REWRITE.ts b/packages/client/lib/commands/CONFIG_REWRITE.ts similarity index 100% rename from lib/commands/CONFIG_REWRITE.ts rename to packages/client/lib/commands/CONFIG_REWRITE.ts diff --git a/lib/commands/CONFIG_SET.spec.ts b/packages/client/lib/commands/CONFIG_SET.spec.ts similarity index 100% rename from lib/commands/CONFIG_SET.spec.ts rename to packages/client/lib/commands/CONFIG_SET.spec.ts diff --git a/lib/commands/CONFIG_SET.ts b/packages/client/lib/commands/CONFIG_SET.ts similarity index 100% rename from lib/commands/CONFIG_SET.ts rename to packages/client/lib/commands/CONFIG_SET.ts diff --git a/lib/commands/COPY.spec.ts b/packages/client/lib/commands/COPY.spec.ts similarity index 100% rename from lib/commands/COPY.spec.ts rename to packages/client/lib/commands/COPY.spec.ts diff --git a/lib/commands/COPY.ts b/packages/client/lib/commands/COPY.ts similarity index 100% rename from lib/commands/COPY.ts rename to packages/client/lib/commands/COPY.ts diff --git a/lib/commands/DBSIZE.spec.ts b/packages/client/lib/commands/DBSIZE.spec.ts similarity index 100% rename from lib/commands/DBSIZE.spec.ts rename to packages/client/lib/commands/DBSIZE.spec.ts diff --git a/lib/commands/DBSIZE.ts b/packages/client/lib/commands/DBSIZE.ts similarity index 100% rename from lib/commands/DBSIZE.ts rename to packages/client/lib/commands/DBSIZE.ts diff --git a/lib/commands/DECR.spec.ts b/packages/client/lib/commands/DECR.spec.ts similarity index 100% rename from lib/commands/DECR.spec.ts rename to packages/client/lib/commands/DECR.spec.ts diff --git a/lib/commands/DECR.ts b/packages/client/lib/commands/DECR.ts similarity index 100% rename from lib/commands/DECR.ts rename to packages/client/lib/commands/DECR.ts diff --git a/lib/commands/DECRBY.spec.ts b/packages/client/lib/commands/DECRBY.spec.ts similarity index 100% rename from lib/commands/DECRBY.spec.ts rename to packages/client/lib/commands/DECRBY.spec.ts diff --git a/lib/commands/DECRBY.ts b/packages/client/lib/commands/DECRBY.ts similarity index 100% rename from lib/commands/DECRBY.ts rename to packages/client/lib/commands/DECRBY.ts diff --git a/lib/commands/DEL.spec.ts b/packages/client/lib/commands/DEL.spec.ts similarity index 100% rename from lib/commands/DEL.spec.ts rename to packages/client/lib/commands/DEL.spec.ts diff --git a/lib/commands/DEL.ts b/packages/client/lib/commands/DEL.ts similarity index 100% rename from lib/commands/DEL.ts rename to packages/client/lib/commands/DEL.ts diff --git a/lib/commands/DISCARD.spec.ts b/packages/client/lib/commands/DISCARD.spec.ts similarity index 100% rename from lib/commands/DISCARD.spec.ts rename to packages/client/lib/commands/DISCARD.spec.ts diff --git a/lib/commands/DISCARD.ts b/packages/client/lib/commands/DISCARD.ts similarity index 100% rename from lib/commands/DISCARD.ts rename to packages/client/lib/commands/DISCARD.ts diff --git a/lib/commands/DUMP.spec.ts b/packages/client/lib/commands/DUMP.spec.ts similarity index 100% rename from lib/commands/DUMP.spec.ts rename to packages/client/lib/commands/DUMP.spec.ts diff --git a/lib/commands/DUMP.ts b/packages/client/lib/commands/DUMP.ts similarity index 100% rename from lib/commands/DUMP.ts rename to packages/client/lib/commands/DUMP.ts diff --git a/lib/commands/ECHO.spec.ts b/packages/client/lib/commands/ECHO.spec.ts similarity index 100% rename from lib/commands/ECHO.spec.ts rename to packages/client/lib/commands/ECHO.spec.ts diff --git a/lib/commands/ECHO.ts b/packages/client/lib/commands/ECHO.ts similarity index 100% rename from lib/commands/ECHO.ts rename to packages/client/lib/commands/ECHO.ts diff --git a/lib/commands/EVAL.spec.ts b/packages/client/lib/commands/EVAL.spec.ts similarity index 100% rename from lib/commands/EVAL.spec.ts rename to packages/client/lib/commands/EVAL.spec.ts diff --git a/lib/commands/EVAL.ts b/packages/client/lib/commands/EVAL.ts similarity index 100% rename from lib/commands/EVAL.ts rename to packages/client/lib/commands/EVAL.ts diff --git a/lib/commands/EVALSHA.spec.ts b/packages/client/lib/commands/EVALSHA.spec.ts similarity index 100% rename from lib/commands/EVALSHA.spec.ts rename to packages/client/lib/commands/EVALSHA.spec.ts diff --git a/lib/commands/EVALSHA.ts b/packages/client/lib/commands/EVALSHA.ts similarity index 100% rename from lib/commands/EVALSHA.ts rename to packages/client/lib/commands/EVALSHA.ts diff --git a/lib/commands/EXISTS.spec.ts b/packages/client/lib/commands/EXISTS.spec.ts similarity index 100% rename from lib/commands/EXISTS.spec.ts rename to packages/client/lib/commands/EXISTS.spec.ts diff --git a/lib/commands/EXISTS.ts b/packages/client/lib/commands/EXISTS.ts similarity index 100% rename from lib/commands/EXISTS.ts rename to packages/client/lib/commands/EXISTS.ts diff --git a/lib/commands/EXPIRE.spec.ts b/packages/client/lib/commands/EXPIRE.spec.ts similarity index 100% rename from lib/commands/EXPIRE.spec.ts rename to packages/client/lib/commands/EXPIRE.spec.ts diff --git a/lib/commands/EXPIRE.ts b/packages/client/lib/commands/EXPIRE.ts similarity index 100% rename from lib/commands/EXPIRE.ts rename to packages/client/lib/commands/EXPIRE.ts diff --git a/lib/commands/EXPIREAT.spec.ts b/packages/client/lib/commands/EXPIREAT.spec.ts similarity index 100% rename from lib/commands/EXPIREAT.spec.ts rename to packages/client/lib/commands/EXPIREAT.spec.ts diff --git a/lib/commands/EXPIREAT.ts b/packages/client/lib/commands/EXPIREAT.ts similarity index 100% rename from lib/commands/EXPIREAT.ts rename to packages/client/lib/commands/EXPIREAT.ts diff --git a/lib/commands/FAILOVER.spec.ts b/packages/client/lib/commands/FAILOVER.spec.ts similarity index 100% rename from lib/commands/FAILOVER.spec.ts rename to packages/client/lib/commands/FAILOVER.spec.ts diff --git a/lib/commands/FAILOVER.ts b/packages/client/lib/commands/FAILOVER.ts similarity index 100% rename from lib/commands/FAILOVER.ts rename to packages/client/lib/commands/FAILOVER.ts diff --git a/lib/commands/FLUSHALL.spec.ts b/packages/client/lib/commands/FLUSHALL.spec.ts similarity index 100% rename from lib/commands/FLUSHALL.spec.ts rename to packages/client/lib/commands/FLUSHALL.spec.ts diff --git a/lib/commands/FLUSHALL.ts b/packages/client/lib/commands/FLUSHALL.ts similarity index 100% rename from lib/commands/FLUSHALL.ts rename to packages/client/lib/commands/FLUSHALL.ts diff --git a/lib/commands/FLUSHDB.spec.ts b/packages/client/lib/commands/FLUSHDB.spec.ts similarity index 100% rename from lib/commands/FLUSHDB.spec.ts rename to packages/client/lib/commands/FLUSHDB.spec.ts diff --git a/lib/commands/FLUSHDB.ts b/packages/client/lib/commands/FLUSHDB.ts similarity index 100% rename from lib/commands/FLUSHDB.ts rename to packages/client/lib/commands/FLUSHDB.ts diff --git a/lib/commands/GEOADD.spec.ts b/packages/client/lib/commands/GEOADD.spec.ts similarity index 100% rename from lib/commands/GEOADD.spec.ts rename to packages/client/lib/commands/GEOADD.spec.ts diff --git a/lib/commands/GEOADD.ts b/packages/client/lib/commands/GEOADD.ts similarity index 100% rename from lib/commands/GEOADD.ts rename to packages/client/lib/commands/GEOADD.ts diff --git a/lib/commands/GEODIST.spec.ts b/packages/client/lib/commands/GEODIST.spec.ts similarity index 100% rename from lib/commands/GEODIST.spec.ts rename to packages/client/lib/commands/GEODIST.spec.ts diff --git a/lib/commands/GEODIST.ts b/packages/client/lib/commands/GEODIST.ts similarity index 100% rename from lib/commands/GEODIST.ts rename to packages/client/lib/commands/GEODIST.ts diff --git a/lib/commands/GEOHASH.spec.ts b/packages/client/lib/commands/GEOHASH.spec.ts similarity index 100% rename from lib/commands/GEOHASH.spec.ts rename to packages/client/lib/commands/GEOHASH.spec.ts diff --git a/lib/commands/GEOHASH.ts b/packages/client/lib/commands/GEOHASH.ts similarity index 100% rename from lib/commands/GEOHASH.ts rename to packages/client/lib/commands/GEOHASH.ts diff --git a/lib/commands/GEOPOS.spec.ts b/packages/client/lib/commands/GEOPOS.spec.ts similarity index 100% rename from lib/commands/GEOPOS.spec.ts rename to packages/client/lib/commands/GEOPOS.spec.ts diff --git a/lib/commands/GEOPOS.ts b/packages/client/lib/commands/GEOPOS.ts similarity index 100% rename from lib/commands/GEOPOS.ts rename to packages/client/lib/commands/GEOPOS.ts diff --git a/lib/commands/GEOSEARCH.spec.ts b/packages/client/lib/commands/GEOSEARCH.spec.ts similarity index 100% rename from lib/commands/GEOSEARCH.spec.ts rename to packages/client/lib/commands/GEOSEARCH.spec.ts diff --git a/lib/commands/GEOSEARCH.ts b/packages/client/lib/commands/GEOSEARCH.ts similarity index 100% rename from lib/commands/GEOSEARCH.ts rename to packages/client/lib/commands/GEOSEARCH.ts diff --git a/lib/commands/GEOSEARCHSTORE.spec.ts b/packages/client/lib/commands/GEOSEARCHSTORE.spec.ts similarity index 100% rename from lib/commands/GEOSEARCHSTORE.spec.ts rename to packages/client/lib/commands/GEOSEARCHSTORE.spec.ts diff --git a/lib/commands/GEOSEARCHSTORE.ts b/packages/client/lib/commands/GEOSEARCHSTORE.ts similarity index 100% rename from lib/commands/GEOSEARCHSTORE.ts rename to packages/client/lib/commands/GEOSEARCHSTORE.ts diff --git a/lib/commands/GEOSEARCH_WITH.spec.ts b/packages/client/lib/commands/GEOSEARCH_WITH.spec.ts similarity index 100% rename from lib/commands/GEOSEARCH_WITH.spec.ts rename to packages/client/lib/commands/GEOSEARCH_WITH.spec.ts diff --git a/lib/commands/GEOSEARCH_WITH.ts b/packages/client/lib/commands/GEOSEARCH_WITH.ts similarity index 100% rename from lib/commands/GEOSEARCH_WITH.ts rename to packages/client/lib/commands/GEOSEARCH_WITH.ts diff --git a/lib/commands/GET.spec.ts b/packages/client/lib/commands/GET.spec.ts similarity index 100% rename from lib/commands/GET.spec.ts rename to packages/client/lib/commands/GET.spec.ts diff --git a/lib/commands/GET.ts b/packages/client/lib/commands/GET.ts similarity index 100% rename from lib/commands/GET.ts rename to packages/client/lib/commands/GET.ts diff --git a/lib/commands/GETBIT.spec.ts b/packages/client/lib/commands/GETBIT.spec.ts similarity index 100% rename from lib/commands/GETBIT.spec.ts rename to packages/client/lib/commands/GETBIT.spec.ts diff --git a/lib/commands/GETBIT.ts b/packages/client/lib/commands/GETBIT.ts similarity index 100% rename from lib/commands/GETBIT.ts rename to packages/client/lib/commands/GETBIT.ts diff --git a/lib/commands/GETDEL.spec.ts b/packages/client/lib/commands/GETDEL.spec.ts similarity index 100% rename from lib/commands/GETDEL.spec.ts rename to packages/client/lib/commands/GETDEL.spec.ts diff --git a/lib/commands/GETDEL.ts b/packages/client/lib/commands/GETDEL.ts similarity index 100% rename from lib/commands/GETDEL.ts rename to packages/client/lib/commands/GETDEL.ts diff --git a/lib/commands/GETEX.spec.ts b/packages/client/lib/commands/GETEX.spec.ts similarity index 100% rename from lib/commands/GETEX.spec.ts rename to packages/client/lib/commands/GETEX.spec.ts diff --git a/lib/commands/GETEX.ts b/packages/client/lib/commands/GETEX.ts similarity index 100% rename from lib/commands/GETEX.ts rename to packages/client/lib/commands/GETEX.ts diff --git a/lib/commands/GETRANGE.spec.ts b/packages/client/lib/commands/GETRANGE.spec.ts similarity index 100% rename from lib/commands/GETRANGE.spec.ts rename to packages/client/lib/commands/GETRANGE.spec.ts diff --git a/lib/commands/GETRANGE.ts b/packages/client/lib/commands/GETRANGE.ts similarity index 100% rename from lib/commands/GETRANGE.ts rename to packages/client/lib/commands/GETRANGE.ts diff --git a/lib/commands/GETSET.spec.ts b/packages/client/lib/commands/GETSET.spec.ts similarity index 100% rename from lib/commands/GETSET.spec.ts rename to packages/client/lib/commands/GETSET.spec.ts diff --git a/lib/commands/GETSET.ts b/packages/client/lib/commands/GETSET.ts similarity index 100% rename from lib/commands/GETSET.ts rename to packages/client/lib/commands/GETSET.ts diff --git a/lib/commands/GET_BUFFER.spec.ts b/packages/client/lib/commands/GET_BUFFER.spec.ts similarity index 100% rename from lib/commands/GET_BUFFER.spec.ts rename to packages/client/lib/commands/GET_BUFFER.spec.ts diff --git a/lib/commands/GET_BUFFER.ts b/packages/client/lib/commands/GET_BUFFER.ts similarity index 100% rename from lib/commands/GET_BUFFER.ts rename to packages/client/lib/commands/GET_BUFFER.ts diff --git a/lib/commands/HDEL.spec.ts b/packages/client/lib/commands/HDEL.spec.ts similarity index 100% rename from lib/commands/HDEL.spec.ts rename to packages/client/lib/commands/HDEL.spec.ts diff --git a/lib/commands/HDEL.ts b/packages/client/lib/commands/HDEL.ts similarity index 100% rename from lib/commands/HDEL.ts rename to packages/client/lib/commands/HDEL.ts diff --git a/lib/commands/HELLO.spec.ts b/packages/client/lib/commands/HELLO.spec.ts similarity index 100% rename from lib/commands/HELLO.spec.ts rename to packages/client/lib/commands/HELLO.spec.ts diff --git a/lib/commands/HELLO.ts b/packages/client/lib/commands/HELLO.ts similarity index 100% rename from lib/commands/HELLO.ts rename to packages/client/lib/commands/HELLO.ts diff --git a/lib/commands/HEXISTS.spec.ts b/packages/client/lib/commands/HEXISTS.spec.ts similarity index 100% rename from lib/commands/HEXISTS.spec.ts rename to packages/client/lib/commands/HEXISTS.spec.ts diff --git a/lib/commands/HEXISTS.ts b/packages/client/lib/commands/HEXISTS.ts similarity index 100% rename from lib/commands/HEXISTS.ts rename to packages/client/lib/commands/HEXISTS.ts diff --git a/lib/commands/HGET.spec.ts b/packages/client/lib/commands/HGET.spec.ts similarity index 100% rename from lib/commands/HGET.spec.ts rename to packages/client/lib/commands/HGET.spec.ts diff --git a/lib/commands/HGET.ts b/packages/client/lib/commands/HGET.ts similarity index 100% rename from lib/commands/HGET.ts rename to packages/client/lib/commands/HGET.ts diff --git a/lib/commands/HGETALL.spec.ts b/packages/client/lib/commands/HGETALL.spec.ts similarity index 100% rename from lib/commands/HGETALL.spec.ts rename to packages/client/lib/commands/HGETALL.spec.ts diff --git a/lib/commands/HGETALL.ts b/packages/client/lib/commands/HGETALL.ts similarity index 100% rename from lib/commands/HGETALL.ts rename to packages/client/lib/commands/HGETALL.ts diff --git a/lib/commands/HINCRBY.spec.ts b/packages/client/lib/commands/HINCRBY.spec.ts similarity index 100% rename from lib/commands/HINCRBY.spec.ts rename to packages/client/lib/commands/HINCRBY.spec.ts diff --git a/lib/commands/HINCRBY.ts b/packages/client/lib/commands/HINCRBY.ts similarity index 100% rename from lib/commands/HINCRBY.ts rename to packages/client/lib/commands/HINCRBY.ts diff --git a/lib/commands/HINCRBYFLOAT.spec.ts b/packages/client/lib/commands/HINCRBYFLOAT.spec.ts similarity index 100% rename from lib/commands/HINCRBYFLOAT.spec.ts rename to packages/client/lib/commands/HINCRBYFLOAT.spec.ts diff --git a/lib/commands/HINCRBYFLOAT.ts b/packages/client/lib/commands/HINCRBYFLOAT.ts similarity index 100% rename from lib/commands/HINCRBYFLOAT.ts rename to packages/client/lib/commands/HINCRBYFLOAT.ts diff --git a/lib/commands/HKEYS.spec.ts b/packages/client/lib/commands/HKEYS.spec.ts similarity index 100% rename from lib/commands/HKEYS.spec.ts rename to packages/client/lib/commands/HKEYS.spec.ts diff --git a/lib/commands/HKEYS.ts b/packages/client/lib/commands/HKEYS.ts similarity index 100% rename from lib/commands/HKEYS.ts rename to packages/client/lib/commands/HKEYS.ts diff --git a/lib/commands/HLEN.spec.ts b/packages/client/lib/commands/HLEN.spec.ts similarity index 100% rename from lib/commands/HLEN.spec.ts rename to packages/client/lib/commands/HLEN.spec.ts diff --git a/lib/commands/HLEN.ts b/packages/client/lib/commands/HLEN.ts similarity index 100% rename from lib/commands/HLEN.ts rename to packages/client/lib/commands/HLEN.ts diff --git a/lib/commands/HMGET.spec.ts b/packages/client/lib/commands/HMGET.spec.ts similarity index 100% rename from lib/commands/HMGET.spec.ts rename to packages/client/lib/commands/HMGET.spec.ts diff --git a/lib/commands/HMGET.ts b/packages/client/lib/commands/HMGET.ts similarity index 100% rename from lib/commands/HMGET.ts rename to packages/client/lib/commands/HMGET.ts diff --git a/lib/commands/HRANDFIELD.spec.ts b/packages/client/lib/commands/HRANDFIELD.spec.ts similarity index 100% rename from lib/commands/HRANDFIELD.spec.ts rename to packages/client/lib/commands/HRANDFIELD.spec.ts diff --git a/lib/commands/HRANDFIELD.ts b/packages/client/lib/commands/HRANDFIELD.ts similarity index 100% rename from lib/commands/HRANDFIELD.ts rename to packages/client/lib/commands/HRANDFIELD.ts diff --git a/lib/commands/HRANDFIELD_COUNT.spec.ts b/packages/client/lib/commands/HRANDFIELD_COUNT.spec.ts similarity index 100% rename from lib/commands/HRANDFIELD_COUNT.spec.ts rename to packages/client/lib/commands/HRANDFIELD_COUNT.spec.ts diff --git a/lib/commands/HRANDFIELD_COUNT.ts b/packages/client/lib/commands/HRANDFIELD_COUNT.ts similarity index 100% rename from lib/commands/HRANDFIELD_COUNT.ts rename to packages/client/lib/commands/HRANDFIELD_COUNT.ts diff --git a/lib/commands/HRANDFIELD_COUNT_WITHVALUES.spec.ts b/packages/client/lib/commands/HRANDFIELD_COUNT_WITHVALUES.spec.ts similarity index 100% rename from lib/commands/HRANDFIELD_COUNT_WITHVALUES.spec.ts rename to packages/client/lib/commands/HRANDFIELD_COUNT_WITHVALUES.spec.ts diff --git a/lib/commands/HRANDFIELD_COUNT_WITHVALUES.ts b/packages/client/lib/commands/HRANDFIELD_COUNT_WITHVALUES.ts similarity index 100% rename from lib/commands/HRANDFIELD_COUNT_WITHVALUES.ts rename to packages/client/lib/commands/HRANDFIELD_COUNT_WITHVALUES.ts diff --git a/lib/commands/HSCAN.spec.ts b/packages/client/lib/commands/HSCAN.spec.ts similarity index 100% rename from lib/commands/HSCAN.spec.ts rename to packages/client/lib/commands/HSCAN.spec.ts diff --git a/lib/commands/HSCAN.ts b/packages/client/lib/commands/HSCAN.ts similarity index 100% rename from lib/commands/HSCAN.ts rename to packages/client/lib/commands/HSCAN.ts diff --git a/lib/commands/HSET.spec.ts b/packages/client/lib/commands/HSET.spec.ts similarity index 100% rename from lib/commands/HSET.spec.ts rename to packages/client/lib/commands/HSET.spec.ts diff --git a/lib/commands/HSET.ts b/packages/client/lib/commands/HSET.ts similarity index 100% rename from lib/commands/HSET.ts rename to packages/client/lib/commands/HSET.ts diff --git a/lib/commands/HSETNX.spec.ts b/packages/client/lib/commands/HSETNX.spec.ts similarity index 100% rename from lib/commands/HSETNX.spec.ts rename to packages/client/lib/commands/HSETNX.spec.ts diff --git a/lib/commands/HSETNX.ts b/packages/client/lib/commands/HSETNX.ts similarity index 100% rename from lib/commands/HSETNX.ts rename to packages/client/lib/commands/HSETNX.ts diff --git a/lib/commands/HSTRLEN.spec.ts b/packages/client/lib/commands/HSTRLEN.spec.ts similarity index 100% rename from lib/commands/HSTRLEN.spec.ts rename to packages/client/lib/commands/HSTRLEN.spec.ts diff --git a/lib/commands/HSTRLEN.ts b/packages/client/lib/commands/HSTRLEN.ts similarity index 100% rename from lib/commands/HSTRLEN.ts rename to packages/client/lib/commands/HSTRLEN.ts diff --git a/lib/commands/HVALS.spec.ts b/packages/client/lib/commands/HVALS.spec.ts similarity index 100% rename from lib/commands/HVALS.spec.ts rename to packages/client/lib/commands/HVALS.spec.ts diff --git a/lib/commands/HVALS.ts b/packages/client/lib/commands/HVALS.ts similarity index 100% rename from lib/commands/HVALS.ts rename to packages/client/lib/commands/HVALS.ts diff --git a/lib/commands/INCR.spec.ts b/packages/client/lib/commands/INCR.spec.ts similarity index 100% rename from lib/commands/INCR.spec.ts rename to packages/client/lib/commands/INCR.spec.ts diff --git a/lib/commands/INCR.ts b/packages/client/lib/commands/INCR.ts similarity index 100% rename from lib/commands/INCR.ts rename to packages/client/lib/commands/INCR.ts diff --git a/lib/commands/INCRBY.spec.ts b/packages/client/lib/commands/INCRBY.spec.ts similarity index 100% rename from lib/commands/INCRBY.spec.ts rename to packages/client/lib/commands/INCRBY.spec.ts diff --git a/lib/commands/INCRBY.ts b/packages/client/lib/commands/INCRBY.ts similarity index 100% rename from lib/commands/INCRBY.ts rename to packages/client/lib/commands/INCRBY.ts diff --git a/lib/commands/INCRBYFLOAT.spec.ts b/packages/client/lib/commands/INCRBYFLOAT.spec.ts similarity index 100% rename from lib/commands/INCRBYFLOAT.spec.ts rename to packages/client/lib/commands/INCRBYFLOAT.spec.ts diff --git a/lib/commands/INCRBYFLOAT.ts b/packages/client/lib/commands/INCRBYFLOAT.ts similarity index 100% rename from lib/commands/INCRBYFLOAT.ts rename to packages/client/lib/commands/INCRBYFLOAT.ts diff --git a/lib/commands/INFO.spec.ts b/packages/client/lib/commands/INFO.spec.ts similarity index 100% rename from lib/commands/INFO.spec.ts rename to packages/client/lib/commands/INFO.spec.ts diff --git a/lib/commands/INFO.ts b/packages/client/lib/commands/INFO.ts similarity index 100% rename from lib/commands/INFO.ts rename to packages/client/lib/commands/INFO.ts diff --git a/lib/commands/KEYS.spec.ts b/packages/client/lib/commands/KEYS.spec.ts similarity index 100% rename from lib/commands/KEYS.spec.ts rename to packages/client/lib/commands/KEYS.spec.ts diff --git a/lib/commands/KEYS.ts b/packages/client/lib/commands/KEYS.ts similarity index 100% rename from lib/commands/KEYS.ts rename to packages/client/lib/commands/KEYS.ts diff --git a/lib/commands/LASTSAVE.spec.ts b/packages/client/lib/commands/LASTSAVE.spec.ts similarity index 100% rename from lib/commands/LASTSAVE.spec.ts rename to packages/client/lib/commands/LASTSAVE.spec.ts diff --git a/lib/commands/LASTSAVE.ts b/packages/client/lib/commands/LASTSAVE.ts similarity index 100% rename from lib/commands/LASTSAVE.ts rename to packages/client/lib/commands/LASTSAVE.ts diff --git a/lib/commands/LINDEX.spec.ts b/packages/client/lib/commands/LINDEX.spec.ts similarity index 100% rename from lib/commands/LINDEX.spec.ts rename to packages/client/lib/commands/LINDEX.spec.ts diff --git a/lib/commands/LINDEX.ts b/packages/client/lib/commands/LINDEX.ts similarity index 100% rename from lib/commands/LINDEX.ts rename to packages/client/lib/commands/LINDEX.ts diff --git a/lib/commands/LINSERT.spec.ts b/packages/client/lib/commands/LINSERT.spec.ts similarity index 100% rename from lib/commands/LINSERT.spec.ts rename to packages/client/lib/commands/LINSERT.spec.ts diff --git a/lib/commands/LINSERT.ts b/packages/client/lib/commands/LINSERT.ts similarity index 100% rename from lib/commands/LINSERT.ts rename to packages/client/lib/commands/LINSERT.ts diff --git a/lib/commands/LLEN.spec.ts b/packages/client/lib/commands/LLEN.spec.ts similarity index 100% rename from lib/commands/LLEN.spec.ts rename to packages/client/lib/commands/LLEN.spec.ts diff --git a/lib/commands/LLEN.ts b/packages/client/lib/commands/LLEN.ts similarity index 100% rename from lib/commands/LLEN.ts rename to packages/client/lib/commands/LLEN.ts diff --git a/lib/commands/LMOVE.spec.ts b/packages/client/lib/commands/LMOVE.spec.ts similarity index 100% rename from lib/commands/LMOVE.spec.ts rename to packages/client/lib/commands/LMOVE.spec.ts diff --git a/lib/commands/LMOVE.ts b/packages/client/lib/commands/LMOVE.ts similarity index 100% rename from lib/commands/LMOVE.ts rename to packages/client/lib/commands/LMOVE.ts diff --git a/lib/commands/LOLWUT.spec.ts b/packages/client/lib/commands/LOLWUT.spec.ts similarity index 100% rename from lib/commands/LOLWUT.spec.ts rename to packages/client/lib/commands/LOLWUT.spec.ts diff --git a/lib/commands/LOLWUT.ts b/packages/client/lib/commands/LOLWUT.ts similarity index 100% rename from lib/commands/LOLWUT.ts rename to packages/client/lib/commands/LOLWUT.ts diff --git a/lib/commands/LPOP.spec.ts b/packages/client/lib/commands/LPOP.spec.ts similarity index 100% rename from lib/commands/LPOP.spec.ts rename to packages/client/lib/commands/LPOP.spec.ts diff --git a/lib/commands/LPOP.ts b/packages/client/lib/commands/LPOP.ts similarity index 100% rename from lib/commands/LPOP.ts rename to packages/client/lib/commands/LPOP.ts diff --git a/lib/commands/LPOP_COUNT.spec.ts b/packages/client/lib/commands/LPOP_COUNT.spec.ts similarity index 100% rename from lib/commands/LPOP_COUNT.spec.ts rename to packages/client/lib/commands/LPOP_COUNT.spec.ts diff --git a/lib/commands/LPOP_COUNT.ts b/packages/client/lib/commands/LPOP_COUNT.ts similarity index 100% rename from lib/commands/LPOP_COUNT.ts rename to packages/client/lib/commands/LPOP_COUNT.ts diff --git a/lib/commands/LPOS.spec.ts b/packages/client/lib/commands/LPOS.spec.ts similarity index 100% rename from lib/commands/LPOS.spec.ts rename to packages/client/lib/commands/LPOS.spec.ts diff --git a/lib/commands/LPOS.ts b/packages/client/lib/commands/LPOS.ts similarity index 100% rename from lib/commands/LPOS.ts rename to packages/client/lib/commands/LPOS.ts diff --git a/lib/commands/LPOS_COUNT.spec.ts b/packages/client/lib/commands/LPOS_COUNT.spec.ts similarity index 100% rename from lib/commands/LPOS_COUNT.spec.ts rename to packages/client/lib/commands/LPOS_COUNT.spec.ts diff --git a/lib/commands/LPOS_COUNT.ts b/packages/client/lib/commands/LPOS_COUNT.ts similarity index 100% rename from lib/commands/LPOS_COUNT.ts rename to packages/client/lib/commands/LPOS_COUNT.ts diff --git a/lib/commands/LPUSH.spec.ts b/packages/client/lib/commands/LPUSH.spec.ts similarity index 100% rename from lib/commands/LPUSH.spec.ts rename to packages/client/lib/commands/LPUSH.spec.ts diff --git a/lib/commands/LPUSH.ts b/packages/client/lib/commands/LPUSH.ts similarity index 100% rename from lib/commands/LPUSH.ts rename to packages/client/lib/commands/LPUSH.ts diff --git a/lib/commands/LPUSHX.spec.ts b/packages/client/lib/commands/LPUSHX.spec.ts similarity index 100% rename from lib/commands/LPUSHX.spec.ts rename to packages/client/lib/commands/LPUSHX.spec.ts diff --git a/lib/commands/LPUSHX.ts b/packages/client/lib/commands/LPUSHX.ts similarity index 100% rename from lib/commands/LPUSHX.ts rename to packages/client/lib/commands/LPUSHX.ts diff --git a/lib/commands/LRANGE.spec.ts b/packages/client/lib/commands/LRANGE.spec.ts similarity index 100% rename from lib/commands/LRANGE.spec.ts rename to packages/client/lib/commands/LRANGE.spec.ts diff --git a/lib/commands/LRANGE.ts b/packages/client/lib/commands/LRANGE.ts similarity index 100% rename from lib/commands/LRANGE.ts rename to packages/client/lib/commands/LRANGE.ts diff --git a/lib/commands/LREM.spec.ts b/packages/client/lib/commands/LREM.spec.ts similarity index 100% rename from lib/commands/LREM.spec.ts rename to packages/client/lib/commands/LREM.spec.ts diff --git a/lib/commands/LREM.ts b/packages/client/lib/commands/LREM.ts similarity index 100% rename from lib/commands/LREM.ts rename to packages/client/lib/commands/LREM.ts diff --git a/lib/commands/LSET.spec.ts b/packages/client/lib/commands/LSET.spec.ts similarity index 100% rename from lib/commands/LSET.spec.ts rename to packages/client/lib/commands/LSET.spec.ts diff --git a/lib/commands/LSET.ts b/packages/client/lib/commands/LSET.ts similarity index 100% rename from lib/commands/LSET.ts rename to packages/client/lib/commands/LSET.ts diff --git a/lib/commands/LTRIM.spec.ts b/packages/client/lib/commands/LTRIM.spec.ts similarity index 100% rename from lib/commands/LTRIM.spec.ts rename to packages/client/lib/commands/LTRIM.spec.ts diff --git a/lib/commands/LTRIM.ts b/packages/client/lib/commands/LTRIM.ts similarity index 100% rename from lib/commands/LTRIM.ts rename to packages/client/lib/commands/LTRIM.ts diff --git a/lib/commands/MEMORY_DOCTOR.spec.ts b/packages/client/lib/commands/MEMORY_DOCTOR.spec.ts similarity index 100% rename from lib/commands/MEMORY_DOCTOR.spec.ts rename to packages/client/lib/commands/MEMORY_DOCTOR.spec.ts diff --git a/lib/commands/MEMORY_DOCTOR.ts b/packages/client/lib/commands/MEMORY_DOCTOR.ts similarity index 100% rename from lib/commands/MEMORY_DOCTOR.ts rename to packages/client/lib/commands/MEMORY_DOCTOR.ts diff --git a/lib/commands/MEMORY_MALLOC-STATS.spec.ts b/packages/client/lib/commands/MEMORY_MALLOC-STATS.spec.ts similarity index 100% rename from lib/commands/MEMORY_MALLOC-STATS.spec.ts rename to packages/client/lib/commands/MEMORY_MALLOC-STATS.spec.ts diff --git a/lib/commands/MEMORY_MALLOC-STATS.ts b/packages/client/lib/commands/MEMORY_MALLOC-STATS.ts similarity index 100% rename from lib/commands/MEMORY_MALLOC-STATS.ts rename to packages/client/lib/commands/MEMORY_MALLOC-STATS.ts diff --git a/lib/commands/MEMORY_PURGE.spec.ts b/packages/client/lib/commands/MEMORY_PURGE.spec.ts similarity index 100% rename from lib/commands/MEMORY_PURGE.spec.ts rename to packages/client/lib/commands/MEMORY_PURGE.spec.ts diff --git a/lib/commands/MEMORY_PURGE.ts b/packages/client/lib/commands/MEMORY_PURGE.ts similarity index 100% rename from lib/commands/MEMORY_PURGE.ts rename to packages/client/lib/commands/MEMORY_PURGE.ts diff --git a/lib/commands/MEMORY_STATS.spec.ts b/packages/client/lib/commands/MEMORY_STATS.spec.ts similarity index 100% rename from lib/commands/MEMORY_STATS.spec.ts rename to packages/client/lib/commands/MEMORY_STATS.spec.ts diff --git a/lib/commands/MEMORY_STATS.ts b/packages/client/lib/commands/MEMORY_STATS.ts similarity index 100% rename from lib/commands/MEMORY_STATS.ts rename to packages/client/lib/commands/MEMORY_STATS.ts diff --git a/lib/commands/MEMORY_USAGE.spec.ts b/packages/client/lib/commands/MEMORY_USAGE.spec.ts similarity index 100% rename from lib/commands/MEMORY_USAGE.spec.ts rename to packages/client/lib/commands/MEMORY_USAGE.spec.ts diff --git a/lib/commands/MEMORY_USAGE.ts b/packages/client/lib/commands/MEMORY_USAGE.ts similarity index 100% rename from lib/commands/MEMORY_USAGE.ts rename to packages/client/lib/commands/MEMORY_USAGE.ts diff --git a/lib/commands/MGET.spec.ts b/packages/client/lib/commands/MGET.spec.ts similarity index 100% rename from lib/commands/MGET.spec.ts rename to packages/client/lib/commands/MGET.spec.ts diff --git a/lib/commands/MGET.ts b/packages/client/lib/commands/MGET.ts similarity index 100% rename from lib/commands/MGET.ts rename to packages/client/lib/commands/MGET.ts diff --git a/lib/commands/MIGRATE.spec.ts b/packages/client/lib/commands/MIGRATE.spec.ts similarity index 100% rename from lib/commands/MIGRATE.spec.ts rename to packages/client/lib/commands/MIGRATE.spec.ts diff --git a/lib/commands/MIGRATE.ts b/packages/client/lib/commands/MIGRATE.ts similarity index 100% rename from lib/commands/MIGRATE.ts rename to packages/client/lib/commands/MIGRATE.ts diff --git a/lib/commands/MODULE_LIST.spec.ts b/packages/client/lib/commands/MODULE_LIST.spec.ts similarity index 100% rename from lib/commands/MODULE_LIST.spec.ts rename to packages/client/lib/commands/MODULE_LIST.spec.ts diff --git a/lib/commands/MODULE_LIST.ts b/packages/client/lib/commands/MODULE_LIST.ts similarity index 100% rename from lib/commands/MODULE_LIST.ts rename to packages/client/lib/commands/MODULE_LIST.ts diff --git a/lib/commands/MODULE_LOAD.spec.ts b/packages/client/lib/commands/MODULE_LOAD.spec.ts similarity index 100% rename from lib/commands/MODULE_LOAD.spec.ts rename to packages/client/lib/commands/MODULE_LOAD.spec.ts diff --git a/lib/commands/MODULE_LOAD.ts b/packages/client/lib/commands/MODULE_LOAD.ts similarity index 100% rename from lib/commands/MODULE_LOAD.ts rename to packages/client/lib/commands/MODULE_LOAD.ts diff --git a/lib/commands/MODULE_UNLOAD.spec.ts b/packages/client/lib/commands/MODULE_UNLOAD.spec.ts similarity index 100% rename from lib/commands/MODULE_UNLOAD.spec.ts rename to packages/client/lib/commands/MODULE_UNLOAD.spec.ts diff --git a/lib/commands/MODULE_UNLOAD.ts b/packages/client/lib/commands/MODULE_UNLOAD.ts similarity index 100% rename from lib/commands/MODULE_UNLOAD.ts rename to packages/client/lib/commands/MODULE_UNLOAD.ts diff --git a/lib/commands/MOVE.spec.ts b/packages/client/lib/commands/MOVE.spec.ts similarity index 100% rename from lib/commands/MOVE.spec.ts rename to packages/client/lib/commands/MOVE.spec.ts diff --git a/lib/commands/MOVE.ts b/packages/client/lib/commands/MOVE.ts similarity index 100% rename from lib/commands/MOVE.ts rename to packages/client/lib/commands/MOVE.ts diff --git a/lib/commands/MSET.spec.ts b/packages/client/lib/commands/MSET.spec.ts similarity index 100% rename from lib/commands/MSET.spec.ts rename to packages/client/lib/commands/MSET.spec.ts diff --git a/lib/commands/MSET.ts b/packages/client/lib/commands/MSET.ts similarity index 100% rename from lib/commands/MSET.ts rename to packages/client/lib/commands/MSET.ts diff --git a/lib/commands/MSETNX.spec.ts b/packages/client/lib/commands/MSETNX.spec.ts similarity index 100% rename from lib/commands/MSETNX.spec.ts rename to packages/client/lib/commands/MSETNX.spec.ts diff --git a/lib/commands/MSETNX.ts b/packages/client/lib/commands/MSETNX.ts similarity index 100% rename from lib/commands/MSETNX.ts rename to packages/client/lib/commands/MSETNX.ts diff --git a/lib/commands/PERSIST.spec.ts b/packages/client/lib/commands/PERSIST.spec.ts similarity index 100% rename from lib/commands/PERSIST.spec.ts rename to packages/client/lib/commands/PERSIST.spec.ts diff --git a/lib/commands/PERSIST.ts b/packages/client/lib/commands/PERSIST.ts similarity index 100% rename from lib/commands/PERSIST.ts rename to packages/client/lib/commands/PERSIST.ts diff --git a/lib/commands/PEXPIRE.spec.ts b/packages/client/lib/commands/PEXPIRE.spec.ts similarity index 100% rename from lib/commands/PEXPIRE.spec.ts rename to packages/client/lib/commands/PEXPIRE.spec.ts diff --git a/lib/commands/PEXPIRE.ts b/packages/client/lib/commands/PEXPIRE.ts similarity index 100% rename from lib/commands/PEXPIRE.ts rename to packages/client/lib/commands/PEXPIRE.ts diff --git a/lib/commands/PEXPIREAT.spec.ts b/packages/client/lib/commands/PEXPIREAT.spec.ts similarity index 100% rename from lib/commands/PEXPIREAT.spec.ts rename to packages/client/lib/commands/PEXPIREAT.spec.ts diff --git a/lib/commands/PEXPIREAT.ts b/packages/client/lib/commands/PEXPIREAT.ts similarity index 100% rename from lib/commands/PEXPIREAT.ts rename to packages/client/lib/commands/PEXPIREAT.ts diff --git a/lib/commands/PFADD.spec.ts b/packages/client/lib/commands/PFADD.spec.ts similarity index 100% rename from lib/commands/PFADD.spec.ts rename to packages/client/lib/commands/PFADD.spec.ts diff --git a/lib/commands/PFADD.ts b/packages/client/lib/commands/PFADD.ts similarity index 100% rename from lib/commands/PFADD.ts rename to packages/client/lib/commands/PFADD.ts diff --git a/lib/commands/PFCOUNT.spec.ts b/packages/client/lib/commands/PFCOUNT.spec.ts similarity index 100% rename from lib/commands/PFCOUNT.spec.ts rename to packages/client/lib/commands/PFCOUNT.spec.ts diff --git a/lib/commands/PFCOUNT.ts b/packages/client/lib/commands/PFCOUNT.ts similarity index 100% rename from lib/commands/PFCOUNT.ts rename to packages/client/lib/commands/PFCOUNT.ts diff --git a/lib/commands/PFMERGE.spec.ts b/packages/client/lib/commands/PFMERGE.spec.ts similarity index 100% rename from lib/commands/PFMERGE.spec.ts rename to packages/client/lib/commands/PFMERGE.spec.ts diff --git a/lib/commands/PFMERGE.ts b/packages/client/lib/commands/PFMERGE.ts similarity index 100% rename from lib/commands/PFMERGE.ts rename to packages/client/lib/commands/PFMERGE.ts diff --git a/lib/commands/PING.spec.ts b/packages/client/lib/commands/PING.spec.ts similarity index 100% rename from lib/commands/PING.spec.ts rename to packages/client/lib/commands/PING.spec.ts diff --git a/lib/commands/PING.ts b/packages/client/lib/commands/PING.ts similarity index 100% rename from lib/commands/PING.ts rename to packages/client/lib/commands/PING.ts diff --git a/lib/commands/PSETEX.spec.ts b/packages/client/lib/commands/PSETEX.spec.ts similarity index 100% rename from lib/commands/PSETEX.spec.ts rename to packages/client/lib/commands/PSETEX.spec.ts diff --git a/lib/commands/PSETEX.ts b/packages/client/lib/commands/PSETEX.ts similarity index 100% rename from lib/commands/PSETEX.ts rename to packages/client/lib/commands/PSETEX.ts diff --git a/lib/commands/PTTL.spec.ts b/packages/client/lib/commands/PTTL.spec.ts similarity index 100% rename from lib/commands/PTTL.spec.ts rename to packages/client/lib/commands/PTTL.spec.ts diff --git a/lib/commands/PTTL.ts b/packages/client/lib/commands/PTTL.ts similarity index 100% rename from lib/commands/PTTL.ts rename to packages/client/lib/commands/PTTL.ts diff --git a/lib/commands/PUBLISH.spec.ts b/packages/client/lib/commands/PUBLISH.spec.ts similarity index 100% rename from lib/commands/PUBLISH.spec.ts rename to packages/client/lib/commands/PUBLISH.spec.ts diff --git a/lib/commands/PUBLISH.ts b/packages/client/lib/commands/PUBLISH.ts similarity index 100% rename from lib/commands/PUBLISH.ts rename to packages/client/lib/commands/PUBLISH.ts diff --git a/lib/commands/PUBSUB_CHANNELS.spec.ts b/packages/client/lib/commands/PUBSUB_CHANNELS.spec.ts similarity index 100% rename from lib/commands/PUBSUB_CHANNELS.spec.ts rename to packages/client/lib/commands/PUBSUB_CHANNELS.spec.ts diff --git a/lib/commands/PUBSUB_CHANNELS.ts b/packages/client/lib/commands/PUBSUB_CHANNELS.ts similarity index 100% rename from lib/commands/PUBSUB_CHANNELS.ts rename to packages/client/lib/commands/PUBSUB_CHANNELS.ts diff --git a/lib/commands/PUBSUB_NUMPAT.spec.ts b/packages/client/lib/commands/PUBSUB_NUMPAT.spec.ts similarity index 100% rename from lib/commands/PUBSUB_NUMPAT.spec.ts rename to packages/client/lib/commands/PUBSUB_NUMPAT.spec.ts diff --git a/lib/commands/PUBSUB_NUMPAT.ts b/packages/client/lib/commands/PUBSUB_NUMPAT.ts similarity index 100% rename from lib/commands/PUBSUB_NUMPAT.ts rename to packages/client/lib/commands/PUBSUB_NUMPAT.ts diff --git a/lib/commands/PUBSUB_NUMSUB.spec.ts b/packages/client/lib/commands/PUBSUB_NUMSUB.spec.ts similarity index 100% rename from lib/commands/PUBSUB_NUMSUB.spec.ts rename to packages/client/lib/commands/PUBSUB_NUMSUB.spec.ts diff --git a/lib/commands/PUBSUB_NUMSUB.ts b/packages/client/lib/commands/PUBSUB_NUMSUB.ts similarity index 100% rename from lib/commands/PUBSUB_NUMSUB.ts rename to packages/client/lib/commands/PUBSUB_NUMSUB.ts diff --git a/lib/commands/RANDOMKEY.spec.ts b/packages/client/lib/commands/RANDOMKEY.spec.ts similarity index 100% rename from lib/commands/RANDOMKEY.spec.ts rename to packages/client/lib/commands/RANDOMKEY.spec.ts diff --git a/lib/commands/RANDOMKEY.ts b/packages/client/lib/commands/RANDOMKEY.ts similarity index 100% rename from lib/commands/RANDOMKEY.ts rename to packages/client/lib/commands/RANDOMKEY.ts diff --git a/lib/commands/READONLY.spec.ts b/packages/client/lib/commands/READONLY.spec.ts similarity index 100% rename from lib/commands/READONLY.spec.ts rename to packages/client/lib/commands/READONLY.spec.ts diff --git a/lib/commands/READONLY.ts b/packages/client/lib/commands/READONLY.ts similarity index 100% rename from lib/commands/READONLY.ts rename to packages/client/lib/commands/READONLY.ts diff --git a/lib/commands/READWRITE.spec.ts b/packages/client/lib/commands/READWRITE.spec.ts similarity index 100% rename from lib/commands/READWRITE.spec.ts rename to packages/client/lib/commands/READWRITE.spec.ts diff --git a/lib/commands/READWRITE.ts b/packages/client/lib/commands/READWRITE.ts similarity index 100% rename from lib/commands/READWRITE.ts rename to packages/client/lib/commands/READWRITE.ts diff --git a/lib/commands/RENAME.spec.ts b/packages/client/lib/commands/RENAME.spec.ts similarity index 100% rename from lib/commands/RENAME.spec.ts rename to packages/client/lib/commands/RENAME.spec.ts diff --git a/lib/commands/RENAME.ts b/packages/client/lib/commands/RENAME.ts similarity index 100% rename from lib/commands/RENAME.ts rename to packages/client/lib/commands/RENAME.ts diff --git a/lib/commands/RENAMENX.spec.ts b/packages/client/lib/commands/RENAMENX.spec.ts similarity index 100% rename from lib/commands/RENAMENX.spec.ts rename to packages/client/lib/commands/RENAMENX.spec.ts diff --git a/lib/commands/RENAMENX.ts b/packages/client/lib/commands/RENAMENX.ts similarity index 100% rename from lib/commands/RENAMENX.ts rename to packages/client/lib/commands/RENAMENX.ts diff --git a/lib/commands/REPLICAOF.spec.ts b/packages/client/lib/commands/REPLICAOF.spec.ts similarity index 100% rename from lib/commands/REPLICAOF.spec.ts rename to packages/client/lib/commands/REPLICAOF.spec.ts diff --git a/lib/commands/REPLICAOF.ts b/packages/client/lib/commands/REPLICAOF.ts similarity index 100% rename from lib/commands/REPLICAOF.ts rename to packages/client/lib/commands/REPLICAOF.ts diff --git a/lib/commands/RESTORE-ASKING.spec.ts b/packages/client/lib/commands/RESTORE-ASKING.spec.ts similarity index 100% rename from lib/commands/RESTORE-ASKING.spec.ts rename to packages/client/lib/commands/RESTORE-ASKING.spec.ts diff --git a/lib/commands/RESTORE-ASKING.ts b/packages/client/lib/commands/RESTORE-ASKING.ts similarity index 100% rename from lib/commands/RESTORE-ASKING.ts rename to packages/client/lib/commands/RESTORE-ASKING.ts diff --git a/lib/commands/ROLE.spec.ts b/packages/client/lib/commands/ROLE.spec.ts similarity index 100% rename from lib/commands/ROLE.spec.ts rename to packages/client/lib/commands/ROLE.spec.ts diff --git a/lib/commands/ROLE.ts b/packages/client/lib/commands/ROLE.ts similarity index 100% rename from lib/commands/ROLE.ts rename to packages/client/lib/commands/ROLE.ts diff --git a/lib/commands/RPOP.spec.ts b/packages/client/lib/commands/RPOP.spec.ts similarity index 100% rename from lib/commands/RPOP.spec.ts rename to packages/client/lib/commands/RPOP.spec.ts diff --git a/lib/commands/RPOP.ts b/packages/client/lib/commands/RPOP.ts similarity index 100% rename from lib/commands/RPOP.ts rename to packages/client/lib/commands/RPOP.ts diff --git a/lib/commands/RPOPLPUSH.spec.ts b/packages/client/lib/commands/RPOPLPUSH.spec.ts similarity index 100% rename from lib/commands/RPOPLPUSH.spec.ts rename to packages/client/lib/commands/RPOPLPUSH.spec.ts diff --git a/lib/commands/RPOPLPUSH.ts b/packages/client/lib/commands/RPOPLPUSH.ts similarity index 100% rename from lib/commands/RPOPLPUSH.ts rename to packages/client/lib/commands/RPOPLPUSH.ts diff --git a/lib/commands/RPOP_COUNT.spec.ts b/packages/client/lib/commands/RPOP_COUNT.spec.ts similarity index 100% rename from lib/commands/RPOP_COUNT.spec.ts rename to packages/client/lib/commands/RPOP_COUNT.spec.ts diff --git a/lib/commands/RPOP_COUNT.ts b/packages/client/lib/commands/RPOP_COUNT.ts similarity index 100% rename from lib/commands/RPOP_COUNT.ts rename to packages/client/lib/commands/RPOP_COUNT.ts diff --git a/lib/commands/RPUSH.spec.ts b/packages/client/lib/commands/RPUSH.spec.ts similarity index 100% rename from lib/commands/RPUSH.spec.ts rename to packages/client/lib/commands/RPUSH.spec.ts diff --git a/lib/commands/RPUSH.ts b/packages/client/lib/commands/RPUSH.ts similarity index 100% rename from lib/commands/RPUSH.ts rename to packages/client/lib/commands/RPUSH.ts diff --git a/lib/commands/RPUSHX.spec.ts b/packages/client/lib/commands/RPUSHX.spec.ts similarity index 100% rename from lib/commands/RPUSHX.spec.ts rename to packages/client/lib/commands/RPUSHX.spec.ts diff --git a/lib/commands/RPUSHX.ts b/packages/client/lib/commands/RPUSHX.ts similarity index 100% rename from lib/commands/RPUSHX.ts rename to packages/client/lib/commands/RPUSHX.ts diff --git a/lib/commands/SADD.spec.ts b/packages/client/lib/commands/SADD.spec.ts similarity index 100% rename from lib/commands/SADD.spec.ts rename to packages/client/lib/commands/SADD.spec.ts diff --git a/lib/commands/SADD.ts b/packages/client/lib/commands/SADD.ts similarity index 100% rename from lib/commands/SADD.ts rename to packages/client/lib/commands/SADD.ts diff --git a/lib/commands/SAVE.spec.ts b/packages/client/lib/commands/SAVE.spec.ts similarity index 100% rename from lib/commands/SAVE.spec.ts rename to packages/client/lib/commands/SAVE.spec.ts diff --git a/lib/commands/SAVE.ts b/packages/client/lib/commands/SAVE.ts similarity index 100% rename from lib/commands/SAVE.ts rename to packages/client/lib/commands/SAVE.ts diff --git a/lib/commands/SCAN.spec.ts b/packages/client/lib/commands/SCAN.spec.ts similarity index 100% rename from lib/commands/SCAN.spec.ts rename to packages/client/lib/commands/SCAN.spec.ts diff --git a/lib/commands/SCAN.ts b/packages/client/lib/commands/SCAN.ts similarity index 100% rename from lib/commands/SCAN.ts rename to packages/client/lib/commands/SCAN.ts diff --git a/lib/commands/SCARD.spec.ts b/packages/client/lib/commands/SCARD.spec.ts similarity index 100% rename from lib/commands/SCARD.spec.ts rename to packages/client/lib/commands/SCARD.spec.ts diff --git a/lib/commands/SCARD.ts b/packages/client/lib/commands/SCARD.ts similarity index 100% rename from lib/commands/SCARD.ts rename to packages/client/lib/commands/SCARD.ts diff --git a/lib/commands/SCRIPT_DEBUG.spec.ts b/packages/client/lib/commands/SCRIPT_DEBUG.spec.ts similarity index 100% rename from lib/commands/SCRIPT_DEBUG.spec.ts rename to packages/client/lib/commands/SCRIPT_DEBUG.spec.ts diff --git a/lib/commands/SCRIPT_DEBUG.ts b/packages/client/lib/commands/SCRIPT_DEBUG.ts similarity index 100% rename from lib/commands/SCRIPT_DEBUG.ts rename to packages/client/lib/commands/SCRIPT_DEBUG.ts diff --git a/lib/commands/SCRIPT_EXISTS.spec.ts b/packages/client/lib/commands/SCRIPT_EXISTS.spec.ts similarity index 100% rename from lib/commands/SCRIPT_EXISTS.spec.ts rename to packages/client/lib/commands/SCRIPT_EXISTS.spec.ts diff --git a/lib/commands/SCRIPT_EXISTS.ts b/packages/client/lib/commands/SCRIPT_EXISTS.ts similarity index 100% rename from lib/commands/SCRIPT_EXISTS.ts rename to packages/client/lib/commands/SCRIPT_EXISTS.ts diff --git a/lib/commands/SCRIPT_FLUSH.spec.ts b/packages/client/lib/commands/SCRIPT_FLUSH.spec.ts similarity index 100% rename from lib/commands/SCRIPT_FLUSH.spec.ts rename to packages/client/lib/commands/SCRIPT_FLUSH.spec.ts diff --git a/lib/commands/SCRIPT_FLUSH.ts b/packages/client/lib/commands/SCRIPT_FLUSH.ts similarity index 100% rename from lib/commands/SCRIPT_FLUSH.ts rename to packages/client/lib/commands/SCRIPT_FLUSH.ts diff --git a/lib/commands/SCRIPT_KILL.spec.ts b/packages/client/lib/commands/SCRIPT_KILL.spec.ts similarity index 100% rename from lib/commands/SCRIPT_KILL.spec.ts rename to packages/client/lib/commands/SCRIPT_KILL.spec.ts diff --git a/lib/commands/SCRIPT_KILL.ts b/packages/client/lib/commands/SCRIPT_KILL.ts similarity index 100% rename from lib/commands/SCRIPT_KILL.ts rename to packages/client/lib/commands/SCRIPT_KILL.ts diff --git a/lib/commands/SCRIPT_LOAD.spec.ts b/packages/client/lib/commands/SCRIPT_LOAD.spec.ts similarity index 100% rename from lib/commands/SCRIPT_LOAD.spec.ts rename to packages/client/lib/commands/SCRIPT_LOAD.spec.ts diff --git a/lib/commands/SCRIPT_LOAD.ts b/packages/client/lib/commands/SCRIPT_LOAD.ts similarity index 100% rename from lib/commands/SCRIPT_LOAD.ts rename to packages/client/lib/commands/SCRIPT_LOAD.ts diff --git a/lib/commands/SDIFF.spec.ts b/packages/client/lib/commands/SDIFF.spec.ts similarity index 100% rename from lib/commands/SDIFF.spec.ts rename to packages/client/lib/commands/SDIFF.spec.ts diff --git a/lib/commands/SDIFF.ts b/packages/client/lib/commands/SDIFF.ts similarity index 100% rename from lib/commands/SDIFF.ts rename to packages/client/lib/commands/SDIFF.ts diff --git a/lib/commands/SDIFFSTORE.spec.ts b/packages/client/lib/commands/SDIFFSTORE.spec.ts similarity index 100% rename from lib/commands/SDIFFSTORE.spec.ts rename to packages/client/lib/commands/SDIFFSTORE.spec.ts diff --git a/lib/commands/SDIFFSTORE.ts b/packages/client/lib/commands/SDIFFSTORE.ts similarity index 100% rename from lib/commands/SDIFFSTORE.ts rename to packages/client/lib/commands/SDIFFSTORE.ts diff --git a/lib/commands/SET.spec.ts b/packages/client/lib/commands/SET.spec.ts similarity index 100% rename from lib/commands/SET.spec.ts rename to packages/client/lib/commands/SET.spec.ts diff --git a/lib/commands/SET.ts b/packages/client/lib/commands/SET.ts similarity index 100% rename from lib/commands/SET.ts rename to packages/client/lib/commands/SET.ts diff --git a/lib/commands/SETBIT.spec.ts b/packages/client/lib/commands/SETBIT.spec.ts similarity index 100% rename from lib/commands/SETBIT.spec.ts rename to packages/client/lib/commands/SETBIT.spec.ts diff --git a/lib/commands/SETBIT.ts b/packages/client/lib/commands/SETBIT.ts similarity index 100% rename from lib/commands/SETBIT.ts rename to packages/client/lib/commands/SETBIT.ts diff --git a/lib/commands/SETEX.spec.ts b/packages/client/lib/commands/SETEX.spec.ts similarity index 100% rename from lib/commands/SETEX.spec.ts rename to packages/client/lib/commands/SETEX.spec.ts diff --git a/lib/commands/SETEX.ts b/packages/client/lib/commands/SETEX.ts similarity index 100% rename from lib/commands/SETEX.ts rename to packages/client/lib/commands/SETEX.ts diff --git a/lib/commands/SETNX .spec.ts b/packages/client/lib/commands/SETNX .spec.ts similarity index 100% rename from lib/commands/SETNX .spec.ts rename to packages/client/lib/commands/SETNX .spec.ts diff --git a/lib/commands/SETNX.ts b/packages/client/lib/commands/SETNX.ts similarity index 100% rename from lib/commands/SETNX.ts rename to packages/client/lib/commands/SETNX.ts diff --git a/lib/commands/SETRANGE.spec.ts b/packages/client/lib/commands/SETRANGE.spec.ts similarity index 100% rename from lib/commands/SETRANGE.spec.ts rename to packages/client/lib/commands/SETRANGE.spec.ts diff --git a/lib/commands/SETRANGE.ts b/packages/client/lib/commands/SETRANGE.ts similarity index 100% rename from lib/commands/SETRANGE.ts rename to packages/client/lib/commands/SETRANGE.ts diff --git a/lib/commands/SHUTDOWN.spec.ts b/packages/client/lib/commands/SHUTDOWN.spec.ts similarity index 100% rename from lib/commands/SHUTDOWN.spec.ts rename to packages/client/lib/commands/SHUTDOWN.spec.ts diff --git a/lib/commands/SHUTDOWN.ts b/packages/client/lib/commands/SHUTDOWN.ts similarity index 100% rename from lib/commands/SHUTDOWN.ts rename to packages/client/lib/commands/SHUTDOWN.ts diff --git a/lib/commands/SINTER.spec.ts b/packages/client/lib/commands/SINTER.spec.ts similarity index 100% rename from lib/commands/SINTER.spec.ts rename to packages/client/lib/commands/SINTER.spec.ts diff --git a/lib/commands/SINTER.ts b/packages/client/lib/commands/SINTER.ts similarity index 100% rename from lib/commands/SINTER.ts rename to packages/client/lib/commands/SINTER.ts diff --git a/lib/commands/SINTERSTORE.spec.ts b/packages/client/lib/commands/SINTERSTORE.spec.ts similarity index 100% rename from lib/commands/SINTERSTORE.spec.ts rename to packages/client/lib/commands/SINTERSTORE.spec.ts diff --git a/lib/commands/SINTERSTORE.ts b/packages/client/lib/commands/SINTERSTORE.ts similarity index 100% rename from lib/commands/SINTERSTORE.ts rename to packages/client/lib/commands/SINTERSTORE.ts diff --git a/lib/commands/SISMEMBER.spec.ts b/packages/client/lib/commands/SISMEMBER.spec.ts similarity index 100% rename from lib/commands/SISMEMBER.spec.ts rename to packages/client/lib/commands/SISMEMBER.spec.ts diff --git a/lib/commands/SISMEMBER.ts b/packages/client/lib/commands/SISMEMBER.ts similarity index 100% rename from lib/commands/SISMEMBER.ts rename to packages/client/lib/commands/SISMEMBER.ts diff --git a/lib/commands/SMEMBERS.spec.ts b/packages/client/lib/commands/SMEMBERS.spec.ts similarity index 100% rename from lib/commands/SMEMBERS.spec.ts rename to packages/client/lib/commands/SMEMBERS.spec.ts diff --git a/lib/commands/SMEMBERS.ts b/packages/client/lib/commands/SMEMBERS.ts similarity index 100% rename from lib/commands/SMEMBERS.ts rename to packages/client/lib/commands/SMEMBERS.ts diff --git a/lib/commands/SMISMEMBER.spec.ts b/packages/client/lib/commands/SMISMEMBER.spec.ts similarity index 100% rename from lib/commands/SMISMEMBER.spec.ts rename to packages/client/lib/commands/SMISMEMBER.spec.ts diff --git a/lib/commands/SMISMEMBER.ts b/packages/client/lib/commands/SMISMEMBER.ts similarity index 100% rename from lib/commands/SMISMEMBER.ts rename to packages/client/lib/commands/SMISMEMBER.ts diff --git a/lib/commands/SMOVE.spec.ts b/packages/client/lib/commands/SMOVE.spec.ts similarity index 100% rename from lib/commands/SMOVE.spec.ts rename to packages/client/lib/commands/SMOVE.spec.ts diff --git a/lib/commands/SMOVE.ts b/packages/client/lib/commands/SMOVE.ts similarity index 100% rename from lib/commands/SMOVE.ts rename to packages/client/lib/commands/SMOVE.ts diff --git a/lib/commands/SORT.spec.ts b/packages/client/lib/commands/SORT.spec.ts similarity index 100% rename from lib/commands/SORT.spec.ts rename to packages/client/lib/commands/SORT.spec.ts diff --git a/lib/commands/SORT.ts b/packages/client/lib/commands/SORT.ts similarity index 100% rename from lib/commands/SORT.ts rename to packages/client/lib/commands/SORT.ts diff --git a/lib/commands/SPOP.spec.ts b/packages/client/lib/commands/SPOP.spec.ts similarity index 100% rename from lib/commands/SPOP.spec.ts rename to packages/client/lib/commands/SPOP.spec.ts diff --git a/lib/commands/SPOP.ts b/packages/client/lib/commands/SPOP.ts similarity index 100% rename from lib/commands/SPOP.ts rename to packages/client/lib/commands/SPOP.ts diff --git a/lib/commands/SRANDMEMBER.spec.ts b/packages/client/lib/commands/SRANDMEMBER.spec.ts similarity index 100% rename from lib/commands/SRANDMEMBER.spec.ts rename to packages/client/lib/commands/SRANDMEMBER.spec.ts diff --git a/lib/commands/SRANDMEMBER.ts b/packages/client/lib/commands/SRANDMEMBER.ts similarity index 100% rename from lib/commands/SRANDMEMBER.ts rename to packages/client/lib/commands/SRANDMEMBER.ts diff --git a/lib/commands/SRANDMEMBER_COUNT.spec.ts b/packages/client/lib/commands/SRANDMEMBER_COUNT.spec.ts similarity index 100% rename from lib/commands/SRANDMEMBER_COUNT.spec.ts rename to packages/client/lib/commands/SRANDMEMBER_COUNT.spec.ts diff --git a/lib/commands/SRANDMEMBER_COUNT.ts b/packages/client/lib/commands/SRANDMEMBER_COUNT.ts similarity index 100% rename from lib/commands/SRANDMEMBER_COUNT.ts rename to packages/client/lib/commands/SRANDMEMBER_COUNT.ts diff --git a/lib/commands/SREM.spec.ts b/packages/client/lib/commands/SREM.spec.ts similarity index 100% rename from lib/commands/SREM.spec.ts rename to packages/client/lib/commands/SREM.spec.ts diff --git a/lib/commands/SREM.ts b/packages/client/lib/commands/SREM.ts similarity index 100% rename from lib/commands/SREM.ts rename to packages/client/lib/commands/SREM.ts diff --git a/lib/commands/SSCAN.spec.ts b/packages/client/lib/commands/SSCAN.spec.ts similarity index 100% rename from lib/commands/SSCAN.spec.ts rename to packages/client/lib/commands/SSCAN.spec.ts diff --git a/lib/commands/SSCAN.ts b/packages/client/lib/commands/SSCAN.ts similarity index 100% rename from lib/commands/SSCAN.ts rename to packages/client/lib/commands/SSCAN.ts diff --git a/lib/commands/STRLEN.spec.ts b/packages/client/lib/commands/STRLEN.spec.ts similarity index 100% rename from lib/commands/STRLEN.spec.ts rename to packages/client/lib/commands/STRLEN.spec.ts diff --git a/lib/commands/STRLEN.ts b/packages/client/lib/commands/STRLEN.ts similarity index 100% rename from lib/commands/STRLEN.ts rename to packages/client/lib/commands/STRLEN.ts diff --git a/lib/commands/SUNION.spec.ts b/packages/client/lib/commands/SUNION.spec.ts similarity index 100% rename from lib/commands/SUNION.spec.ts rename to packages/client/lib/commands/SUNION.spec.ts diff --git a/lib/commands/SUNION.ts b/packages/client/lib/commands/SUNION.ts similarity index 100% rename from lib/commands/SUNION.ts rename to packages/client/lib/commands/SUNION.ts diff --git a/lib/commands/SUNIONSTORE.spec.ts b/packages/client/lib/commands/SUNIONSTORE.spec.ts similarity index 100% rename from lib/commands/SUNIONSTORE.spec.ts rename to packages/client/lib/commands/SUNIONSTORE.spec.ts diff --git a/lib/commands/SUNIONSTORE.ts b/packages/client/lib/commands/SUNIONSTORE.ts similarity index 100% rename from lib/commands/SUNIONSTORE.ts rename to packages/client/lib/commands/SUNIONSTORE.ts diff --git a/lib/commands/SWAPDB.spec.ts b/packages/client/lib/commands/SWAPDB.spec.ts similarity index 100% rename from lib/commands/SWAPDB.spec.ts rename to packages/client/lib/commands/SWAPDB.spec.ts diff --git a/lib/commands/SWAPDB.ts b/packages/client/lib/commands/SWAPDB.ts similarity index 100% rename from lib/commands/SWAPDB.ts rename to packages/client/lib/commands/SWAPDB.ts diff --git a/lib/commands/TIME.spec.ts b/packages/client/lib/commands/TIME.spec.ts similarity index 55% rename from lib/commands/TIME.spec.ts rename to packages/client/lib/commands/TIME.spec.ts index bbaa7942db0..1139d18d537 100644 --- a/lib/commands/TIME.spec.ts +++ b/packages/client/lib/commands/TIME.spec.ts @@ -10,9 +10,9 @@ describe('TIME', () => { ); }); - testUtils.testWithClient('client.time', async client => { - const reply = await client.time(); - assert.ok(reply instanceof Date); - assert.ok(typeof reply.microseconds === 'number'); - }, GLOBAL.SERVERS.OPEN); + // testUtils.testWithClient('client.time', async client => { + // const reply = await client.time(); + // assert.ok(reply instanceof Date); + // assert.ok(typeof reply.microseconds === 'number'); + // }, GLOBAL.SERVERS.OPEN); }); diff --git a/lib/commands/TIME.ts b/packages/client/lib/commands/TIME.ts similarity index 100% rename from lib/commands/TIME.ts rename to packages/client/lib/commands/TIME.ts diff --git a/lib/commands/TOUCH.spec.ts b/packages/client/lib/commands/TOUCH.spec.ts similarity index 100% rename from lib/commands/TOUCH.spec.ts rename to packages/client/lib/commands/TOUCH.spec.ts diff --git a/lib/commands/TOUCH.ts b/packages/client/lib/commands/TOUCH.ts similarity index 100% rename from lib/commands/TOUCH.ts rename to packages/client/lib/commands/TOUCH.ts diff --git a/lib/commands/TTL.spec.ts b/packages/client/lib/commands/TTL.spec.ts similarity index 100% rename from lib/commands/TTL.spec.ts rename to packages/client/lib/commands/TTL.spec.ts diff --git a/lib/commands/TTL.ts b/packages/client/lib/commands/TTL.ts similarity index 100% rename from lib/commands/TTL.ts rename to packages/client/lib/commands/TTL.ts diff --git a/lib/commands/TYPE.spec.ts b/packages/client/lib/commands/TYPE.spec.ts similarity index 100% rename from lib/commands/TYPE.spec.ts rename to packages/client/lib/commands/TYPE.spec.ts diff --git a/lib/commands/TYPE.ts b/packages/client/lib/commands/TYPE.ts similarity index 100% rename from lib/commands/TYPE.ts rename to packages/client/lib/commands/TYPE.ts diff --git a/lib/commands/UNLINK.spec.ts b/packages/client/lib/commands/UNLINK.spec.ts similarity index 100% rename from lib/commands/UNLINK.spec.ts rename to packages/client/lib/commands/UNLINK.spec.ts diff --git a/lib/commands/UNLINK.ts b/packages/client/lib/commands/UNLINK.ts similarity index 100% rename from lib/commands/UNLINK.ts rename to packages/client/lib/commands/UNLINK.ts diff --git a/lib/commands/UNWATCH.spec.ts b/packages/client/lib/commands/UNWATCH.spec.ts similarity index 100% rename from lib/commands/UNWATCH.spec.ts rename to packages/client/lib/commands/UNWATCH.spec.ts diff --git a/lib/commands/UNWATCH.ts b/packages/client/lib/commands/UNWATCH.ts similarity index 100% rename from lib/commands/UNWATCH.ts rename to packages/client/lib/commands/UNWATCH.ts diff --git a/lib/commands/WAIT.spec.ts b/packages/client/lib/commands/WAIT.spec.ts similarity index 100% rename from lib/commands/WAIT.spec.ts rename to packages/client/lib/commands/WAIT.spec.ts diff --git a/lib/commands/WAIT.ts b/packages/client/lib/commands/WAIT.ts similarity index 100% rename from lib/commands/WAIT.ts rename to packages/client/lib/commands/WAIT.ts diff --git a/lib/commands/WATCH.spec.ts b/packages/client/lib/commands/WATCH.spec.ts similarity index 100% rename from lib/commands/WATCH.spec.ts rename to packages/client/lib/commands/WATCH.spec.ts diff --git a/lib/commands/WATCH.ts b/packages/client/lib/commands/WATCH.ts similarity index 100% rename from lib/commands/WATCH.ts rename to packages/client/lib/commands/WATCH.ts diff --git a/lib/commands/XACK.spec.ts b/packages/client/lib/commands/XACK.spec.ts similarity index 100% rename from lib/commands/XACK.spec.ts rename to packages/client/lib/commands/XACK.spec.ts diff --git a/lib/commands/XACK.ts b/packages/client/lib/commands/XACK.ts similarity index 100% rename from lib/commands/XACK.ts rename to packages/client/lib/commands/XACK.ts diff --git a/lib/commands/XADD.spec.ts b/packages/client/lib/commands/XADD.spec.ts similarity index 100% rename from lib/commands/XADD.spec.ts rename to packages/client/lib/commands/XADD.spec.ts diff --git a/lib/commands/XADD.ts b/packages/client/lib/commands/XADD.ts similarity index 100% rename from lib/commands/XADD.ts rename to packages/client/lib/commands/XADD.ts diff --git a/lib/commands/XAUTOCLAIM.spec.ts b/packages/client/lib/commands/XAUTOCLAIM.spec.ts similarity index 100% rename from lib/commands/XAUTOCLAIM.spec.ts rename to packages/client/lib/commands/XAUTOCLAIM.spec.ts diff --git a/lib/commands/XAUTOCLAIM.ts b/packages/client/lib/commands/XAUTOCLAIM.ts similarity index 100% rename from lib/commands/XAUTOCLAIM.ts rename to packages/client/lib/commands/XAUTOCLAIM.ts diff --git a/lib/commands/XAUTOCLAIM_JUSTID.spec.ts b/packages/client/lib/commands/XAUTOCLAIM_JUSTID.spec.ts similarity index 100% rename from lib/commands/XAUTOCLAIM_JUSTID.spec.ts rename to packages/client/lib/commands/XAUTOCLAIM_JUSTID.spec.ts diff --git a/lib/commands/XAUTOCLAIM_JUSTID.ts b/packages/client/lib/commands/XAUTOCLAIM_JUSTID.ts similarity index 100% rename from lib/commands/XAUTOCLAIM_JUSTID.ts rename to packages/client/lib/commands/XAUTOCLAIM_JUSTID.ts diff --git a/lib/commands/XCLAIM.spec.ts b/packages/client/lib/commands/XCLAIM.spec.ts similarity index 100% rename from lib/commands/XCLAIM.spec.ts rename to packages/client/lib/commands/XCLAIM.spec.ts diff --git a/lib/commands/XCLAIM.ts b/packages/client/lib/commands/XCLAIM.ts similarity index 100% rename from lib/commands/XCLAIM.ts rename to packages/client/lib/commands/XCLAIM.ts diff --git a/lib/commands/XCLAIM_JUSTID.spec.ts b/packages/client/lib/commands/XCLAIM_JUSTID.spec.ts similarity index 100% rename from lib/commands/XCLAIM_JUSTID.spec.ts rename to packages/client/lib/commands/XCLAIM_JUSTID.spec.ts diff --git a/lib/commands/XCLAIM_JUSTID.ts b/packages/client/lib/commands/XCLAIM_JUSTID.ts similarity index 100% rename from lib/commands/XCLAIM_JUSTID.ts rename to packages/client/lib/commands/XCLAIM_JUSTID.ts diff --git a/lib/commands/XDEL.spec.ts b/packages/client/lib/commands/XDEL.spec.ts similarity index 100% rename from lib/commands/XDEL.spec.ts rename to packages/client/lib/commands/XDEL.spec.ts diff --git a/lib/commands/XDEL.ts b/packages/client/lib/commands/XDEL.ts similarity index 100% rename from lib/commands/XDEL.ts rename to packages/client/lib/commands/XDEL.ts diff --git a/lib/commands/XGROUP_CREATE.spec.ts b/packages/client/lib/commands/XGROUP_CREATE.spec.ts similarity index 100% rename from lib/commands/XGROUP_CREATE.spec.ts rename to packages/client/lib/commands/XGROUP_CREATE.spec.ts diff --git a/lib/commands/XGROUP_CREATE.ts b/packages/client/lib/commands/XGROUP_CREATE.ts similarity index 100% rename from lib/commands/XGROUP_CREATE.ts rename to packages/client/lib/commands/XGROUP_CREATE.ts diff --git a/lib/commands/XGROUP_CREATECONSUMER.spec.ts b/packages/client/lib/commands/XGROUP_CREATECONSUMER.spec.ts similarity index 100% rename from lib/commands/XGROUP_CREATECONSUMER.spec.ts rename to packages/client/lib/commands/XGROUP_CREATECONSUMER.spec.ts diff --git a/lib/commands/XGROUP_CREATECONSUMER.ts b/packages/client/lib/commands/XGROUP_CREATECONSUMER.ts similarity index 100% rename from lib/commands/XGROUP_CREATECONSUMER.ts rename to packages/client/lib/commands/XGROUP_CREATECONSUMER.ts diff --git a/lib/commands/XGROUP_DELCONSUMER.spec.ts b/packages/client/lib/commands/XGROUP_DELCONSUMER.spec.ts similarity index 100% rename from lib/commands/XGROUP_DELCONSUMER.spec.ts rename to packages/client/lib/commands/XGROUP_DELCONSUMER.spec.ts diff --git a/lib/commands/XGROUP_DELCONSUMER.ts b/packages/client/lib/commands/XGROUP_DELCONSUMER.ts similarity index 100% rename from lib/commands/XGROUP_DELCONSUMER.ts rename to packages/client/lib/commands/XGROUP_DELCONSUMER.ts diff --git a/lib/commands/XGROUP_DESTROY.spec.ts b/packages/client/lib/commands/XGROUP_DESTROY.spec.ts similarity index 100% rename from lib/commands/XGROUP_DESTROY.spec.ts rename to packages/client/lib/commands/XGROUP_DESTROY.spec.ts diff --git a/lib/commands/XGROUP_DESTROY.ts b/packages/client/lib/commands/XGROUP_DESTROY.ts similarity index 100% rename from lib/commands/XGROUP_DESTROY.ts rename to packages/client/lib/commands/XGROUP_DESTROY.ts diff --git a/lib/commands/XGROUP_SETID.spec.ts b/packages/client/lib/commands/XGROUP_SETID.spec.ts similarity index 100% rename from lib/commands/XGROUP_SETID.spec.ts rename to packages/client/lib/commands/XGROUP_SETID.spec.ts diff --git a/lib/commands/XGROUP_SETID.ts b/packages/client/lib/commands/XGROUP_SETID.ts similarity index 100% rename from lib/commands/XGROUP_SETID.ts rename to packages/client/lib/commands/XGROUP_SETID.ts diff --git a/lib/commands/XINFO_CONSUMERS.spec.ts b/packages/client/lib/commands/XINFO_CONSUMERS.spec.ts similarity index 100% rename from lib/commands/XINFO_CONSUMERS.spec.ts rename to packages/client/lib/commands/XINFO_CONSUMERS.spec.ts diff --git a/lib/commands/XINFO_CONSUMERS.ts b/packages/client/lib/commands/XINFO_CONSUMERS.ts similarity index 100% rename from lib/commands/XINFO_CONSUMERS.ts rename to packages/client/lib/commands/XINFO_CONSUMERS.ts diff --git a/lib/commands/XINFO_GROUPS.spec.ts b/packages/client/lib/commands/XINFO_GROUPS.spec.ts similarity index 100% rename from lib/commands/XINFO_GROUPS.spec.ts rename to packages/client/lib/commands/XINFO_GROUPS.spec.ts diff --git a/lib/commands/XINFO_GROUPS.ts b/packages/client/lib/commands/XINFO_GROUPS.ts similarity index 100% rename from lib/commands/XINFO_GROUPS.ts rename to packages/client/lib/commands/XINFO_GROUPS.ts diff --git a/lib/commands/XINFO_STREAM.spec.ts b/packages/client/lib/commands/XINFO_STREAM.spec.ts similarity index 100% rename from lib/commands/XINFO_STREAM.spec.ts rename to packages/client/lib/commands/XINFO_STREAM.spec.ts diff --git a/lib/commands/XINFO_STREAM.ts b/packages/client/lib/commands/XINFO_STREAM.ts similarity index 100% rename from lib/commands/XINFO_STREAM.ts rename to packages/client/lib/commands/XINFO_STREAM.ts diff --git a/lib/commands/XLEN.spec.ts b/packages/client/lib/commands/XLEN.spec.ts similarity index 100% rename from lib/commands/XLEN.spec.ts rename to packages/client/lib/commands/XLEN.spec.ts diff --git a/lib/commands/XLEN.ts b/packages/client/lib/commands/XLEN.ts similarity index 100% rename from lib/commands/XLEN.ts rename to packages/client/lib/commands/XLEN.ts diff --git a/lib/commands/XPENDING.spec.ts b/packages/client/lib/commands/XPENDING.spec.ts similarity index 100% rename from lib/commands/XPENDING.spec.ts rename to packages/client/lib/commands/XPENDING.spec.ts diff --git a/lib/commands/XPENDING.ts b/packages/client/lib/commands/XPENDING.ts similarity index 100% rename from lib/commands/XPENDING.ts rename to packages/client/lib/commands/XPENDING.ts diff --git a/lib/commands/XPENDING_RANGE.spec.ts b/packages/client/lib/commands/XPENDING_RANGE.spec.ts similarity index 100% rename from lib/commands/XPENDING_RANGE.spec.ts rename to packages/client/lib/commands/XPENDING_RANGE.spec.ts diff --git a/lib/commands/XPENDING_RANGE.ts b/packages/client/lib/commands/XPENDING_RANGE.ts similarity index 100% rename from lib/commands/XPENDING_RANGE.ts rename to packages/client/lib/commands/XPENDING_RANGE.ts diff --git a/lib/commands/XRANGE.spec.ts b/packages/client/lib/commands/XRANGE.spec.ts similarity index 100% rename from lib/commands/XRANGE.spec.ts rename to packages/client/lib/commands/XRANGE.spec.ts diff --git a/lib/commands/XRANGE.ts b/packages/client/lib/commands/XRANGE.ts similarity index 100% rename from lib/commands/XRANGE.ts rename to packages/client/lib/commands/XRANGE.ts diff --git a/lib/commands/XREAD.spec.ts b/packages/client/lib/commands/XREAD.spec.ts similarity index 100% rename from lib/commands/XREAD.spec.ts rename to packages/client/lib/commands/XREAD.spec.ts diff --git a/lib/commands/XREAD.ts b/packages/client/lib/commands/XREAD.ts similarity index 100% rename from lib/commands/XREAD.ts rename to packages/client/lib/commands/XREAD.ts diff --git a/lib/commands/XREADGROUP.spec.ts b/packages/client/lib/commands/XREADGROUP.spec.ts similarity index 100% rename from lib/commands/XREADGROUP.spec.ts rename to packages/client/lib/commands/XREADGROUP.spec.ts diff --git a/lib/commands/XREADGROUP.ts b/packages/client/lib/commands/XREADGROUP.ts similarity index 100% rename from lib/commands/XREADGROUP.ts rename to packages/client/lib/commands/XREADGROUP.ts diff --git a/lib/commands/XREVRANGE.spec.ts b/packages/client/lib/commands/XREVRANGE.spec.ts similarity index 100% rename from lib/commands/XREVRANGE.spec.ts rename to packages/client/lib/commands/XREVRANGE.spec.ts diff --git a/lib/commands/XREVRANGE.ts b/packages/client/lib/commands/XREVRANGE.ts similarity index 100% rename from lib/commands/XREVRANGE.ts rename to packages/client/lib/commands/XREVRANGE.ts diff --git a/lib/commands/XTRIM.spec.ts b/packages/client/lib/commands/XTRIM.spec.ts similarity index 100% rename from lib/commands/XTRIM.spec.ts rename to packages/client/lib/commands/XTRIM.spec.ts diff --git a/lib/commands/XTRIM.ts b/packages/client/lib/commands/XTRIM.ts similarity index 100% rename from lib/commands/XTRIM.ts rename to packages/client/lib/commands/XTRIM.ts diff --git a/lib/commands/ZADD.spec.ts b/packages/client/lib/commands/ZADD.spec.ts similarity index 100% rename from lib/commands/ZADD.spec.ts rename to packages/client/lib/commands/ZADD.spec.ts diff --git a/lib/commands/ZADD.ts b/packages/client/lib/commands/ZADD.ts similarity index 100% rename from lib/commands/ZADD.ts rename to packages/client/lib/commands/ZADD.ts diff --git a/lib/commands/ZCARD.spec.ts b/packages/client/lib/commands/ZCARD.spec.ts similarity index 100% rename from lib/commands/ZCARD.spec.ts rename to packages/client/lib/commands/ZCARD.spec.ts diff --git a/lib/commands/ZCARD.ts b/packages/client/lib/commands/ZCARD.ts similarity index 100% rename from lib/commands/ZCARD.ts rename to packages/client/lib/commands/ZCARD.ts diff --git a/lib/commands/ZCOUNT.spec.ts b/packages/client/lib/commands/ZCOUNT.spec.ts similarity index 100% rename from lib/commands/ZCOUNT.spec.ts rename to packages/client/lib/commands/ZCOUNT.spec.ts diff --git a/lib/commands/ZCOUNT.ts b/packages/client/lib/commands/ZCOUNT.ts similarity index 100% rename from lib/commands/ZCOUNT.ts rename to packages/client/lib/commands/ZCOUNT.ts diff --git a/lib/commands/ZDIFF.spec.ts b/packages/client/lib/commands/ZDIFF.spec.ts similarity index 100% rename from lib/commands/ZDIFF.spec.ts rename to packages/client/lib/commands/ZDIFF.spec.ts diff --git a/lib/commands/ZDIFF.ts b/packages/client/lib/commands/ZDIFF.ts similarity index 100% rename from lib/commands/ZDIFF.ts rename to packages/client/lib/commands/ZDIFF.ts diff --git a/lib/commands/ZDIFFSTORE.spec.ts b/packages/client/lib/commands/ZDIFFSTORE.spec.ts similarity index 100% rename from lib/commands/ZDIFFSTORE.spec.ts rename to packages/client/lib/commands/ZDIFFSTORE.spec.ts diff --git a/lib/commands/ZDIFFSTORE.ts b/packages/client/lib/commands/ZDIFFSTORE.ts similarity index 100% rename from lib/commands/ZDIFFSTORE.ts rename to packages/client/lib/commands/ZDIFFSTORE.ts diff --git a/lib/commands/ZDIFF_WITHSCORES.spec.ts b/packages/client/lib/commands/ZDIFF_WITHSCORES.spec.ts similarity index 100% rename from lib/commands/ZDIFF_WITHSCORES.spec.ts rename to packages/client/lib/commands/ZDIFF_WITHSCORES.spec.ts diff --git a/lib/commands/ZDIFF_WITHSCORES.ts b/packages/client/lib/commands/ZDIFF_WITHSCORES.ts similarity index 100% rename from lib/commands/ZDIFF_WITHSCORES.ts rename to packages/client/lib/commands/ZDIFF_WITHSCORES.ts diff --git a/lib/commands/ZINCRBY.spec.ts b/packages/client/lib/commands/ZINCRBY.spec.ts similarity index 100% rename from lib/commands/ZINCRBY.spec.ts rename to packages/client/lib/commands/ZINCRBY.spec.ts diff --git a/lib/commands/ZINCRBY.ts b/packages/client/lib/commands/ZINCRBY.ts similarity index 100% rename from lib/commands/ZINCRBY.ts rename to packages/client/lib/commands/ZINCRBY.ts diff --git a/lib/commands/ZINTER.spec.ts b/packages/client/lib/commands/ZINTER.spec.ts similarity index 100% rename from lib/commands/ZINTER.spec.ts rename to packages/client/lib/commands/ZINTER.spec.ts diff --git a/lib/commands/ZINTER.ts b/packages/client/lib/commands/ZINTER.ts similarity index 100% rename from lib/commands/ZINTER.ts rename to packages/client/lib/commands/ZINTER.ts diff --git a/lib/commands/ZINTERSTORE.spec.ts b/packages/client/lib/commands/ZINTERSTORE.spec.ts similarity index 100% rename from lib/commands/ZINTERSTORE.spec.ts rename to packages/client/lib/commands/ZINTERSTORE.spec.ts diff --git a/lib/commands/ZINTERSTORE.ts b/packages/client/lib/commands/ZINTERSTORE.ts similarity index 100% rename from lib/commands/ZINTERSTORE.ts rename to packages/client/lib/commands/ZINTERSTORE.ts diff --git a/lib/commands/ZINTER_WITHSCORES.spec.ts b/packages/client/lib/commands/ZINTER_WITHSCORES.spec.ts similarity index 100% rename from lib/commands/ZINTER_WITHSCORES.spec.ts rename to packages/client/lib/commands/ZINTER_WITHSCORES.spec.ts diff --git a/lib/commands/ZINTER_WITHSCORES.ts b/packages/client/lib/commands/ZINTER_WITHSCORES.ts similarity index 100% rename from lib/commands/ZINTER_WITHSCORES.ts rename to packages/client/lib/commands/ZINTER_WITHSCORES.ts diff --git a/lib/commands/ZLEXCOUNT.spec.ts b/packages/client/lib/commands/ZLEXCOUNT.spec.ts similarity index 100% rename from lib/commands/ZLEXCOUNT.spec.ts rename to packages/client/lib/commands/ZLEXCOUNT.spec.ts diff --git a/lib/commands/ZLEXCOUNT.ts b/packages/client/lib/commands/ZLEXCOUNT.ts similarity index 100% rename from lib/commands/ZLEXCOUNT.ts rename to packages/client/lib/commands/ZLEXCOUNT.ts diff --git a/lib/commands/ZMSCORE.spec.ts b/packages/client/lib/commands/ZMSCORE.spec.ts similarity index 100% rename from lib/commands/ZMSCORE.spec.ts rename to packages/client/lib/commands/ZMSCORE.spec.ts diff --git a/lib/commands/ZMSCORE.ts b/packages/client/lib/commands/ZMSCORE.ts similarity index 100% rename from lib/commands/ZMSCORE.ts rename to packages/client/lib/commands/ZMSCORE.ts diff --git a/lib/commands/ZPOPMAX.spec.ts b/packages/client/lib/commands/ZPOPMAX.spec.ts similarity index 100% rename from lib/commands/ZPOPMAX.spec.ts rename to packages/client/lib/commands/ZPOPMAX.spec.ts diff --git a/lib/commands/ZPOPMAX.ts b/packages/client/lib/commands/ZPOPMAX.ts similarity index 100% rename from lib/commands/ZPOPMAX.ts rename to packages/client/lib/commands/ZPOPMAX.ts diff --git a/lib/commands/ZPOPMAX_COUNT.spec.ts b/packages/client/lib/commands/ZPOPMAX_COUNT.spec.ts similarity index 100% rename from lib/commands/ZPOPMAX_COUNT.spec.ts rename to packages/client/lib/commands/ZPOPMAX_COUNT.spec.ts diff --git a/lib/commands/ZPOPMAX_COUNT.ts b/packages/client/lib/commands/ZPOPMAX_COUNT.ts similarity index 100% rename from lib/commands/ZPOPMAX_COUNT.ts rename to packages/client/lib/commands/ZPOPMAX_COUNT.ts diff --git a/lib/commands/ZPOPMIN.spec.ts b/packages/client/lib/commands/ZPOPMIN.spec.ts similarity index 100% rename from lib/commands/ZPOPMIN.spec.ts rename to packages/client/lib/commands/ZPOPMIN.spec.ts diff --git a/lib/commands/ZPOPMIN.ts b/packages/client/lib/commands/ZPOPMIN.ts similarity index 100% rename from lib/commands/ZPOPMIN.ts rename to packages/client/lib/commands/ZPOPMIN.ts diff --git a/lib/commands/ZPOPMIN_COUNT.spec.ts b/packages/client/lib/commands/ZPOPMIN_COUNT.spec.ts similarity index 100% rename from lib/commands/ZPOPMIN_COUNT.spec.ts rename to packages/client/lib/commands/ZPOPMIN_COUNT.spec.ts diff --git a/lib/commands/ZPOPMIN_COUNT.ts b/packages/client/lib/commands/ZPOPMIN_COUNT.ts similarity index 100% rename from lib/commands/ZPOPMIN_COUNT.ts rename to packages/client/lib/commands/ZPOPMIN_COUNT.ts diff --git a/lib/commands/ZRANDMEMBER.spec.ts b/packages/client/lib/commands/ZRANDMEMBER.spec.ts similarity index 100% rename from lib/commands/ZRANDMEMBER.spec.ts rename to packages/client/lib/commands/ZRANDMEMBER.spec.ts diff --git a/lib/commands/ZRANDMEMBER.ts b/packages/client/lib/commands/ZRANDMEMBER.ts similarity index 100% rename from lib/commands/ZRANDMEMBER.ts rename to packages/client/lib/commands/ZRANDMEMBER.ts diff --git a/lib/commands/ZRANDMEMBER_COUNT.spec.ts b/packages/client/lib/commands/ZRANDMEMBER_COUNT.spec.ts similarity index 100% rename from lib/commands/ZRANDMEMBER_COUNT.spec.ts rename to packages/client/lib/commands/ZRANDMEMBER_COUNT.spec.ts diff --git a/lib/commands/ZRANDMEMBER_COUNT.ts b/packages/client/lib/commands/ZRANDMEMBER_COUNT.ts similarity index 100% rename from lib/commands/ZRANDMEMBER_COUNT.ts rename to packages/client/lib/commands/ZRANDMEMBER_COUNT.ts diff --git a/lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.spec.ts b/packages/client/lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.spec.ts similarity index 100% rename from lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.spec.ts rename to packages/client/lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.spec.ts diff --git a/lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.ts b/packages/client/lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.ts similarity index 100% rename from lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.ts rename to packages/client/lib/commands/ZRANDMEMBER_COUNT_WITHSCORES.ts diff --git a/lib/commands/ZRANGE.spec.ts b/packages/client/lib/commands/ZRANGE.spec.ts similarity index 100% rename from lib/commands/ZRANGE.spec.ts rename to packages/client/lib/commands/ZRANGE.spec.ts diff --git a/lib/commands/ZRANGE.ts b/packages/client/lib/commands/ZRANGE.ts similarity index 100% rename from lib/commands/ZRANGE.ts rename to packages/client/lib/commands/ZRANGE.ts diff --git a/lib/commands/ZRANGEBYLEX.spec.ts b/packages/client/lib/commands/ZRANGEBYLEX.spec.ts similarity index 100% rename from lib/commands/ZRANGEBYLEX.spec.ts rename to packages/client/lib/commands/ZRANGEBYLEX.spec.ts diff --git a/lib/commands/ZRANGEBYLEX.ts b/packages/client/lib/commands/ZRANGEBYLEX.ts similarity index 100% rename from lib/commands/ZRANGEBYLEX.ts rename to packages/client/lib/commands/ZRANGEBYLEX.ts diff --git a/lib/commands/ZRANGEBYSCORE.spec.ts b/packages/client/lib/commands/ZRANGEBYSCORE.spec.ts similarity index 100% rename from lib/commands/ZRANGEBYSCORE.spec.ts rename to packages/client/lib/commands/ZRANGEBYSCORE.spec.ts diff --git a/lib/commands/ZRANGEBYSCORE.ts b/packages/client/lib/commands/ZRANGEBYSCORE.ts similarity index 100% rename from lib/commands/ZRANGEBYSCORE.ts rename to packages/client/lib/commands/ZRANGEBYSCORE.ts diff --git a/lib/commands/ZRANGEBYSCORE_WITHSCORES.spec.ts b/packages/client/lib/commands/ZRANGEBYSCORE_WITHSCORES.spec.ts similarity index 100% rename from lib/commands/ZRANGEBYSCORE_WITHSCORES.spec.ts rename to packages/client/lib/commands/ZRANGEBYSCORE_WITHSCORES.spec.ts diff --git a/lib/commands/ZRANGEBYSCORE_WITHSCORES.ts b/packages/client/lib/commands/ZRANGEBYSCORE_WITHSCORES.ts similarity index 100% rename from lib/commands/ZRANGEBYSCORE_WITHSCORES.ts rename to packages/client/lib/commands/ZRANGEBYSCORE_WITHSCORES.ts diff --git a/lib/commands/ZRANGESTORE.spec.ts b/packages/client/lib/commands/ZRANGESTORE.spec.ts similarity index 100% rename from lib/commands/ZRANGESTORE.spec.ts rename to packages/client/lib/commands/ZRANGESTORE.spec.ts diff --git a/lib/commands/ZRANGESTORE.ts b/packages/client/lib/commands/ZRANGESTORE.ts similarity index 100% rename from lib/commands/ZRANGESTORE.ts rename to packages/client/lib/commands/ZRANGESTORE.ts diff --git a/lib/commands/ZRANGE_WITHSCORES.spec.ts b/packages/client/lib/commands/ZRANGE_WITHSCORES.spec.ts similarity index 100% rename from lib/commands/ZRANGE_WITHSCORES.spec.ts rename to packages/client/lib/commands/ZRANGE_WITHSCORES.spec.ts diff --git a/lib/commands/ZRANGE_WITHSCORES.ts b/packages/client/lib/commands/ZRANGE_WITHSCORES.ts similarity index 100% rename from lib/commands/ZRANGE_WITHSCORES.ts rename to packages/client/lib/commands/ZRANGE_WITHSCORES.ts diff --git a/lib/commands/ZRANK.spec.ts b/packages/client/lib/commands/ZRANK.spec.ts similarity index 100% rename from lib/commands/ZRANK.spec.ts rename to packages/client/lib/commands/ZRANK.spec.ts diff --git a/lib/commands/ZRANK.ts b/packages/client/lib/commands/ZRANK.ts similarity index 100% rename from lib/commands/ZRANK.ts rename to packages/client/lib/commands/ZRANK.ts diff --git a/lib/commands/ZREM.spec.ts b/packages/client/lib/commands/ZREM.spec.ts similarity index 100% rename from lib/commands/ZREM.spec.ts rename to packages/client/lib/commands/ZREM.spec.ts diff --git a/lib/commands/ZREM.ts b/packages/client/lib/commands/ZREM.ts similarity index 100% rename from lib/commands/ZREM.ts rename to packages/client/lib/commands/ZREM.ts diff --git a/lib/commands/ZREMRANGEBYLEX.spec.ts b/packages/client/lib/commands/ZREMRANGEBYLEX.spec.ts similarity index 100% rename from lib/commands/ZREMRANGEBYLEX.spec.ts rename to packages/client/lib/commands/ZREMRANGEBYLEX.spec.ts diff --git a/lib/commands/ZREMRANGEBYLEX.ts b/packages/client/lib/commands/ZREMRANGEBYLEX.ts similarity index 100% rename from lib/commands/ZREMRANGEBYLEX.ts rename to packages/client/lib/commands/ZREMRANGEBYLEX.ts diff --git a/lib/commands/ZREMRANGEBYRANK.spec.ts b/packages/client/lib/commands/ZREMRANGEBYRANK.spec.ts similarity index 100% rename from lib/commands/ZREMRANGEBYRANK.spec.ts rename to packages/client/lib/commands/ZREMRANGEBYRANK.spec.ts diff --git a/lib/commands/ZREMRANGEBYRANK.ts b/packages/client/lib/commands/ZREMRANGEBYRANK.ts similarity index 100% rename from lib/commands/ZREMRANGEBYRANK.ts rename to packages/client/lib/commands/ZREMRANGEBYRANK.ts diff --git a/lib/commands/ZREMRANGEBYSCORE.spec.ts b/packages/client/lib/commands/ZREMRANGEBYSCORE.spec.ts similarity index 100% rename from lib/commands/ZREMRANGEBYSCORE.spec.ts rename to packages/client/lib/commands/ZREMRANGEBYSCORE.spec.ts diff --git a/lib/commands/ZREMRANGEBYSCORE.ts b/packages/client/lib/commands/ZREMRANGEBYSCORE.ts similarity index 100% rename from lib/commands/ZREMRANGEBYSCORE.ts rename to packages/client/lib/commands/ZREMRANGEBYSCORE.ts diff --git a/lib/commands/ZREVRANK.spec.ts b/packages/client/lib/commands/ZREVRANK.spec.ts similarity index 100% rename from lib/commands/ZREVRANK.spec.ts rename to packages/client/lib/commands/ZREVRANK.spec.ts diff --git a/lib/commands/ZREVRANK.ts b/packages/client/lib/commands/ZREVRANK.ts similarity index 100% rename from lib/commands/ZREVRANK.ts rename to packages/client/lib/commands/ZREVRANK.ts diff --git a/lib/commands/ZSCAN.spec.ts b/packages/client/lib/commands/ZSCAN.spec.ts similarity index 100% rename from lib/commands/ZSCAN.spec.ts rename to packages/client/lib/commands/ZSCAN.spec.ts diff --git a/lib/commands/ZSCAN.ts b/packages/client/lib/commands/ZSCAN.ts similarity index 100% rename from lib/commands/ZSCAN.ts rename to packages/client/lib/commands/ZSCAN.ts diff --git a/lib/commands/ZSCORE.spec.ts b/packages/client/lib/commands/ZSCORE.spec.ts similarity index 100% rename from lib/commands/ZSCORE.spec.ts rename to packages/client/lib/commands/ZSCORE.spec.ts diff --git a/lib/commands/ZSCORE.ts b/packages/client/lib/commands/ZSCORE.ts similarity index 100% rename from lib/commands/ZSCORE.ts rename to packages/client/lib/commands/ZSCORE.ts diff --git a/lib/commands/ZUNION.spec.ts b/packages/client/lib/commands/ZUNION.spec.ts similarity index 100% rename from lib/commands/ZUNION.spec.ts rename to packages/client/lib/commands/ZUNION.spec.ts diff --git a/lib/commands/ZUNION.ts b/packages/client/lib/commands/ZUNION.ts similarity index 100% rename from lib/commands/ZUNION.ts rename to packages/client/lib/commands/ZUNION.ts diff --git a/lib/commands/ZUNIONSTORE.spec.ts b/packages/client/lib/commands/ZUNIONSTORE.spec.ts similarity index 100% rename from lib/commands/ZUNIONSTORE.spec.ts rename to packages/client/lib/commands/ZUNIONSTORE.spec.ts diff --git a/lib/commands/ZUNIONSTORE.ts b/packages/client/lib/commands/ZUNIONSTORE.ts similarity index 100% rename from lib/commands/ZUNIONSTORE.ts rename to packages/client/lib/commands/ZUNIONSTORE.ts diff --git a/lib/commands/ZUNION_WITHSCORES.spec.ts b/packages/client/lib/commands/ZUNION_WITHSCORES.spec.ts similarity index 100% rename from lib/commands/ZUNION_WITHSCORES.spec.ts rename to packages/client/lib/commands/ZUNION_WITHSCORES.spec.ts diff --git a/lib/commands/ZUNION_WITHSCORES.ts b/packages/client/lib/commands/ZUNION_WITHSCORES.ts similarity index 100% rename from lib/commands/ZUNION_WITHSCORES.ts rename to packages/client/lib/commands/ZUNION_WITHSCORES.ts diff --git a/lib/commands/generic-transformers.spec.ts b/packages/client/lib/commands/generic-transformers.spec.ts similarity index 100% rename from lib/commands/generic-transformers.spec.ts rename to packages/client/lib/commands/generic-transformers.spec.ts diff --git a/lib/commands/generic-transformers.ts b/packages/client/lib/commands/generic-transformers.ts similarity index 100% rename from lib/commands/generic-transformers.ts rename to packages/client/lib/commands/generic-transformers.ts diff --git a/lib/commands/index.ts b/packages/client/lib/commands/index.ts similarity index 100% rename from lib/commands/index.ts rename to packages/client/lib/commands/index.ts diff --git a/lib/errors.ts b/packages/client/lib/errors.ts similarity index 100% rename from lib/errors.ts rename to packages/client/lib/errors.ts diff --git a/lib/lua-script.ts b/packages/client/lib/lua-script.ts similarity index 100% rename from lib/lua-script.ts rename to packages/client/lib/lua-script.ts diff --git a/lib/multi-command.spec.ts b/packages/client/lib/multi-command.spec.ts similarity index 100% rename from lib/multi-command.spec.ts rename to packages/client/lib/multi-command.spec.ts diff --git a/lib/multi-command.ts b/packages/client/lib/multi-command.ts similarity index 100% rename from lib/multi-command.ts rename to packages/client/lib/multi-command.ts diff --git a/lib/test-utils/index.ts b/packages/client/lib/test-utils.ts similarity index 93% rename from lib/test-utils/index.ts rename to packages/client/lib/test-utils.ts index 69bfc440c91..85057da841e 100644 --- a/lib/test-utils/index.ts +++ b/packages/client/lib/test-utils.ts @@ -1,6 +1,6 @@ -import TestUtils from './test-utils'; +import TestUtils from '@redis/test-utils'; import { SinonSpy } from 'sinon'; -import { promiseTimeout } from '../utils'; +import { promiseTimeout } from './utils'; export default new TestUtils({ defaultDockerVersion: '6.2', diff --git a/lib/ts-declarations/cluster-key-slot.d.ts b/packages/client/lib/ts-declarations/cluster-key-slot.d.ts similarity index 100% rename from lib/ts-declarations/cluster-key-slot.d.ts rename to packages/client/lib/ts-declarations/cluster-key-slot.d.ts diff --git a/lib/ts-declarations/redis-parser.d.ts b/packages/client/lib/ts-declarations/redis-parser.d.ts similarity index 100% rename from lib/ts-declarations/redis-parser.d.ts rename to packages/client/lib/ts-declarations/redis-parser.d.ts diff --git a/lib/utils.ts b/packages/client/lib/utils.ts similarity index 100% rename from lib/utils.ts rename to packages/client/lib/utils.ts diff --git a/packages/client/package.json b/packages/client/package.json new file mode 100644 index 00000000000..30be25d26af --- /dev/null +++ b/packages/client/package.json @@ -0,0 +1,49 @@ +{ + "name": "@redis/client", + "version": "4.0.0-rc.3", + "license": "MIT", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "test": "nyc -r text-summary -r html mocha -r source-map-support/register -r ts-node/register './lib/**/*.spec.ts'", + "build": "tsc", + "lint": "eslint ./*.ts ./lib/**/*.ts", + "documentation": "typedoc" + }, + "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", + "@redis/test-utils": "*", + "@types/node": "^16.11.6", + "@types/sinon": "^10.0.6", + "@types/yallist": "^4.0.1", + "@typescript-eslint/eslint-plugin": "^5.2.0", + "@typescript-eslint/parser": "^5.2.0", + "eslint": "^8.1.0", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "sinon": "^11.1.2", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typedoc": "^0.22.7", + "typedoc-github-wiki-theme": "^0.6.0", + "typedoc-plugin-markdown": "^3.11.3", + "typescript": "^4.4.4" + }, + "engines": { + "node": ">=12" + }, + "repository": { + "type": "git", + "url": "git://github.com/redis/node-redis.git" + }, + "bugs": { + "url": "https://github.com/redis/node-redis/issues" + }, + "homepage": "https://github.com/redis/node-redis" +} diff --git a/packages/client/tsconfig.json b/packages/client/tsconfig.json new file mode 100644 index 00000000000..1700c9097bf --- /dev/null +++ b/packages/client/tsconfig.json @@ -0,0 +1,27 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist" + }, + "include": [ + "./index.ts", + "./lib/**/*.ts" + ], + "exclude": [ + "./lib/test-utils.ts", + "./lib/**/*.spec.ts" + ], + "typedocOptions": { + "entryPoints": [ + "./index.ts", + "./lib" + ], + "entryPointStrategy": "expand", + "exclude": [ + "./lib/ts-declarations", + "./lib/test-utils.ts" + ], + "theme": "./node_modules/typedoc-github-wiki-theme/dist", + "out": "documentation" + } +} diff --git a/packages/json/.nycrc.json b/packages/json/.nycrc.json new file mode 100644 index 00000000000..b4e671e178f --- /dev/null +++ b/packages/json/.nycrc.json @@ -0,0 +1,4 @@ +{ + "extends": "@istanbuljs/nyc-config-typescript", + "exclude": ["**/*.spec.ts", "lib/test-utils.ts"] +} diff --git a/packages/json/lib/commands/ARRAPPEND.spec.ts b/packages/json/lib/commands/ARRAPPEND.spec.ts new file mode 100644 index 00000000000..ab53837a000 --- /dev/null +++ b/packages/json/lib/commands/ARRAPPEND.spec.ts @@ -0,0 +1,30 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './ARRAPPEND'; + +describe('ARRAPPEND', () => { + describe('transformArguments', () => { + it('single JSON', () => { + assert.deepEqual( + transformArguments('key', '$', 1), + ['JSON.ARRAPPEND', 'key', '$', '1'] + ); + }); + + it('multiple JSONs', () => { + assert.deepEqual( + transformArguments('key', '$', 1, 2), + ['JSON.ARRAPPEND', 'key', '$', '1', '2'] + ); + }); + }); + + testUtils.testWithClient('client.json.arrAppend', async client => { + await client.json.set('key', '$', []); + + assert.deepEqual( + await client.json.arrAppend('key', '$', 1), + [1] + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/ARRAPPEND.ts b/packages/json/lib/commands/ARRAPPEND.ts new file mode 100644 index 00000000000..2935d192996 --- /dev/null +++ b/packages/json/lib/commands/ARRAPPEND.ts @@ -0,0 +1,15 @@ +import { RedisJSON, transformRedisJsonArgument } from '.'; + +export const FIRST_KEY_INDEX = 1; + +export function transformArguments(key: string, path: string, ...jsons: Array): Array { + const args = ['JSON.ARRAPPEND', key, path]; + + for (const json of jsons) { + args.push(transformRedisJsonArgument(json)); + } + + return args; +} + +export declare function transformReply(): number | Array; diff --git a/packages/json/lib/commands/ARRINDEX.spec.ts b/packages/json/lib/commands/ARRINDEX.spec.ts new file mode 100644 index 00000000000..7a47d67126a --- /dev/null +++ b/packages/json/lib/commands/ARRINDEX.spec.ts @@ -0,0 +1,37 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './ARRINDEX'; + +describe('ARRINDEX', () => { + describe('transformArguments', () => { + it('simple', () => { + assert.deepEqual( + transformArguments('key', '$', 'json'), + ['JSON.ARRINDEX', 'key', '$', '"json"'] + ); + }); + + it('with start', () => { + assert.deepEqual( + transformArguments('key', '$', 'json', 1), + ['JSON.ARRINDEX', 'key', '$', '"json"', '1'] + ); + }); + + it('with start, end', () => { + assert.deepEqual( + transformArguments('key', '$', 'json', 1, 2), + ['JSON.ARRINDEX', 'key', '$', '"json"', '1', '2'] + ); + }); + }); + + testUtils.testWithClient('client.json.arrIndex', async client => { + await client.json.set('key', '$', []); + + assert.deepEqual( + await client.json.arrIndex('key', '$', 'json'), + [-1] + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/ARRINDEX.ts b/packages/json/lib/commands/ARRINDEX.ts new file mode 100644 index 00000000000..5860b59cb3c --- /dev/null +++ b/packages/json/lib/commands/ARRINDEX.ts @@ -0,0 +1,21 @@ +import { RedisJSON, transformRedisJsonArgument } from '.'; + +export const FIRST_KEY_INDEX = 1; + +export const IS_READ_ONLY = true; + +export function transformArguments(key: string, path: string, json: RedisJSON, start?: number, stop?: number): Array { + const args = ['JSON.ARRINDEX', key, path, transformRedisJsonArgument(json)]; + + if (start !== undefined && start !== null) { + args.push(start.toString()); + + if (stop !== undefined && stop !== null) { + args.push(stop.toString()); + } + } + + return args; +} + +export declare function transformReply(): number | Array; diff --git a/packages/json/lib/commands/ARRINSERT.spec.ts b/packages/json/lib/commands/ARRINSERT.spec.ts new file mode 100644 index 00000000000..4b9d58b2cac --- /dev/null +++ b/packages/json/lib/commands/ARRINSERT.spec.ts @@ -0,0 +1,30 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './ARRINSERT'; + +describe('ARRINSERT', () => { + describe('transformArguments', () => { + it('single JSON', () => { + assert.deepEqual( + transformArguments('key', '$', 0, 'json'), + ['JSON.ARRINSERT', 'key', '$', '0', '"json"'] + ); + }); + + it('multiple JSONs', () => { + assert.deepEqual( + transformArguments('key', '$', 0, '1', '2'), + ['JSON.ARRINSERT', 'key', '$', '0', '"1"', '"2"'] + ); + }); + }); + + testUtils.testWithClient('client.json.arrInsert', async client => { + await client.json.set('key', '$', []); + + assert.deepEqual( + await client.json.arrInsert('key', '$', 0, 'json'), + [1] + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/ARRINSERT.ts b/packages/json/lib/commands/ARRINSERT.ts new file mode 100644 index 00000000000..85857657019 --- /dev/null +++ b/packages/json/lib/commands/ARRINSERT.ts @@ -0,0 +1,15 @@ +import { RedisJSON, transformRedisJsonArgument } from '.'; + +export const FIRST_KEY_INDEX = 1; + +export function transformArguments(key: string, path: string, index: number, ...jsons: Array): Array { + const args = ['JSON.ARRINSERT', key, path, index.toString()]; + + for (const json of jsons) { + args.push(transformRedisJsonArgument(json)); + } + + return args; +} + +export declare function transformReply(): number | Array; diff --git a/packages/json/lib/commands/ARRLEN.spec.ts b/packages/json/lib/commands/ARRLEN.spec.ts new file mode 100644 index 00000000000..f0a3ec40a4c --- /dev/null +++ b/packages/json/lib/commands/ARRLEN.spec.ts @@ -0,0 +1,30 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './ARRLEN'; + +describe('ARRLEN', () => { + describe('transformArguments', () => { + it('without path', () => { + assert.deepEqual( + transformArguments('key'), + ['JSON.ARRLEN', 'key'] + ); + }); + + it('with path', () => { + assert.deepEqual( + transformArguments('key', '$'), + ['JSON.ARRLEN', 'key', '$'] + ); + }); + }); + + testUtils.testWithClient('client.json.arrLen', async client => { + await client.json.set('key', '$', []); + + assert.deepEqual( + await client.json.arrLen('key', '$'), + [0] + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/ARRLEN.ts b/packages/json/lib/commands/ARRLEN.ts new file mode 100644 index 00000000000..818397b7f8d --- /dev/null +++ b/packages/json/lib/commands/ARRLEN.ts @@ -0,0 +1,15 @@ +export const FIRST_KEY_INDEX = 1; + +export const IS_READ_ONLY = true; + +export function transformArguments(key: string, path?: string): Array { + const args = ['JSON.ARRLEN', key]; + + if (path) { + args.push(path); + } + + return args; +} + +export declare function transformReply(): number | Array; diff --git a/packages/json/lib/commands/ARRPOP.spec.ts b/packages/json/lib/commands/ARRPOP.spec.ts new file mode 100644 index 00000000000..a80b8c3cbc5 --- /dev/null +++ b/packages/json/lib/commands/ARRPOP.spec.ts @@ -0,0 +1,37 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './ARRPOP'; + +describe('ARRPOP', () => { + describe('transformArguments', () => { + it('key', () => { + assert.deepEqual( + transformArguments('key'), + ['JSON.ARRPOP', 'key'] + ); + }); + + it('key, path', () => { + assert.deepEqual( + transformArguments('key', '$'), + ['JSON.ARRPOP', 'key', '$'] + ); + }); + + it('key, path, index', () => { + assert.deepEqual( + transformArguments('key', '$', 0), + ['JSON.ARRPOP', 'key', '$', '0'] + ); + }); + }); + + testUtils.testWithClient('client.json.arrPop', async client => { + await client.json.set('key', '$', []); + + assert.deepEqual( + await client.json.arrPop('key', '$'), + [null] + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/ARRPOP.ts b/packages/json/lib/commands/ARRPOP.ts new file mode 100644 index 00000000000..5d8785a8d94 --- /dev/null +++ b/packages/json/lib/commands/ARRPOP.ts @@ -0,0 +1,17 @@ +export const FIRST_KEY_INDEX = 1; + +export function transformArguments(key: string, path?: string, index?: number): Array { + const args = ['JSON.ARRPOP', key]; + + if (path) { + args.push(path); + + if (index !== undefined && index !== null) { + args.push(index.toString()); + } + } + + return args; +} + +export { transformRedisJsonNullArrayReply as transformReply } from '.'; diff --git a/packages/json/lib/commands/ARRTRIM.spec.ts b/packages/json/lib/commands/ARRTRIM.spec.ts new file mode 100644 index 00000000000..c254e1b6a03 --- /dev/null +++ b/packages/json/lib/commands/ARRTRIM.spec.ts @@ -0,0 +1,21 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './ARRTRIM'; + +describe('ARRTRIM', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key', '$', 0, 1), + ['JSON.ARRTRIM', 'key', '$', '0', '1'] + ); + }); + + testUtils.testWithClient('client.json.arrTrim', async client => { + await client.json.set('key', '$', []); + + assert.deepEqual( + await client.json.arrTrim('key', '$', 0, 1), + [0] + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/ARRTRIM.ts b/packages/json/lib/commands/ARRTRIM.ts new file mode 100644 index 00000000000..2de444eeebd --- /dev/null +++ b/packages/json/lib/commands/ARRTRIM.ts @@ -0,0 +1,7 @@ +export const FIRST_KEY_INDEX = 1; + +export function transformArguments(key: string, path: string, start: number, stop: number): Array { + return ['JSON.ARRTRIM', key, path, start.toString(), stop.toString()]; +} + +export declare function transformReply(): number | Array; diff --git a/packages/json/lib/commands/DEBUG_MEMORY.spec.ts b/packages/json/lib/commands/DEBUG_MEMORY.spec.ts new file mode 100644 index 00000000000..468c994f2f5 --- /dev/null +++ b/packages/json/lib/commands/DEBUG_MEMORY.spec.ts @@ -0,0 +1,28 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './DEBUG_MEMORY'; + +describe('DEBUG MEMORY', () => { + describe('transformArguments', () => { + it('without path', () => { + assert.deepEqual( + transformArguments('key'), + ['JSON.DEBUG', 'MEMORY', 'key'] + ); + }); + + it('with path', () => { + assert.deepEqual( + transformArguments('key', '$'), + ['JSON.DEBUG', 'MEMORY', 'key', '$'] + ); + }); + }); + + testUtils.testWithClient('client.json.arrTrim', async client => { + assert.deepEqual( + await client.json.debugMemory('key', '$'), + [] + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/DEBUG_MEMORY.ts b/packages/json/lib/commands/DEBUG_MEMORY.ts new file mode 100644 index 00000000000..da60b1d9529 --- /dev/null +++ b/packages/json/lib/commands/DEBUG_MEMORY.ts @@ -0,0 +1,13 @@ +export const FIRST_KEY_INDEX = 2; + +export function transformArguments(key: string, path?: string): Array { + const args = ['JSON.DEBUG', 'MEMORY', key]; + + if (path) { + args.push(path); + } + + return args; +} + +export declare function transformReply(): number; diff --git a/packages/json/lib/commands/DEL.spec.ts b/packages/json/lib/commands/DEL.spec.ts new file mode 100644 index 00000000000..a957b9584ac --- /dev/null +++ b/packages/json/lib/commands/DEL.spec.ts @@ -0,0 +1,28 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './DEL'; + +describe('DEL', () => { + describe('transformArguments', () => { + it('key', () => { + assert.deepEqual( + transformArguments('key'), + ['JSON.DEL', 'key'] + ); + }); + + it('key, path', () => { + assert.deepEqual( + transformArguments('key', '$.path'), + ['JSON.DEL', 'key', '$.path'] + ); + }); + }); + + testUtils.testWithClient('client.json.del', async client => { + assert.deepEqual( + await client.json.del('key'), + 0 + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/DEL.ts b/packages/json/lib/commands/DEL.ts new file mode 100644 index 00000000000..090d4dbe853 --- /dev/null +++ b/packages/json/lib/commands/DEL.ts @@ -0,0 +1,13 @@ +export const FIRST_KEY_INDEX = 1; + +export function transformArguments(key: string, path?: string): Array { + const args = ['JSON.DEL', key]; + + if (path) { + args.push(path); + } + + return args; +} + +export declare function transformReply(): number; diff --git a/packages/json/lib/commands/FORGET.spec.ts b/packages/json/lib/commands/FORGET.spec.ts new file mode 100644 index 00000000000..923bb997fc8 --- /dev/null +++ b/packages/json/lib/commands/FORGET.spec.ts @@ -0,0 +1,28 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './FORGET'; + +describe('FORGET', () => { + describe('transformArguments', () => { + it('key', () => { + assert.deepEqual( + transformArguments('key'), + ['JSON.FORGET', 'key'] + ); + }); + + it('key, path', () => { + assert.deepEqual( + transformArguments('key', '$.path'), + ['JSON.FORGET', 'key', '$.path'] + ); + }); + }); + + testUtils.testWithClient('client.json.forget', async client => { + assert.deepEqual( + await client.json.forget('key'), + 0 + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/FORGET.ts b/packages/json/lib/commands/FORGET.ts new file mode 100644 index 00000000000..cb2df3d605d --- /dev/null +++ b/packages/json/lib/commands/FORGET.ts @@ -0,0 +1,13 @@ +export const FIRST_KEY_INDEX = 1; + +export function transformArguments(key: string, path?: string): Array { + const args = ['JSON.FORGET', key]; + + if (path) { + args.push(path); + } + + return args; +} + +export declare function transformReply(): number; diff --git a/packages/json/lib/commands/GET.spec.ts b/packages/json/lib/commands/GET.spec.ts new file mode 100644 index 00000000000..ed831689a93 --- /dev/null +++ b/packages/json/lib/commands/GET.spec.ts @@ -0,0 +1,78 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './GET'; + +describe('GET', () => { + describe('transformArguments', () => { + describe('path', () => { + it('string', () => { + assert.deepEqual( + transformArguments('key', { path: '$' }), + ['JSON.GET', 'key', '$'] + ); + }); + + it('array', () => { + assert.deepEqual( + transformArguments('key', { path: ['$.1', '$.2'] }), + ['JSON.GET', 'key', '$.1', '$.2'] + ); + }); + }); + + it('key', () => { + assert.deepEqual( + transformArguments('key'), + ['JSON.GET', 'key'] + ); + }); + + it('INDENT', () => { + assert.deepEqual( + transformArguments('key', { INDENT: 'indent' }), + ['JSON.GET', 'key', 'INDENT', 'indent'] + ); + }); + + it('NEWLINE', () => { + assert.deepEqual( + transformArguments('key', { NEWLINE: 'newline' }), + ['JSON.GET', 'key', 'NEWLINE', 'newline'] + ); + }); + + it('SPACE', () => { + assert.deepEqual( + transformArguments('key', { SPACE: 'space' }), + ['JSON.GET', 'key', 'SPACE', 'space'] + ); + }); + + it('NOESCAPE', () => { + assert.deepEqual( + transformArguments('key', { NOESCAPE: true }), + ['JSON.GET', 'key', 'NOESCAPE'] + ); + }); + + it('INDENT, NEWLINE, SPACE, NOESCAPE, path', () => { + assert.deepEqual( + transformArguments('key', { + path: '$.path', + INDENT: 'indent', + NEWLINE: 'newline', + SPACE: 'space', + NOESCAPE: true + }), + ['JSON.GET', 'key', '$.path', 'INDENT', 'indent', 'NEWLINE', 'newline', 'SPACE', 'space', 'NOESCAPE'] + ); + }); + }); + + testUtils.testWithClient('client.json.get', async client => { + assert.equal( + await client.json.get('key'), + null + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/GET.ts b/packages/json/lib/commands/GET.ts new file mode 100644 index 00000000000..8b69dc80533 --- /dev/null +++ b/packages/json/lib/commands/GET.ts @@ -0,0 +1,41 @@ +import { pushVerdictArguments } from '@redis/client/lib/commands/generic-transformers'; + +export const FIRST_KEY_INDEX = 1; + +export const IS_READ_ONLY = true; + +interface GetOptions { + path?: string | Array; + INDENT?: string; + NEWLINE?: string; + SPACE?: string; + NOESCAPE?: true; +} + +export function transformArguments(key: string, options?: GetOptions): Array { + const args = ['JSON.GET', key]; + + if (options?.path) { + pushVerdictArguments(args, options.path); + } + + if (options?.INDENT) { + args.push('INDENT', options.INDENT); + } + + if (options?.NEWLINE) { + args.push('NEWLINE', options.NEWLINE); + } + + if (options?.SPACE) { + args.push('SPACE', options.SPACE); + } + + if (options?.NOESCAPE) { + args.push('NOESCAPE'); + } + + return args; +} + +export { transformRedisJsonNullReply as transformReply } from '.'; diff --git a/packages/json/lib/commands/MGET.spec.ts b/packages/json/lib/commands/MGET.spec.ts new file mode 100644 index 00000000000..456e160dd50 --- /dev/null +++ b/packages/json/lib/commands/MGET.spec.ts @@ -0,0 +1,19 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './MGET'; + +describe('MGET', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments(['1', '2'], '$'), + ['JSON.MGET', '1', '2', '$'] + ); + }); + + testUtils.testWithClient('client.json.mGet', async client => { + assert.deepEqual( + await client.json.mGet(['1', '2'], '$'), + [null, null] + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/MGET.ts b/packages/json/lib/commands/MGET.ts new file mode 100644 index 00000000000..582b73bf85a --- /dev/null +++ b/packages/json/lib/commands/MGET.ts @@ -0,0 +1,15 @@ +import { RedisJSON, transformRedisJsonNullReply } from '.'; + +export const FIRST_KEY_INDEX = 1; + +export function transformArguments(keys: Array, path: string): Array { + return [ + 'JSON.MGET', + ...keys, + path + ]; +} + +export function transformReply(reply: Array): Array { + return reply.map(transformRedisJsonNullReply); +} diff --git a/packages/json/lib/commands/NUMINCRBY.spec.ts b/packages/json/lib/commands/NUMINCRBY.spec.ts new file mode 100644 index 00000000000..56dede68bde --- /dev/null +++ b/packages/json/lib/commands/NUMINCRBY.spec.ts @@ -0,0 +1,21 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './NUMINCRBY'; + +describe('NUMINCRBY', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key', '$', 1), + ['JSON.NUMINCRBY', 'key', '$', '1'] + ); + }); + + testUtils.testWithClient('client.json.numIncrBy', async client => { + await client.json.set('key', '$', 0); + + assert.deepEqual( + await client.json.numIncrBy('key', '$', 1), + [1] + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/NUMINCRBY.ts b/packages/json/lib/commands/NUMINCRBY.ts new file mode 100644 index 00000000000..e3d8887ea3d --- /dev/null +++ b/packages/json/lib/commands/NUMINCRBY.ts @@ -0,0 +1,7 @@ +export const FIRST_KEY_INDEX = 1; + +export function transformArguments(key: string, path: string, by: number): Array { + return ['JSON.NUMINCRBY', key, path, by.toString()]; +} + +export { transformNumbersReply as transformReply } from '.'; diff --git a/packages/json/lib/commands/NUMMULTBY.spec.ts b/packages/json/lib/commands/NUMMULTBY.spec.ts new file mode 100644 index 00000000000..3e2581a3cd8 --- /dev/null +++ b/packages/json/lib/commands/NUMMULTBY.spec.ts @@ -0,0 +1,21 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './NUMMULTBY'; + +describe('NUMMULTBY', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key', '$', 2), + ['JSON.NUMMULTBY', 'key', '$', '2'] + ); + }); + + testUtils.testWithClient('client.json.numMultBy', async client => { + await client.json.set('key', '$', 1); + + assert.deepEqual( + await client.json.numMultBy('key', '$', 2), + [2] + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/NUMMULTBY.ts b/packages/json/lib/commands/NUMMULTBY.ts new file mode 100644 index 00000000000..2082916619a --- /dev/null +++ b/packages/json/lib/commands/NUMMULTBY.ts @@ -0,0 +1,7 @@ +export const FIRST_KEY_INDEX = 1; + +export function transformArguments(key: string, path: string, by: number): Array { + return ['JSON.NUMMULTBY', key, path, by.toString()]; +} + +export { transformNumbersReply as transformReply } from '.'; diff --git a/packages/json/lib/commands/OBJKEYS.spec.ts b/packages/json/lib/commands/OBJKEYS.spec.ts new file mode 100644 index 00000000000..6288c112392 --- /dev/null +++ b/packages/json/lib/commands/OBJKEYS.spec.ts @@ -0,0 +1,28 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './OBJKEYS'; + +describe('OBJKEYS', () => { + describe('transformArguments', () => { + it('without path', () => { + assert.deepEqual( + transformArguments('key'), + ['JSON.OBJKEYS', 'key'] + ); + }); + + it('with path', () => { + assert.deepEqual( + transformArguments('key', '$'), + ['JSON.OBJKEYS', 'key', '$'] + ); + }); + }); + + // testUtils.testWithClient('client.json.objKeys', async client => { + // assert.deepEqual( + // await client.json.objKeys('key', '$'), + // [null] + // ); + // }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/OBJKEYS.ts b/packages/json/lib/commands/OBJKEYS.ts new file mode 100644 index 00000000000..a9465c9160c --- /dev/null +++ b/packages/json/lib/commands/OBJKEYS.ts @@ -0,0 +1,13 @@ +export const FIRST_KEY_INDEX = 1; + +export function transformArguments(key: string, path?: string): Array { + const args = ['JSON.OBJKEYS', key]; + + if (path) { + args.push(path); + } + + return args; +} + +export declare function transformReply(): Array | null | Array | null>; diff --git a/packages/json/lib/commands/OBJLEN.spec.ts b/packages/json/lib/commands/OBJLEN.spec.ts new file mode 100644 index 00000000000..35b6589c875 --- /dev/null +++ b/packages/json/lib/commands/OBJLEN.spec.ts @@ -0,0 +1,28 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './OBJLEN'; + +describe('OBJLEN', () => { + describe('transformArguments', () => { + it('without path', () => { + assert.deepEqual( + transformArguments('key'), + ['JSON.OBJLEN', 'key'] + ); + }); + + it('with path', () => { + assert.deepEqual( + transformArguments('key', '$'), + ['JSON.OBJLEN', 'key', '$'] + ); + }); + }); + + // testUtils.testWithClient('client.json.objLen', async client => { + // assert.equal( + // await client.json.objLen('key', '$'), + // [null] + // ); + // }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/OBJLEN.ts b/packages/json/lib/commands/OBJLEN.ts new file mode 100644 index 00000000000..aa800e97f71 --- /dev/null +++ b/packages/json/lib/commands/OBJLEN.ts @@ -0,0 +1,13 @@ +export const FIRST_KEY_INDEX = 1; + +export function transformArguments(key: string, path?: string): Array { + const args = ['JSON.OBJLEN', key]; + + if (path) { + args.push(path); + } + + return args; +} + +export declare function transformReply(): number | null | Array; diff --git a/packages/json/lib/commands/RESP.spec.ts b/packages/json/lib/commands/RESP.spec.ts new file mode 100644 index 00000000000..8b70962d1c5 --- /dev/null +++ b/packages/json/lib/commands/RESP.spec.ts @@ -0,0 +1,28 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './RESP'; + +describe('RESP', () => { + describe('transformArguments', () => { + it('without path', () => { + assert.deepEqual( + transformArguments('key'), + ['JSON.RESP', 'key'] + ); + }); + + it('with path', () => { + assert.deepEqual( + transformArguments('key', '$'), + ['JSON.RESP', 'key', '$'] + ); + }); + }); + + // testUtils.testWithClient('client.json.resp', async client => { + // assert.deepEqual( + // await client.json.resp('key', '$'), + // [null] + // ); + // }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/RESP.ts b/packages/json/lib/commands/RESP.ts new file mode 100644 index 00000000000..2b56bf1f059 --- /dev/null +++ b/packages/json/lib/commands/RESP.ts @@ -0,0 +1,15 @@ +export const FIRST_KEY_INDEX = 1; + +export function transformArguments(key: string, path?: string): Array { + const args = ['JSON.RESP', key]; + + if (path) { + args.push(path); + } + + return args; +} + +type RESPReply = Array; + +export declare function transfromReply(): RESPReply; diff --git a/packages/json/lib/commands/SET.spec.ts b/packages/json/lib/commands/SET.spec.ts new file mode 100644 index 00000000000..8f8586a2047 --- /dev/null +++ b/packages/json/lib/commands/SET.spec.ts @@ -0,0 +1,35 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './SET'; + +describe('SET', () => { + describe('transformArguments', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key', '$', 'json'), + ['JSON.SET', 'key', '$', '"json"'] + ); + }); + + it('NX', () => { + assert.deepEqual( + transformArguments('key', '$', 'json', { NX: true }), + ['JSON.SET', 'key', '$', '"json"', 'NX'] + ); + }); + + it('XX', () => { + assert.deepEqual( + transformArguments('key', '$', 'json', { XX: true }), + ['JSON.SET', 'key', '$', '"json"', 'XX'] + ); + }); + }); + + testUtils.testWithClient('client.json.mGet', async client => { + assert.equal( + await client.json.set('key', '$', 'json'), + 'OK' + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/SET.ts b/packages/json/lib/commands/SET.ts new file mode 100644 index 00000000000..f50a42bf5db --- /dev/null +++ b/packages/json/lib/commands/SET.ts @@ -0,0 +1,25 @@ +import { RedisJSON, transformRedisJsonArgument } from '.'; + +export const FIRST_KEY_INDEX = 1; + +interface NX { + NX: true; +} + +interface XX { + XX: true; +} + +export function transformArguments(key: string, path: string, json: RedisJSON, options?: NX | XX): Array { + const args = ['JSON.SET', key, path, transformRedisJsonArgument(json)]; + + if ((options)?.NX) { + args.push('NX'); + } else if ((options)?.XX) { + args.push('XX'); + } + + return args; +} + +export declare function transformReply(): 'OK' | null; diff --git a/packages/json/lib/commands/STRAPPEND.spec.ts b/packages/json/lib/commands/STRAPPEND.spec.ts new file mode 100644 index 00000000000..a37eaa1d91c --- /dev/null +++ b/packages/json/lib/commands/STRAPPEND.spec.ts @@ -0,0 +1,30 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './STRAPPEND'; + +describe('STRAPPEND', () => { + describe('transformArguments', () => { + it('without path', () => { + assert.deepEqual( + transformArguments('key', 'append'), + ['JSON.STRAPPEND', 'key', '"append"'] + ); + }); + + it('with path', () => { + assert.deepEqual( + transformArguments('key', '$', 'append'), + ['JSON.STRAPPEND', 'key', '$', '"append"'] + ); + }); + }); + + testUtils.testWithClient('client.json.strAppend', async client => { + await client.json.set('key', '$', ''); + + assert.deepEqual( + await client.json.strAppend('key', '$', 'append'), + [6] + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/STRAPPEND.ts b/packages/json/lib/commands/STRAPPEND.ts new file mode 100644 index 00000000000..eea384c93fd --- /dev/null +++ b/packages/json/lib/commands/STRAPPEND.ts @@ -0,0 +1,21 @@ +import { transformRedisJsonArgument } from '.'; + +export const FIRST_KEY_INDEX = 1; + +type AppendArguments = [key: string, append: string]; + +type AppendWithPathArguments = [key: string, path: string, append: string]; + +export function transformArguments(...[key, pathOrAppend, append]: AppendArguments | AppendWithPathArguments): Array { + const args = ['JSON.STRAPPEND', key]; + + if (append !== undefined && append !== null) { + args.push(pathOrAppend, transformRedisJsonArgument(append)); + } else { + args.push(transformRedisJsonArgument(pathOrAppend)); + } + + return args; +} + +export declare function transformReply(): number | Array; diff --git a/packages/json/lib/commands/STRLEN.spec.ts b/packages/json/lib/commands/STRLEN.spec.ts new file mode 100644 index 00000000000..cf163d3c19e --- /dev/null +++ b/packages/json/lib/commands/STRLEN.spec.ts @@ -0,0 +1,30 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './STRLEN'; + +describe('STRLEN', () => { + describe('transformArguments', () => { + it('without path', () => { + assert.deepEqual( + transformArguments('key'), + ['JSON.STRLEN', 'key'] + ); + }); + + it('with path', () => { + assert.deepEqual( + transformArguments('key', '$'), + ['JSON.STRLEN', 'key', '$'] + ); + }); + }); + + testUtils.testWithClient('client.json.strLen', async client => { + await client.json.set('key', '$', ''); + + assert.deepEqual( + await client.json.strLen('key', '$'), + [0] + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/STRLEN.ts b/packages/json/lib/commands/STRLEN.ts new file mode 100644 index 00000000000..93f5d563baf --- /dev/null +++ b/packages/json/lib/commands/STRLEN.ts @@ -0,0 +1,15 @@ +export const FIRST_KEY_INDEX = 1; + +export const IS_READ_ONLY = true; + +export function transformArguments(key: string, path?: string): Array { + const args = ['JSON.STRLEN', key]; + + if (path) { + args.push(path); + } + + return args; +} + +export declare function transformReply(): number; diff --git a/packages/json/lib/commands/TYPE.spec.ts b/packages/json/lib/commands/TYPE.spec.ts new file mode 100644 index 00000000000..5cecfb827a7 --- /dev/null +++ b/packages/json/lib/commands/TYPE.spec.ts @@ -0,0 +1,28 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './TYPE'; + +describe('TYPE', () => { + describe('transformArguments', () => { + it('without path', () => { + assert.deepEqual( + transformArguments('key'), + ['JSON.TYPE', 'key'] + ); + }); + + it('with path', () => { + assert.deepEqual( + transformArguments('key', '$'), + ['JSON.TYPE', 'key', '$'] + ); + }); + }); + + // testUtils.testWithClient('client.json.type', async client => { + // assert.deepEqual( + // await client.json.type('key', '$'), + // [null] + // ); + // }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/json/lib/commands/TYPE.ts b/packages/json/lib/commands/TYPE.ts new file mode 100644 index 00000000000..7fd55f625dc --- /dev/null +++ b/packages/json/lib/commands/TYPE.ts @@ -0,0 +1,13 @@ +export const FIRST_KEY_INDEX = 1; + +export function transformArguments(key: string, path?: string): Array { + const args = ['JSON.TYPE', key]; + + if (path) { + args.push(path); + } + + return args; +} + +export declare function transformReply(): string | null | Array; diff --git a/packages/json/lib/commands/index.ts b/packages/json/lib/commands/index.ts new file mode 100644 index 00000000000..91b4f7dc4b5 --- /dev/null +++ b/packages/json/lib/commands/index.ts @@ -0,0 +1,94 @@ +import * as ARRAPPEND from './ARRAPPEND'; +import * as ARRINDEX from './ARRINDEX'; +import * as ARRINSERT from './ARRINSERT'; +import * as ARRLEN from './ARRLEN'; +import * as ARRPOP from './ARRPOP'; +import * as ARRTRIM from './ARRTRIM'; +import * as DEBUG_MEMORY from './DEBUG_MEMORY'; +import * as DEL from './DEL'; +import * as FORGET from './FORGET'; +import * as GET from './GET'; +import * as MGET from './MGET'; +import * as NUMINCRBY from './NUMINCRBY'; +import * as NUMMULTBY from './NUMMULTBY'; +import * as OBJKEYS from './OBJKEYS'; +import * as OBJLEN from './OBJLEN'; +import * as RESP from './RESP'; +import * as SET from './SET'; +import * as STRAPPEND from './STRAPPEND'; +import * as STRLEN from './STRLEN'; +import * as TYPE from './TYPE'; + +export default { + ARRAPPEND, + arrAppend: ARRAPPEND, + ARRINDEX, + arrIndex: ARRINDEX, + ARRINSERT, + arrInsert: ARRINSERT, + ARRLEN, + arrLen: ARRLEN, + ARRPOP, + arrPop: ARRPOP, + ARRTRIM, + arrTrim: ARRTRIM, + DEBUG_MEMORY, + debugMemory: DEBUG_MEMORY, + DEL, + del: DEL, + FORGET, + forget: FORGET, + GET, + get: GET, + MGET, + mGet: MGET, + NUMINCRBY, + numIncrBy: NUMINCRBY, + NUMMULTBY, + numMultBy: NUMMULTBY, + OBJKEYS, + objKeys: OBJKEYS, + OBJLEN, + objLen: OBJLEN, + RESP, + resp: RESP, + SET, + set: SET, + STRAPPEND, + strAppend: STRAPPEND, + STRLEN, + strLen: STRLEN, + TYPE, + type: TYPE +}; + +// using two "objects" and not `Record` cause of: +// https://github.com/microsoft/TypeScript/issues/14174 +export type RedisJSON = null | boolean | number | string | Date | Array | { [key: string]: RedisJSON } | { [key: number]: RedisJSON }; + +export function transformRedisJsonArgument(json: RedisJSON): string { + return JSON.stringify(json); +} + +export function transformRedisJsonReply(json: string): RedisJSON { + return JSON.parse(json); +} + +export function transformRedisJsonArrayReply(jsons: Array): Array { + return jsons.map(transformRedisJsonReply) +} + +export function transformRedisJsonNullReply(json: string | null): RedisJSON | null { + if (json === null) return null; + + return transformRedisJsonReply(json); +} + + +export function transformRedisJsonNullArrayReply(jsons: Array): Array { + return jsons.map(transformRedisJsonNullReply); +} + +export function transformNumbersReply(reply: string): number | Array { + return JSON.parse(reply); +} diff --git a/packages/json/lib/index.ts b/packages/json/lib/index.ts new file mode 100644 index 00000000000..bc0e103e8c8 --- /dev/null +++ b/packages/json/lib/index.ts @@ -0,0 +1 @@ +export { default } from './commands'; diff --git a/packages/json/lib/test-utils.ts b/packages/json/lib/test-utils.ts new file mode 100644 index 00000000000..140e781d91e --- /dev/null +++ b/packages/json/lib/test-utils.ts @@ -0,0 +1,21 @@ +import TestUtils from '@redis/test-utils'; +import RedisJSON from '.'; + +export default new TestUtils({ + dockerImageName: 'redislabs/rejson', + dockerImageVersionArgument: 'rejson-version', + defaultDockerVersion: '2.0.2' +}); + +export const GLOBAL = { + SERVERS: { + OPEN: { + serverArguments: ['--loadmodule /usr/lib/redis/modules/rejson.so'], + clientOptions: { + modules: { + json: RedisJSON + } + } + } + } +}; diff --git a/packages/json/package.json b/packages/json/package.json new file mode 100644 index 00000000000..ebd7f8f76fa --- /dev/null +++ b/packages/json/package.json @@ -0,0 +1,24 @@ +{ + "name": "@redis/json", + "version": "1.0.0-rc.0", + "license": "MIT", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "test": "nyc -r text-summary -r html mocha -r source-map-support/register -r ts-node/register './lib/**/*.spec.ts'", + "build": "tsc" + }, + "peerDependencies": { + "@redis/client": "^4.0.0-rc" + }, + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@redis/test-utils": "*", + "@types/node": "^16.11.6", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4" + } +} diff --git a/packages/json/tsconfig.json b/packages/json/tsconfig.json new file mode 100644 index 00000000000..fdb86c004cc --- /dev/null +++ b/packages/json/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig", + "compilerOptions": { + "outDir": "./dist" + }, + "include": [ + "./lib/**/*.ts" + ] +} diff --git a/packages/search/.nycrc.json b/packages/search/.nycrc.json new file mode 100644 index 00000000000..b4e671e178f --- /dev/null +++ b/packages/search/.nycrc.json @@ -0,0 +1,4 @@ +{ + "extends": "@istanbuljs/nyc-config-typescript", + "exclude": ["**/*.spec.ts", "lib/test-utils.ts"] +} diff --git a/packages/search/lib/commands/AGGREGATE.spec.ts b/packages/search/lib/commands/AGGREGATE.spec.ts new file mode 100644 index 00000000000..2a6647c97a4 --- /dev/null +++ b/packages/search/lib/commands/AGGREGATE.spec.ts @@ -0,0 +1,482 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { AggregateGroupByReducers, AggregateSteps, transformArguments } from './AGGREGATE'; +import { SchemaFieldTypes } from './CREATE'; + +describe('AGGREGATE', () => { + describe('transformArguments', () => { + it('without options', () => { + assert.deepEqual( + transformArguments('index', '*'), + ['FT.AGGREGATE', 'index', '*'] + ); + }); + + it('with VERBATIM', () => { + assert.deepEqual( + transformArguments('index', '*', { VERBATIM: true }), + ['FT.AGGREGATE', 'index', '*', 'VERBATIM'] + ); + }); + + describe('with LOAD', () => { + describe('single', () => { + describe('without alias', () => { + it('string', () => { + assert.deepEqual( + transformArguments('index', '*', { LOAD: '@property' }), + ['FT.AGGREGATE', 'index', '*', 'LOAD', '1', '@property'] + ); + }); + + it('{ identifier: string }', () => { + assert.deepEqual( + transformArguments('index', '*', { + LOAD: { + identifier: '@property' + } + }), + ['FT.AGGREGATE', 'index', '*', 'LOAD', '1', '@property'] + ); + }); + }); + + it('with alias', () => { + assert.deepEqual( + transformArguments('index', '*', { + LOAD: { + identifier: '@property', + AS: 'alias' + } + }), + ['FT.AGGREGATE', 'index', '*', 'LOAD', '3', '@property', 'AS', 'alias'] + ); + }); + }); + + it('multiple', () => { + assert.deepEqual( + transformArguments('index', '*', { LOAD: ['@1', '@2'] }), + ['FT.AGGREGATE', 'index', '*', 'LOAD', '2', '@1', '@2'] + ); + }); + }); + + describe('with STEPS', () => { + describe('GROUPBY', () => { + describe('COUNT', () => { + describe('without properties', () => { + it('without alias', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + REDUCE: { + type: AggregateGroupByReducers.COUNT + } + }] + }), + ['FT.AGGREGATE', 'index', '*', 'GROUPBY', '0', 'REDUCE', 'COUNT', '0'] + ); + }); + + it('with alias', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + REDUCE: { + type: AggregateGroupByReducers.COUNT, + AS: 'count' + } + }] + }), + ['FT.AGGREGATE', 'index', '*', 'GROUPBY', '0', 'REDUCE', 'COUNT', '0', 'AS', 'count'] + ); + }); + }); + + describe('with properties', () => { + it('single', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + properties: '@property', + REDUCE: { + type: AggregateGroupByReducers.COUNT + } + }] + }), + ['FT.AGGREGATE', 'index', '*', 'GROUPBY', '1', '@property', 'REDUCE', 'COUNT', '0'] + ); + }); + + it('multiple', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + properties: ['@1', '@2'], + REDUCE: { + type: AggregateGroupByReducers.COUNT + } + }] + }), + ['FT.AGGREGATE', 'index', '*', 'GROUPBY', '2', '@1', '@2', 'REDUCE', 'COUNT', '0'] + ); + }); + }); + }); + + it('COUNT_DISTINCT', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + REDUCE: { + type: AggregateGroupByReducers.COUNT_DISTINCT, + property: '@property' + } + }] + }), + ['FT.AGGREGATE', 'index', '*', 'GROUPBY', '0', 'REDUCE', 'COUNT_DISTINCT', '1', '@property'] + ); + }); + + it('COUNT_DISTINCTISH', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + REDUCE: { + type: AggregateGroupByReducers.COUNT_DISTINCTISH, + property: '@property' + } + }] + }), + ['FT.AGGREGATE', 'index', '*', 'GROUPBY', '0', 'REDUCE', 'COUNT_DISTINCTISH', '1', '@property'] + ); + }); + + it('SUM', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + REDUCE: { + type: AggregateGroupByReducers.SUM, + property: '@property' + } + }] + }), + ['FT.AGGREGATE', 'index', '*', 'GROUPBY', '0', 'REDUCE', 'SUM', '1', '@property'] + ); + }); + + it('MIN', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + REDUCE: { + type: AggregateGroupByReducers.MIN, + property: '@property' + } + }] + }), + ['FT.AGGREGATE', 'index', '*', 'GROUPBY', '0', 'REDUCE', 'MIN', '1', '@property'] + ); + }); + + it('MAX', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + REDUCE: { + type: AggregateGroupByReducers.MAX, + property: '@property' + } + }] + }), + ['FT.AGGREGATE', 'index', '*', 'GROUPBY', '0', 'REDUCE', 'MAX', '1', '@property'] + ); + }); + + it('AVG', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + REDUCE: { + type: AggregateGroupByReducers.AVG, + property: '@property' + } + }] + }), + ['FT.AGGREGATE', 'index', '*', 'GROUPBY', '0', 'REDUCE', 'AVG', '1', '@property'] + ); + }); + + it('STDDEV', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + REDUCE: { + type: AggregateGroupByReducers.STDDEV, + property: '@property' + } + }] + }), + ['FT.AGGREGATE', 'index', '*', 'GROUPBY', '0', 'REDUCE', 'STDDEV', '1', '@property'] + ); + }); + + it('QUANTILE', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + REDUCE: { + type: AggregateGroupByReducers.QUANTILE, + property: '@property', + quantile: 0.5 + } + }] + }), + ['FT.AGGREGATE', 'index', '*', 'GROUPBY', '0', 'REDUCE', 'QUANTILE', '2', '@property', '0.5'] + ); + }); + + it('TO_LIST', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + REDUCE: { + type: AggregateGroupByReducers.TO_LIST, + property: '@property' + } + }] + }), + ['FT.AGGREGATE', 'index', '*', 'GROUPBY', '0', 'REDUCE', 'TOLIST', '1', '@property'] + ); + }); + + describe('FIRST_VALUE', () => { + it('simple', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + REDUCE: { + type: AggregateGroupByReducers.FIRST_VALUE, + property: '@property' + } + }] + }), + ['FT.AGGREGATE', 'index', '*', 'GROUPBY', '0', 'REDUCE', 'FIRST_VALUE', '1', '@property'] + ); + }); + + describe('with BY', () => { + describe('without direction', () => { + it('string', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + REDUCE: { + type: AggregateGroupByReducers.FIRST_VALUE, + property: '@property', + BY: '@by' + } + }] + }), + ['FT.AGGREGATE', 'index', '*', 'GROUPBY', '0', 'REDUCE', 'FIRST_VALUE', '3', '@property', 'BY', '@by'] + ); + }); + + + it('{ property: string }', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + REDUCE: { + type: AggregateGroupByReducers.FIRST_VALUE, + property: '@property', + BY: { + property: '@by' + } + } + }] + }), + ['FT.AGGREGATE', 'index', '*', 'GROUPBY', '0', 'REDUCE', 'FIRST_VALUE', '3', '@property', 'BY', '@by'] + ); + }); + }); + + it('with direction', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + REDUCE: { + type: AggregateGroupByReducers.FIRST_VALUE, + property: '@property', + BY: { + property: '@by', + direction: 'ASC' + } + } + }] + }), + ['FT.AGGREGATE', 'index', '*', 'GROUPBY', '0', 'REDUCE', 'FIRST_VALUE', '4', '@property', 'BY', '@by', 'ASC'] + ); + }); + }); + }); + + it('RANDOM_SAMPLE', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + REDUCE: { + type: AggregateGroupByReducers.RANDOM_SAMPLE, + property: '@property', + sampleSize: 1 + } + }] + }), + ['FT.AGGREGATE', 'index', '*', 'GROUPBY', '0', 'REDUCE', 'RANDOM_SAMPLE', '2', '@property', '1'] + ); + }); + }); + + describe('SORTBY', () => { + it('string', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.SORTBY, + BY: '@by' + }] + }), + ['FT.AGGREGATE', 'index', '*', 'SORTBY', '1', '@by'] + ); + }); + + it('Array', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.SORTBY, + BY: ['@1', '@2'] + }] + }), + ['FT.AGGREGATE', 'index', '*', 'SORTBY', '2', '@1', '@2'] + ); + }); + + it('with MAX', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.SORTBY, + BY: '@by', + MAX: 1 + }] + }), + ['FT.AGGREGATE', 'index', '*', 'SORTBY', '1', '@by', 'MAX', '1'] + ); + }); + }); + + describe('APPLY', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.APPLY, + expression: '@field + 1', + AS: 'as' + }] + }), + ['FT.AGGREGATE', 'index', '*', 'APPLY', '@field + 1', 'AS', 'as'] + ); + }); + + describe('LIMIT', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.LIMIT, + from: 0, + size: 1 + }] + }), + ['FT.AGGREGATE', 'index', '*', 'LIMIT', '0', '1'] + ); + }); + + describe('FILTER', () => { + assert.deepEqual( + transformArguments('index', '*', { + STEPS: [{ + type: AggregateSteps.FILTER, + expression: '@field != ""' + }] + }), + ['FT.AGGREGATE', 'index', '*', 'FILTER', '@field != ""'] + ); + }); + }); + }); + + testUtils.testWithClient('client.ft.aggregate', async client => { + await Promise.all([ + client.ft.create('index', { + field: SchemaFieldTypes.NUMERIC + }), + client.hSet('1', 'field', '1'), + client.hSet('2', 'field', '2') + ]); + + assert.deepEqual( + await client.ft.aggregate('index', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + REDUCE: [{ + type: AggregateGroupByReducers.SUM, + property: '@field', + AS: 'sum' + }, { + type: AggregateGroupByReducers.AVG, + property: '@field', + AS: 'avg' + }] + }] + }), + { + total: 1, + results: [ + Object.create(null, { + sum: { + value: '3', + configurable: true, + enumerable: true + }, + avg: { + value: '1.5', + configurable: true, + enumerable: true + } + }) + ] + } + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/search/lib/commands/AGGREGATE.ts b/packages/search/lib/commands/AGGREGATE.ts new file mode 100644 index 00000000000..affc98b51d7 --- /dev/null +++ b/packages/search/lib/commands/AGGREGATE.ts @@ -0,0 +1,283 @@ +import { RedisCommandArguments } from '@redis/client/dist/lib/commands'; +import { pushVerdictArgument, transformReplyTuples, TuplesObject } from '@redis/client/dist/lib/commands/generic-transformers'; +import { PropertyName, pushArgumentsWithLength, pushSortByArguments, SortByOptions } from '.'; + +export enum AggregateSteps { + GROUPBY = 'GROUPBY', + SORTBY = 'SORTBY', + APPLY = 'APPLY', + LIMIT = 'LIMIT', + FILTER = 'FILTER' +} + +interface AggregateStep { + type: T; +} + +export enum AggregateGroupByReducers { + COUNT = 'COUNT', + COUNT_DISTINCT = 'COUNT_DISTINCT', + COUNT_DISTINCTISH = 'COUNT_DISTINCTISH', + SUM = 'SUM', + MIN = 'MIN', + MAX = 'MAX', + AVG = 'AVG', + STDDEV = 'STDDEV', + QUANTILE = 'QUANTILE', + TOLIST = 'TOLIST', + TO_LIST = 'TOLIST', + FIRST_VALUE = 'FIRST_VALUE', + RANDOM_SAMPLE = 'RANDOM_SAMPLE' +} + +interface GroupByReducer { + type: T; + AS?: string; +} + +type CountReducer = GroupByReducer; + +interface CountDistinctReducer extends GroupByReducer { + property: PropertyName; +} + +interface CountDistinctishReducer extends GroupByReducer { + property: PropertyName; +} + +interface SumReducer extends GroupByReducer { + property: PropertyName; +} + +interface MinReducer extends GroupByReducer { + property: PropertyName; +} + +interface MaxReducer extends GroupByReducer { + property: PropertyName; +} + +interface AvgReducer extends GroupByReducer { + property: PropertyName; +} + +interface StdDevReducer extends GroupByReducer { + property: PropertyName; +} + +interface QuantileReducer extends GroupByReducer { + property: PropertyName; + quantile: number; +} + +interface ToListReducer extends GroupByReducer { + property: PropertyName; +} + +interface FirstValueReducer extends GroupByReducer { + property: PropertyName; + BY?: PropertyName | { + property: PropertyName; + direction?: 'ASC' | 'DESC'; + }; +} + +interface RandomSampleReducer extends GroupByReducer { + property: PropertyName; + sampleSize: number; +} + +type GroupByReducers = CountReducer | CountDistinctReducer | CountDistinctishReducer | SumReducer | MinReducer | MaxReducer | AvgReducer | StdDevReducer | QuantileReducer | ToListReducer | FirstValueReducer | RandomSampleReducer; + +interface GroupByStep extends AggregateStep { + properties?: PropertyName | Array; + REDUCE: GroupByReducers | Array; +} + +interface SortStep extends AggregateStep { + BY: SortByOptions | Array; + MAX?: number; +} + +interface ApplyStep extends AggregateStep { + expression: string; + AS: string; +} + +interface LimitStep extends AggregateStep { + from: number; + size: number; +} + +interface FilterStep extends AggregateStep { + expression: string; +} + +type LoadField = PropertyName | { + identifier: PropertyName; + AS?: string; +} + +interface AggregateOptions { + VERBATIM?: true; + LOAD?: LoadField | Array; + STEPS?: Array; +} + +export function transformArguments(index: string, query: string, options?: AggregateOptions): RedisCommandArguments { + const args = ['FT.AGGREGATE', index, query]; + + if (options?.VERBATIM) { + args.push('VERBATIM'); + } + + if (options?.LOAD) { + args.push('LOAD'); + pushArgumentsWithLength(args, () => { + if (Array.isArray(options.LOAD)) { + for (const load of options.LOAD) { + pushLoadField(args, load); + } + } else { + pushLoadField(args, options.LOAD!); + } + }); + } + + if (options?.STEPS) { + for (const step of options.STEPS) { + switch (step.type) { + case AggregateSteps.GROUPBY: + args.push('GROUPBY'); + if (!step.properties) { + args.push('0'); + } else { + pushVerdictArgument(args, step.properties); + } + + if (Array.isArray(step.REDUCE)) { + for (const reducer of step.REDUCE) { + pushGroupByReducer(args, reducer); + } + } else { + pushGroupByReducer(args, step.REDUCE); + } + + break; + + case AggregateSteps.SORTBY: + pushSortByArguments(args, 'SORTBY', step.BY); + + if (step.MAX) { + args.push('MAX', step.MAX.toString()); + } + + break; + + case AggregateSteps.APPLY: + args.push('APPLY', step.expression, 'AS', step.AS); + break; + + case AggregateSteps.LIMIT: + args.push('LIMIT', step.from.toString(), step.size.toString()); + break; + + case AggregateSteps.FILTER: + args.push('FILTER', step.expression); + break; + } + } + } + + return args; +} + +function pushLoadField(args: RedisCommandArguments, toLoad: LoadField): void { + if (typeof toLoad === 'string') { + args.push(toLoad); + } else { + args.push(toLoad.identifier); + + if (toLoad.AS) { + args.push('AS', toLoad.AS); + } + } +} + +function pushGroupByReducer(args: RedisCommandArguments, reducer: GroupByReducers): void { + args.push('REDUCE', reducer.type); + + switch (reducer.type) { + case AggregateGroupByReducers.COUNT: + args.push('0'); + break; + + case AggregateGroupByReducers.COUNT_DISTINCT: + case AggregateGroupByReducers.COUNT_DISTINCTISH: + case AggregateGroupByReducers.SUM: + case AggregateGroupByReducers.MIN: + case AggregateGroupByReducers.MAX: + case AggregateGroupByReducers.AVG: + case AggregateGroupByReducers.STDDEV: + case AggregateGroupByReducers.TOLIST: + args.push('1', reducer.property); + break; + + case AggregateGroupByReducers.QUANTILE: + args.push('2', reducer.property, reducer.quantile.toString()); + break; + + case AggregateGroupByReducers.FIRST_VALUE: { + pushArgumentsWithLength(args, () => { + args.push(reducer.property); + + if (reducer.BY) { + args.push('BY'); + if (typeof reducer.BY === 'string') { + args.push(reducer.BY); + } else { + args.push(reducer.BY.property); + + if (reducer.BY.direction) { + args.push(reducer.BY.direction); + } + } + } + }); + + break; + } + + case AggregateGroupByReducers.RANDOM_SAMPLE: + args.push('2', reducer.property, reducer.sampleSize.toString()); + break; + } + + if (reducer.AS) { + args.push('AS', reducer.AS); + } +} + +type AggregateRawReply = [ + total: number, + ...results: Array> +]; + +interface AggregateReply { + total: number; + results: Array; +} + +export function transformReply(rawReply: AggregateRawReply): AggregateReply { + const results: Array = []; + for (let i = 1; i < rawReply.length; i++) { + results.push( + transformReplyTuples(rawReply[i] as Array) + ); + } + + return { + total: rawReply[0], + results + }; +} \ No newline at end of file diff --git a/packages/search/lib/commands/ALIASADD.spec.ts b/packages/search/lib/commands/ALIASADD.spec.ts new file mode 100644 index 00000000000..7bb2452838b --- /dev/null +++ b/packages/search/lib/commands/ALIASADD.spec.ts @@ -0,0 +1,11 @@ +import { strict as assert } from 'assert'; +import { transformArguments } from './ALIASADD'; + +describe('ALIASADD', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('alias', 'index'), + ['FT.ALIASADD', 'alias', 'index'] + ); + }); +}); diff --git a/packages/search/lib/commands/ALIASADD.ts b/packages/search/lib/commands/ALIASADD.ts new file mode 100644 index 00000000000..552c1add695 --- /dev/null +++ b/packages/search/lib/commands/ALIASADD.ts @@ -0,0 +1,5 @@ +export function transformArguments(name: string, index: string): Array { + return ['FT.ALIASADD', name, index]; +} + +export declare function transformReply(): 'OK'; diff --git a/packages/search/lib/commands/ALIASDEL.spec.ts b/packages/search/lib/commands/ALIASDEL.spec.ts new file mode 100644 index 00000000000..5255ba835db --- /dev/null +++ b/packages/search/lib/commands/ALIASDEL.spec.ts @@ -0,0 +1,11 @@ +import { strict as assert } from 'assert'; +import { transformArguments } from './ALIASDEL'; + +describe('ALIASDEL', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('alias', 'index'), + ['FT.ALIASDEL', 'alias', 'index'] + ); + }); +}); diff --git a/packages/search/lib/commands/ALIASDEL.ts b/packages/search/lib/commands/ALIASDEL.ts new file mode 100644 index 00000000000..434b4df3dea --- /dev/null +++ b/packages/search/lib/commands/ALIASDEL.ts @@ -0,0 +1,5 @@ +export function transformArguments(name: string, index: string): Array { + return ['FT.ALIASDEL', name, index]; +} + +export declare function transformReply(): 'OK'; diff --git a/packages/search/lib/commands/ALIASUPDATE.spec.ts b/packages/search/lib/commands/ALIASUPDATE.spec.ts new file mode 100644 index 00000000000..79421b1a20d --- /dev/null +++ b/packages/search/lib/commands/ALIASUPDATE.spec.ts @@ -0,0 +1,11 @@ +import { strict as assert } from 'assert'; +import { transformArguments } from './ALIASUPDATE'; + +describe('ALIASUPDATE', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('alias', 'index'), + ['FT.ALIASUPDATE', 'alias', 'index'] + ); + }); +}); diff --git a/packages/search/lib/commands/ALIASUPDATE.ts b/packages/search/lib/commands/ALIASUPDATE.ts new file mode 100644 index 00000000000..ac64ef57c3f --- /dev/null +++ b/packages/search/lib/commands/ALIASUPDATE.ts @@ -0,0 +1,5 @@ +export function transformArguments(name: string, index: string): Array { + return ['FT.ALIASUPDATE', name, index]; +} + +export declare function transformReply(): 'OK'; diff --git a/packages/search/lib/commands/CONFIG_GET.spec.ts b/packages/search/lib/commands/CONFIG_GET.spec.ts new file mode 100644 index 00000000000..8614f443426 --- /dev/null +++ b/packages/search/lib/commands/CONFIG_GET.spec.ts @@ -0,0 +1,25 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './CONFIG_GET'; + +describe('CONFIG GET', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('TIMEOUT'), + ['FT.CONFIG', 'GET', 'TIMEOUT'] + ); + }); + + testUtils.testWithClient('client.ft.configGet', async client => { + assert.deepEqual( + await client.ft.configGet('TIMEOUT'), + Object.create(null, { + TIMEOUT: { + value: '500', + configurable: true, + enumerable: true + } + }) + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/search/lib/commands/CONFIG_GET.ts b/packages/search/lib/commands/CONFIG_GET.ts new file mode 100644 index 00000000000..fbf1f1164b9 --- /dev/null +++ b/packages/search/lib/commands/CONFIG_GET.ts @@ -0,0 +1,16 @@ +export function transformArguments(option: string) { + return ['FT.CONFIG', 'GET', option]; +} + +interface ConfigGetReply { + [option: string]: string | null; +} + +export function transformReply(rawReply: Array<[string, string | null]>): ConfigGetReply { + const transformedReply: ConfigGetReply = Object.create(null); + for (const [key, value] of rawReply) { + transformedReply[key] = value; + } + + return transformedReply; +} diff --git a/packages/search/lib/commands/CONFIG_SET.spec.ts b/packages/search/lib/commands/CONFIG_SET.spec.ts new file mode 100644 index 00000000000..59cb63a3d8e --- /dev/null +++ b/packages/search/lib/commands/CONFIG_SET.spec.ts @@ -0,0 +1,12 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './CONFIG_SET'; + +describe('CONFIG SET', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('TIMEOUT', '500'), + ['FT.CONFIG', 'SET', 'TIMEOUT', '500'] + ); + }); +}); diff --git a/packages/search/lib/commands/CONFIG_SET.ts b/packages/search/lib/commands/CONFIG_SET.ts new file mode 100644 index 00000000000..93b76d79edf --- /dev/null +++ b/packages/search/lib/commands/CONFIG_SET.ts @@ -0,0 +1,5 @@ +export function transformArguments(option: string, value: string): Array { + return ['FT.CONFIG', 'SET', option, value]; +} + +export declare function transformReply(): 'OK'; diff --git a/packages/search/lib/commands/CREATE.spec.ts b/packages/search/lib/commands/CREATE.spec.ts new file mode 100644 index 00000000000..2ac68cc9710 --- /dev/null +++ b/packages/search/lib/commands/CREATE.spec.ts @@ -0,0 +1,347 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { RedisSearchLanguages, SchemaFieldTypes, SchemaTextFieldPhonetics, transformArguments } from './CREATE'; + +describe('CREATE', () => { + describe('transformArguments', () => { + it('simple', () => { + assert.deepEqual( + transformArguments('index', {}), + ['FT.CREATE', 'index', 'SCHEMA'] + ); + }); + + describe('with fields', () => { + describe('TEXT', () => { + it('without options', () => { + assert.deepEqual( + transformArguments('index', { + field: SchemaFieldTypes.TEXT + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT'] + ); + }); + + it('with NOSTEM', () => { + assert.deepEqual( + transformArguments('index', { + field: { + type: SchemaFieldTypes.TEXT, + NOSTEM: true + } + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'NOSTEM'] + ); + }); + + it('with WEIGHT', () => { + assert.deepEqual( + transformArguments('index', { + field: { + type: SchemaFieldTypes.TEXT, + WEIGHT: 1 + } + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'WEIGHT', '1'] + ); + }); + + it('with PHONETIC', () => { + assert.deepEqual( + transformArguments('index', { + field: { + type: SchemaFieldTypes.TEXT, + PHONETIC: SchemaTextFieldPhonetics.DM_EN + } + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'PHONETIC', SchemaTextFieldPhonetics.DM_EN] + ); + }); + }); + + it('NUMERIC', () => { + assert.deepEqual( + transformArguments('index', { + field: SchemaFieldTypes.NUMERIC + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'NUMERIC'] + ); + }); + + it('GEO', () => { + assert.deepEqual( + transformArguments('index', { + field: SchemaFieldTypes.GEO + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'GEO'] + ); + }); + + describe('TAG', () => { + describe('without options', () => { + it('SchemaFieldTypes.TAG', () => { + assert.deepEqual( + transformArguments('index', { + field: SchemaFieldTypes.TAG + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TAG'] + ); + }); + + it('{ type: SchemaFieldTypes.TAG }', () => { + assert.deepEqual( + transformArguments('index', { + field: { + type: SchemaFieldTypes.TAG + } + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TAG'] + ); + }); + }); + + it('with SEPERATOR', () => { + assert.deepEqual( + transformArguments('index', { + field: { + type: SchemaFieldTypes.TAG, + SEPERATOR: 'seperator' + } + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TAG', 'SEPERATOR', 'seperator'] + ); + }); + }); + + describe('with generic options', () => { + it('with AS', () => { + assert.deepEqual( + transformArguments('index', { + field: { + type: SchemaFieldTypes.TEXT, + AS: 'as' + } + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'AS', 'as', 'TEXT'] + ); + }); + + it('with CASESENSITIVE', () => { + assert.deepEqual( + transformArguments('index', { + field: { + type: SchemaFieldTypes.TEXT, + CASESENSITIVE: true + } + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'CASESENSITIVE'] + ); + }); + + describe('with SORTABLE', () => { + it('true', () => { + assert.deepEqual( + transformArguments('index', { + field: { + type: SchemaFieldTypes.TEXT, + SORTABLE: true + } + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'SORTABLE'] + ); + }); + + it('UNF', () => { + assert.deepEqual( + transformArguments('index', { + field: { + type: SchemaFieldTypes.TEXT, + SORTABLE: 'UNF' + } + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'SORTABLE', 'UNF'] + ); + }); + }); + + it('with NOINDEX', () => { + assert.deepEqual( + transformArguments('index', { + field: { + type: SchemaFieldTypes.TEXT, + NOINDEX: true + } + }), + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'NOINDEX'] + ); + }); + }); + }); + + it('with ON', () => { + assert.deepEqual( + transformArguments('index', {}, { + ON: 'HASH' + }), + ['FT.CREATE', 'index', 'ON', 'HASH', 'SCHEMA'] + ); + }); + + describe('with PREFIX', () => { + it('string', () => { + assert.deepEqual( + transformArguments('index', {}, { + PREFIX: 'prefix' + }), + ['FT.CREATE', 'index', 'PREFIX', '1', 'prefix', 'SCHEMA'] + ); + }); + + it('Array', () => { + assert.deepEqual( + transformArguments('index', {}, { + PREFIX: ['1', '2'] + }), + ['FT.CREATE', 'index', 'PREFIX', '2', '1', '2', 'SCHEMA'] + ); + }); + }); + + it('with FILTER', () => { + assert.deepEqual( + transformArguments('index', {}, { + FILTER: '@field != ""' + }), + ['FT.CREATE', 'index', 'FILTER', '@field != ""', 'SCHEMA'] + ); + }); + + it('with LANGUAGE', () => { + assert.deepEqual( + transformArguments('index', {}, { + LANGUAGE: RedisSearchLanguages.ARABIC + }), + ['FT.CREATE', 'index', 'LANGUAGE', RedisSearchLanguages.ARABIC, 'SCHEMA'] + ); + }); + + it('with LANGUAGE_FIELD', () => { + assert.deepEqual( + transformArguments('index', {}, { + LANGUAGE_FIELD: '@field' + }), + ['FT.CREATE', 'index', 'LANGUAGE_FIELD', '@field', 'SCHEMA'] + ); + }); + + it('with SCORE', () => { + assert.deepEqual( + transformArguments('index', {}, { + SCORE: 1 + }), + ['FT.CREATE', 'index', 'SCORE', '1', 'SCHEMA'] + ); + }); + + it('with SCORE_FIELD', () => { + assert.deepEqual( + transformArguments('index', {}, { + SCORE_FIELD: '@field' + }), + ['FT.CREATE', 'index', 'SCORE_FIELD', '@field', 'SCHEMA'] + ); + }); + + it('with MAXTEXTFIELDS', () => { + assert.deepEqual( + transformArguments('index', {}, { + MAXTEXTFIELDS: true + }), + ['FT.CREATE', 'index', 'MAXTEXTFIELDS', 'SCHEMA'] + ); + }); + + it('with TEMPORARY', () => { + assert.deepEqual( + transformArguments('index', {}, { + TEMPORARY: 1 + }), + ['FT.CREATE', 'index', 'TEMPORARY', '1', 'SCHEMA'] + ); + }); + + it('with NOOFFSETS', () => { + assert.deepEqual( + transformArguments('index', {}, { + NOOFFSETS: true + }), + ['FT.CREATE', 'index', 'NOOFFSETS', 'SCHEMA'] + ); + }); + + it('with NOHL', () => { + assert.deepEqual( + transformArguments('index', {}, { + NOHL: true + }), + ['FT.CREATE', 'index', 'NOHL', 'SCHEMA'] + ); + }); + + it('with NOFIELDS', () => { + assert.deepEqual( + transformArguments('index', {}, { + NOFIELDS: true + }), + ['FT.CREATE', 'index', 'NOFIELDS', 'SCHEMA'] + ); + }); + + it('with NOFREQS', () => { + assert.deepEqual( + transformArguments('index', {}, { + NOFREQS: true + }), + ['FT.CREATE', 'index', 'NOFREQS', 'SCHEMA'] + ); + }); + + it('with SKIPINITIALSCAN', () => { + assert.deepEqual( + transformArguments('index', {}, { + SKIPINITIALSCAN: true + }), + ['FT.CREATE', 'index', 'SKIPINITIALSCAN', 'SCHEMA'] + ); + }); + + describe('with STOPWORDS', () => { + it('string', () => { + assert.deepEqual( + transformArguments('index', {}, { + STOPWORDS: 'stopword' + }), + ['FT.CREATE', 'index', 'STOPWORDS', '1', 'stopword', 'SCHEMA'] + ); + }); + + it('Array', () => { + assert.deepEqual( + transformArguments('index', {}, { + STOPWORDS: ['1', '2'] + }), + ['FT.CREATE', 'index', 'STOPWORDS', '2', '1', '2', 'SCHEMA'] + ); + }); + }); + }); + + testUtils.testWithClient('client.ft.create', async client => { + assert.equal( + await client.ft.create('index', { + field: SchemaFieldTypes.TEXT // TODO: shouldn't be mandatory + }), + 'OK' + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/search/lib/commands/CREATE.ts b/packages/search/lib/commands/CREATE.ts new file mode 100644 index 00000000000..94c063ec503 --- /dev/null +++ b/packages/search/lib/commands/CREATE.ts @@ -0,0 +1,222 @@ +import { pushOptionalVerdictArgument } from '@redis/client/dist/lib/commands/generic-transformers'; +import { PropertyName } from '.'; + +export enum SchemaFieldTypes { + TEXT = 'TEXT', + NUMERIC = 'NUMERIC', + GEO = 'GEO', + TAG = 'TAG', +} + +type CreateSchemaField> = T | ({ + type: T; + AS?: string; + CASESENSITIVE?: true; + SORTABLE?: true | 'UNF'; + NOINDEX?: true; +} & E); + +export enum SchemaTextFieldPhonetics { + DM_EN = 'dm:en', + DM_FR = 'dm:fr', + FM_PT = 'dm:pt', + DM_ES = 'dm:es' +} + +type CreateSchemaTextField = CreateSchemaField; + +type CreateSchemaNumericField = CreateSchemaField; + +type CreateSchemaGeoField = CreateSchemaField; + +type CreateSchemaTagField = CreateSchemaField; + +interface CreateSchema { + [field: string]: + CreateSchemaTextField | + CreateSchemaNumericField | + CreateSchemaGeoField | + CreateSchemaTagField +} + +export enum RedisSearchLanguages { + ARABIC = 'Arabic', + BASQUE = 'Basque', + CATALANA = 'Catalan', + DANISH = 'Danish', + DUTCH = 'Dutch', + ENGLISH = 'English', + FINNISH = 'Finnish', + FRENCH = 'French', + GERMAN = 'German', + GREEK = 'Greek', + HUNGARIAN = 'Hungarian', + INDONESAIN = 'Indonesian', + IRISH = 'Irish', + ITALIAN = 'Italian', + LITHUANIAN = 'Lithuanian', + NEPALI = 'Nepali', + NORWEIGAN = 'Norwegian', + PORTUGUESE = 'Portuguese', + ROMANIAN = 'Romanian', + RUSSIAN = 'Russian', + SPANISH = 'Spanish', + SWEDISH = 'Swedish', + TAMIL = 'Tamil', + TURKISH = 'Turkish', + CHINESE = 'Chinese' +} + +interface CreateOptions { + ON?: 'HASH' | 'JSON'; + PREFIX?: string | Array; + FILTER?: string; + LANGUAGE?: RedisSearchLanguages; + LANGUAGE_FIELD?: PropertyName; + SCORE?: number; + SCORE_FIELD?: PropertyName; + // PAYLOAD_FIELD?: string; + MAXTEXTFIELDS?: true; + TEMPORARY?: number; + NOOFFSETS?: true; + NOHL?: true; + NOFIELDS?: true; + NOFREQS?: true; + SKIPINITIALSCAN?: true; + STOPWORDS?: string | Array; +} + +export function transformArguments(index: string, schema: CreateSchema, options?: CreateOptions): Array { + const args = ['FT.CREATE', index]; + + if (options?.ON) { + args.push('ON', options.ON); + } + + pushOptionalVerdictArgument(args, 'PREFIX', options?.PREFIX); + + if (options?.FILTER) { + args.push('FILTER', options.FILTER); + } + + if (options?.LANGUAGE) { + args.push('LANGUAGE', options.LANGUAGE); + } + + if (options?.LANGUAGE_FIELD) { + args.push('LANGUAGE_FIELD', options.LANGUAGE_FIELD); + } + + if (options?.SCORE) { + args.push('SCORE', options.SCORE.toString()); + } + + if (options?.SCORE_FIELD) { + args.push('SCORE_FIELD', options.SCORE_FIELD); + } + + // if (options?.PAYLOAD_FIELD) { + // args.push('PAYLOAD_FIELD', options.PAYLOAD_FIELD); + // } + + if (options?.MAXTEXTFIELDS) { + args.push('MAXTEXTFIELDS'); + } + + if (options?.TEMPORARY) { + args.push('TEMPORARY', options.TEMPORARY.toString()); + } + + if (options?.NOOFFSETS) { + args.push('NOOFFSETS'); + } + + if (options?.NOHL) { + args.push('NOHL'); + } + + if (options?.NOFIELDS) { + args.push('NOFIELDS'); + } + + if (options?.NOFREQS) { + args.push('NOFREQS'); + } + + if (options?.SKIPINITIALSCAN) { + args.push('SKIPINITIALSCAN'); + } + + pushOptionalVerdictArgument(args, 'STOPWORDS', options?.STOPWORDS); + + args.push('SCHEMA'); + + for (const [field, fieldOptions] of Object.entries(schema)) { + args.push(field); + + if (typeof fieldOptions === 'string') { + args.push(fieldOptions); + continue; + } + + if (fieldOptions.AS) { + args.push('AS', fieldOptions.AS); + } + + args.push(fieldOptions.type); + + switch (fieldOptions.type) { + case 'TEXT': + if (fieldOptions.NOSTEM) { + args.push('NOSTEM'); + } + + if (fieldOptions.WEIGHT) { + args.push('WEIGHT', fieldOptions.WEIGHT.toString()); + } + + if (fieldOptions.PHONETIC) { + args.push('PHONETIC', fieldOptions.PHONETIC); + } + + break; + + // case 'NUMERIC': + // case 'GEO': + // break; + + case 'TAG': + if (fieldOptions.SEPERATOR) { + args.push('SEPERATOR', fieldOptions.SEPERATOR); + } + + break; + } + + if (fieldOptions.CASESENSITIVE) { + args.push('CASESENSITIVE'); + } + + if (fieldOptions.SORTABLE) { + args.push('SORTABLE'); + + if (fieldOptions.SORTABLE === 'UNF') { + args.push('UNF'); + } + } + + if (fieldOptions.NOINDEX) { + args.push('NOINDEX'); + } + } + + return args; +} + +export declare function transformReply(): 'OK'; diff --git a/packages/search/lib/commands/DICTADD.spec.ts b/packages/search/lib/commands/DICTADD.spec.ts new file mode 100644 index 00000000000..b5f29dd4083 --- /dev/null +++ b/packages/search/lib/commands/DICTADD.spec.ts @@ -0,0 +1,28 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './DICTADD'; + +describe('DICTADD', () => { + describe('transformArguments', () => { + it('string', () => { + assert.deepEqual( + transformArguments('dictionary', 'term'), + ['FT.DICTADD', 'dictionary', 'term'] + ); + }); + + it('Array', () => { + assert.deepEqual( + transformArguments('dictionary', ['1', '2']), + ['FT.DICTADD', 'dictionary', '1', '2'] + ); + }); + }); + + testUtils.testWithClient('client.ft.dictAdd', async client => { + assert.equal( + await client.ft.dictAdd('dictionary', 'term'), + 1 + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/search/lib/commands/DICTADD.ts b/packages/search/lib/commands/DICTADD.ts new file mode 100644 index 00000000000..60af11fd41f --- /dev/null +++ b/packages/search/lib/commands/DICTADD.ts @@ -0,0 +1,8 @@ +import { RedisCommandArguments } from '@redis/client/dist/lib/commands'; +import { pushVerdictArguments } from '@redis/client/dist/lib/commands/generic-transformers'; + +export function transformArguments(dictionary: string, term: string | Array): RedisCommandArguments { + return pushVerdictArguments(['FT.DICTADD', dictionary], term); +} + +export declare function transformReply(): number; diff --git a/packages/search/lib/commands/DICTDEL.spec.ts b/packages/search/lib/commands/DICTDEL.spec.ts new file mode 100644 index 00000000000..5ffa6b6b84f --- /dev/null +++ b/packages/search/lib/commands/DICTDEL.spec.ts @@ -0,0 +1,28 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './DICTDEL'; + +describe('DICTDEL', () => { + describe('transformArguments', () => { + it('string', () => { + assert.deepEqual( + transformArguments('dictionary', 'term'), + ['FT.DICTDEL', 'dictionary', 'term'] + ); + }); + + it('Array', () => { + assert.deepEqual( + transformArguments('dictionary', ['1', '2']), + ['FT.DICTDEL', 'dictionary', '1', '2'] + ); + }); + }); + + testUtils.testWithClient('client.ft.dictDel', async client => { + assert.equal( + await client.ft.dictDel('dictionary', 'term'), + 0 + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/search/lib/commands/DICTDEL.ts b/packages/search/lib/commands/DICTDEL.ts new file mode 100644 index 00000000000..a1b728f1926 --- /dev/null +++ b/packages/search/lib/commands/DICTDEL.ts @@ -0,0 +1,8 @@ +import { RedisCommandArguments } from '@redis/client/dist/lib/commands'; +import { pushVerdictArguments } from '@redis/client/dist/lib/commands/generic-transformers'; + +export function transformArguments(dictionary: string, term: string | Array): RedisCommandArguments { + return pushVerdictArguments(['FT.DICTDEL', dictionary], term); +} + +export declare function transformReply(): number; diff --git a/packages/search/lib/commands/DICTDUMP.spec.ts b/packages/search/lib/commands/DICTDUMP.spec.ts new file mode 100644 index 00000000000..9896fb9440d --- /dev/null +++ b/packages/search/lib/commands/DICTDUMP.spec.ts @@ -0,0 +1,21 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './DICTDUMP'; + +describe('DICTDUMP', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('dictionary'), + ['FT.DICTDUMP', 'dictionary'] + ); + }); + + testUtils.testWithClient('client.ft.dictDump', async client => { + await client.ft.dictAdd('dictionary', 'string') + + assert.deepEqual( + await client.ft.dictDump('dictionary'), + ['string'] + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/search/lib/commands/DICTDUMP.ts b/packages/search/lib/commands/DICTDUMP.ts new file mode 100644 index 00000000000..1427bb42cb7 --- /dev/null +++ b/packages/search/lib/commands/DICTDUMP.ts @@ -0,0 +1,5 @@ +export function transformArguments(dictionary: string): Array { + return ['FT.DICTDUMP', dictionary]; +} + +export declare function transformReply(): Array; diff --git a/packages/search/lib/commands/DROPINDEX.spec.ts b/packages/search/lib/commands/DROPINDEX.spec.ts new file mode 100644 index 00000000000..751e274ba60 --- /dev/null +++ b/packages/search/lib/commands/DROPINDEX.spec.ts @@ -0,0 +1,33 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { SchemaFieldTypes } from './CREATE'; +import { transformArguments } from './DROPINDEX'; + +describe('DROPINDEX', () => { + describe('transformArguments', () => { + it('without options', () => { + assert.deepEqual( + transformArguments('index'), + ['FT.DROPINDEX', 'index'] + ); + }); + + it('with DD', () => { + assert.deepEqual( + transformArguments('index', { DD: true }), + ['FT.DROPINDEX', 'index', 'DD'] + ); + }); + }); + + testUtils.testWithClient('client.ft.dropIndex', async client => { + await client.ft.create('index', { + field: SchemaFieldTypes.TEXT // TODO: shouldn't be mandatory + }); + + assert.equal( + await client.ft.dropIndex('index'), + 'OK' + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/search/lib/commands/DROPINDEX.ts b/packages/search/lib/commands/DROPINDEX.ts new file mode 100644 index 00000000000..7897a9dd82e --- /dev/null +++ b/packages/search/lib/commands/DROPINDEX.ts @@ -0,0 +1,15 @@ +interface DropIndexOptions { + DD?: true; +} + +export function transformArguments(index: string, options?: DropIndexOptions): Array { + const args = ['FT.DROPINDEX', index]; + + if (options?.DD) { + args.push('DD'); + } + + return args; +} + +export declare function transformReply(): 'OK'; diff --git a/packages/search/lib/commands/EXPLAIN.spec.ts b/packages/search/lib/commands/EXPLAIN.spec.ts new file mode 100644 index 00000000000..dd55e038710 --- /dev/null +++ b/packages/search/lib/commands/EXPLAIN.spec.ts @@ -0,0 +1,11 @@ +import { strict as assert } from 'assert'; +import { transformArguments } from './EXPLAIN'; + +describe('EXPLAIN', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('index', '*'), + ['FT.EXPLAIN', 'index', '*'] + ); + }); +}); diff --git a/packages/search/lib/commands/EXPLAIN.ts b/packages/search/lib/commands/EXPLAIN.ts new file mode 100644 index 00000000000..c41cd9a4aac --- /dev/null +++ b/packages/search/lib/commands/EXPLAIN.ts @@ -0,0 +1,7 @@ +export const IS_READ_ONLY = true; + +export function transformArguments(index: string, query: string): Array { + return ['FT.EXPLAIN', index, query]; +} + +export declare function transformReply(): string; diff --git a/packages/search/lib/commands/EXPLAINCLI.spec.ts b/packages/search/lib/commands/EXPLAINCLI.spec.ts new file mode 100644 index 00000000000..238ef44eaaa --- /dev/null +++ b/packages/search/lib/commands/EXPLAINCLI.spec.ts @@ -0,0 +1,11 @@ +import { strict as assert } from 'assert'; +import { transformArguments } from './EXPLAINCLI'; + +describe('EXPLAINCLI', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('index', '*'), + ['FT.EXPLAINCLI', 'index', '*'] + ); + }); +}); diff --git a/packages/search/lib/commands/EXPLAINCLI.ts b/packages/search/lib/commands/EXPLAINCLI.ts new file mode 100644 index 00000000000..db97fb9c8da --- /dev/null +++ b/packages/search/lib/commands/EXPLAINCLI.ts @@ -0,0 +1,7 @@ +export const IS_READ_ONLY = true; + +export function transformArguments(index: string, query: string): Array { + return ['FT.EXPLAINCLI', index, query]; +} + +export declare function transformReply(): Array; diff --git a/packages/search/lib/commands/INFO.spec.ts b/packages/search/lib/commands/INFO.spec.ts new file mode 100644 index 00000000000..fa50a4b0cd8 --- /dev/null +++ b/packages/search/lib/commands/INFO.spec.ts @@ -0,0 +1,65 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { SchemaFieldTypes } from './CREATE'; +import { transformArguments } from './INFO'; + +describe('INFO', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('index'), + ['FT.INFO', 'index'] + ); + }); + + testUtils.testWithClient('client.ft.info', async client => { + await client.ft.create('index', {}, { + ON: 'HASH' // TODO: shouldn't be mandatory + }); + + assert.deepEqual( + await client.ft.info('index'), + { + indexName: 'index', + indexOptions: [], + indexDefinition: { + defaultScore: '1', + keyType: 'HASH', + prefixes: [''] + }, + attributes: [], + numDocs: '0', + maxDocId: '0', + numTerms: '0', + numRecords: '0', + invertedSzMb: '0', + totalInvertedIndexBlocks: '0', + offsetVectorsSzMb: '0', + docTableSizeMb: '0', + sortableValuesSizeMb: '0', + keyTableSizeMb: '0', + recordsPerDocAvg: '-nan', + bytesPerRecordAvg: '-nan', + offsetsPerTermAvg: '-nan', + offsetBitsPerRecordAvg: '-nan', + hashIndexingFailures: '0', + indexing: '0', + percentIndexed: '1', + gcStats: { + bytesCollected: '0', + totalMsRun: '0', + totalCycles: '0', + averageCycleTimeMs: '-nan', + lastRunTimeMs: '0', + gcNumericTreesMissed: '0', + gcBlocksDenied: '0' + }, + cursorStats: { + globalIdle: 0, + globalTotal: 0, + indexCapacity: 128, + idnexTotal: 0 + } + } + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/search/lib/commands/INFO.ts b/packages/search/lib/commands/INFO.ts new file mode 100644 index 00000000000..42451114c89 --- /dev/null +++ b/packages/search/lib/commands/INFO.ts @@ -0,0 +1,171 @@ +export function transformArguments(index: string): Array { + return ['FT.INFO', index]; +} + +type InfoRawReply = [ + _: string, + indexName: string, + _: string, + indexOptions: Array, + _: string, + indexDefinition: [ + _: string, + keyType: string, + _: string, + prefixes: Array, + _: string, + defaultScore: string + ], + _: string, + attributes: Array>, + _: string, + numDocs: string, + _: string, + maxDocId: string, + _: string, + numTerms: string, + _: string, + numRecords: string, + _: string, + invertedSzMb: string, + _: string, + totalInvertedIndexBlocks: string, + _: string, + offsetVectorsSzMb: string, + _: string, + docTableSizeMb: string, + _: string, + sortableValuesSizeMb: string, + _: string, + keyTableSizeMb: string, + _: string, + recordsPerDocAvg: string, + _: string, + bytesPerRecordAvg: string, + _: string, + offsetsPerTermAvg: string, + _: string, + offsetBitsPerRecordAvg: string, + _: string, + hashIndexingFailures: string, + _: string, + indexing: string, + _: string, + percentIndexed: string, + _: string, + gcStats: [ + _: string, + bytesCollected: string, + _: string, + totalMsRun: string, + _: string, + totalCycles: string, + _: string, + averageCycleTimeMs: string, + _: string, + lastRunTimeMs: string, + _: string, + gcNumericTreesMissed: string, + _: string, + gcBlocksDenied: string + ], + _: string, + cursorStats: [ + _: string, + globalIdle: number, + _: string, + globalTotal: number, + _: string, + indexCapacity: number, + _: string, + idnexTotal: number + ] +]; + +interface InfoReply { + indexName: string; + indexOptions: Array; + indexDefinition: { + keyType: string; + prefixes: Array; + defaultScore: string; + }; + attributes: Array>; + numDocs: string; + maxDocId: string; + numTerms: string; + numRecords: string; + invertedSzMb: string; + totalInvertedIndexBlocks: string; + offsetVectorsSzMb: string; + docTableSizeMb: string; + sortableValuesSizeMb: string; + keyTableSizeMb: string; + recordsPerDocAvg: string; + bytesPerRecordAvg: string; + offsetsPerTermAvg: string; + offsetBitsPerRecordAvg: string; + hashIndexingFailures: string; + indexing: string; + percentIndexed: string; + gcStats: { + bytesCollected: string; + totalMsRun: string; + totalCycles: string; + averageCycleTimeMs: string; + lastRunTimeMs: string; + gcNumericTreesMissed: string; + gcBlocksDenied: string; + }; + cursorStats: { + globalIdle: number; + globalTotal: number; + indexCapacity: number; + idnexTotal: number; + }; +} + +export function transformReply(rawReply: InfoRawReply): InfoReply { + return { + indexName: rawReply[1], + indexOptions: rawReply[3], + indexDefinition: { + keyType: rawReply[5][1], + prefixes: rawReply[5][3], + defaultScore: rawReply[5][5] + }, + attributes: rawReply[7], + numDocs: rawReply[9], + maxDocId: rawReply[11], + numTerms: rawReply[13], + numRecords: rawReply[15], + invertedSzMb: rawReply[17], + totalInvertedIndexBlocks: rawReply[19], + offsetVectorsSzMb: rawReply[21], + docTableSizeMb: rawReply[23], + sortableValuesSizeMb: rawReply[25], + keyTableSizeMb: rawReply[27], + recordsPerDocAvg: rawReply[29], + bytesPerRecordAvg: rawReply[31], + offsetsPerTermAvg: rawReply[33], + offsetBitsPerRecordAvg: rawReply[35], + hashIndexingFailures: rawReply[37], + indexing: rawReply[39], + percentIndexed: rawReply[41], + gcStats: { + bytesCollected: rawReply[43][1], + totalMsRun: rawReply[43][3], + totalCycles: rawReply[43][5], + averageCycleTimeMs: rawReply[43][7], + lastRunTimeMs: rawReply[43][9], + gcNumericTreesMissed: rawReply[43][11], + gcBlocksDenied: rawReply[43][13] + }, + cursorStats: { + globalIdle: rawReply[45][1], + globalTotal: rawReply[45][3], + indexCapacity: rawReply[45][5], + idnexTotal: rawReply[45][7] + } + }; +} diff --git a/packages/search/lib/commands/PROFILE.ts b/packages/search/lib/commands/PROFILE.ts new file mode 100644 index 00000000000..e315ea52304 --- /dev/null +++ b/packages/search/lib/commands/PROFILE.ts @@ -0,0 +1,26 @@ +export const IS_READ_ONLY = true; + +interface ProfileOptions { + LIMITED?: true; +} + +export function transformArguments( + index: string, + type: 'SEARCH' | 'AGGREGATE', + query: string, + options?: ProfileOptions +): Array { + const args = ['FT.PROFILE', index, type]; + + if (options?.LIMITED) { + args.push('LIMITED'); + } + + args.push('QUERY', query); + + return args; +} + +export function transformReply() { + +} diff --git a/packages/search/lib/commands/SEARCH.spec.ts b/packages/search/lib/commands/SEARCH.spec.ts new file mode 100644 index 00000000000..efe9c899ac2 --- /dev/null +++ b/packages/search/lib/commands/SEARCH.spec.ts @@ -0,0 +1,243 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { RedisSearchLanguages, SchemaFieldTypes } from './CREATE'; +import { transformArguments } from './SEARCH'; + +describe('SEARCH', () => { + describe('transformArguments', () => { + it('without options', () => { + assert.deepEqual( + transformArguments('index', 'query'), + ['FT.SEARCH', 'index', 'query'] + ); + }); + + it('with VERBATIM', () => { + assert.deepEqual( + transformArguments('index', 'query', { VERBATIM: true }), + ['FT.SEARCH', 'index', 'query', 'VERBATIM'] + ); + }); + + it('with NOSTOPWORDS', () => { + assert.deepEqual( + transformArguments('index', 'query', { NOSTOPWORDS: true }), + ['FT.SEARCH', 'index', 'query', 'NOSTOPWORDS'] + ); + }); + + it('with INKEYS', () => { + assert.deepEqual( + transformArguments('index', 'query', { INKEYS: 'key' }), + ['FT.SEARCH', 'index', 'query', 'INKEYS', '1', 'key'] + ); + }); + + it('with INFIELDS', () => { + assert.deepEqual( + transformArguments('index', 'query', { INFIELDS: 'field' }), + ['FT.SEARCH', 'index', 'query', 'INFIELDS', '1', 'field'] + ); + }); + + it('with RETURN', () => { + assert.deepEqual( + transformArguments('index', 'query', { RETURN: 'return' }), + ['FT.SEARCH', 'index', 'query', 'RETURN', '1', 'return'] + ); + }); + + describe('with SUMMARIZE', () => { + it('true', () => { + assert.deepEqual( + transformArguments('index', 'query', { SUMMARIZE: true }), + ['FT.SEARCH', 'index', 'query', 'SUMMARIZE'] + ); + }); + + describe('with FIELDS', () => { + it('string', () => { + assert.deepEqual( + transformArguments('index', 'query', { + SUMMARIZE: { + FIELDS: ['@field'] + } + }), + ['FT.SEARCH', 'index', 'query', 'SUMMARIZE', 'FIELDS', '1', '@field'] + ); + }); + + it('Array', () => { + assert.deepEqual( + transformArguments('index', 'query', { + SUMMARIZE: { + FIELDS: ['@1', '@2'] + } + }), + ['FT.SEARCH', 'index', 'query', 'SUMMARIZE', 'FIELDS', '2', '@1', '@2'] + ); + }); + }); + + it('with FRAGS', () => { + assert.deepEqual( + transformArguments('index', 'query', { + SUMMARIZE: { + FRAGS: 1 + } + }), + ['FT.SEARCH', 'index', 'query', 'SUMMARIZE', 'FRAGS', '1'] + ); + }); + + it('with LEN', () => { + assert.deepEqual( + transformArguments('index', 'query', { + SUMMARIZE: { + LEN: 1 + } + }), + ['FT.SEARCH', 'index', 'query', 'SUMMARIZE', 'LEN', '1'] + ); + }); + + it('with SEPARATOR', () => { + assert.deepEqual( + transformArguments('index', 'query', { + SUMMARIZE: { + SEPARATOR: 'separator' + } + }), + ['FT.SEARCH', 'index', 'query', 'SUMMARIZE', 'SEPARATOR', 'separator'] + ); + }); + }); + + describe('with HIGHLIGHT', () => { + it('true', () => { + assert.deepEqual( + transformArguments('index', 'query', { HIGHLIGHT: true }), + ['FT.SEARCH', 'index', 'query', 'HIGHLIGHT'] + ); + }); + + describe('with FIELDS', () => { + it('string', () => { + assert.deepEqual( + transformArguments('index', 'query', { + HIGHLIGHT: { + FIELDS: ['@field'] + } + }), + ['FT.SEARCH', 'index', 'query', 'HIGHLIGHT', 'FIELDS', '1', '@field'] + ); + }); + + it('Array', () => { + assert.deepEqual( + transformArguments('index', 'query', { + HIGHLIGHT: { + FIELDS: ['@1', '@2'] + } + }), + ['FT.SEARCH', 'index', 'query', 'HIGHLIGHT', 'FIELDS', '2', '@1', '@2'] + ); + }); + }); + + it('with TAGS', () => { + assert.deepEqual( + transformArguments('index', 'query', { + HIGHLIGHT: { + TAGS: { + open: 'open', + close: 'close' + } + } + }), + ['FT.SEARCH', 'index', 'query', 'HIGHLIGHT', 'TAGS', 'open', 'close'] + ); + }); + }); + + it('with SLOP', () => { + assert.deepEqual( + transformArguments('index', 'query', { SLOP: 1 }), + ['FT.SEARCH', 'index', 'query', 'SLOP', '1'] + ); + }); + + it('with INORDER', () => { + assert.deepEqual( + transformArguments('index', 'query', { INORDER: true }), + ['FT.SEARCH', 'index', 'query', 'INORDER'] + ); + }); + + it('with LANGUAGE', () => { + assert.deepEqual( + transformArguments('index', 'query', { LANGUAGE: RedisSearchLanguages.ARABIC }), + ['FT.SEARCH', 'index', 'query', 'LANGUAGE', RedisSearchLanguages.ARABIC] + ); + }); + + it('with EXPANDER', () => { + assert.deepEqual( + transformArguments('index', 'query', { EXPANDER: 'expender' }), + ['FT.SEARCH', 'index', 'query', 'EXPANDER', 'expender'] + ); + }); + + it('with SCORER', () => { + assert.deepEqual( + transformArguments('index', 'query', { SCORER: 'scorer' }), + ['FT.SEARCH', 'index', 'query', 'SCORER', 'scorer'] + ); + }); + + it('with MSORTBY', () => { + assert.deepEqual( + transformArguments('index', 'query', { MSORTBY: '@by' }), + ['FT.SEARCH', 'index', 'query', 'MSORTBY', '1', '@by'] + ); + }); + + it('with LIMIT', () => { + assert.deepEqual( + transformArguments('index', 'query', { + LIMIT: { + from: 0, + size: 1 + } + }), + ['FT.SEARCH', 'index', 'query', 'LIMIT', '0', '1'] + ); + }); + }); + + testUtils.testWithClient('client.ft.search', async client => { + await Promise.all([ + client.ft.create('index', { + field: SchemaFieldTypes.NUMERIC + }), + client.hSet('1', 'field', '1') + ]); + + assert.deepEqual( + await client.ft.search('index', '*'), + { + total: 1, + documents: [{ + id: '1', + value: Object.create(null, { + field: { + value: '1', + configurable: true, + enumerable: true + } + }) + }] + } + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/search/lib/commands/SEARCH.ts b/packages/search/lib/commands/SEARCH.ts new file mode 100644 index 00000000000..6b14a0a18fd --- /dev/null +++ b/packages/search/lib/commands/SEARCH.ts @@ -0,0 +1,202 @@ +import { RedisCommandArguments } from '@redis/client/dist/lib/commands'; +import { pushOptionalVerdictArgument, pushVerdictArgument, transformReplyTuples } from '@redis/client/dist/lib/commands/generic-transformers'; +import { type } from 'os'; +import { PropertyName, pushSortByArguments, SortByOptions } from '.'; +import { RedisSearchLanguages } from './CREATE'; + +export const FIRST_KEY_INDEX = 1; + +export const IS_READ_ONLY = true; + +interface SearchOptions { + // NOCONTENT?: true; TODO + VERBATIM?: true; + NOSTOPWORDS?: true; + // WITHSCORES?: true; + // WITHPAYLOADS?: true; + WITHSORTKEYS?: true; + // FILTER?: { + // field: string; + // min: number | string; + // max: number | string; + // }; + // GEOFILTER?: { + // field: string; + // lon: number; + // lat: number; + // radius: number; + // unit: 'm' | 'km' | 'mi' | 'ft'; + // }; + INKEYS?: string | Array; + INFIELDS?: string | Array; + RETURN?: string | Array; + SUMMARIZE?: true | { + FIELDS?: PropertyName | Array; + FRAGS?: number; + LEN?: number; + SEPARATOR?: string; + }; + HIGHLIGHT?: true | { + FIELDS?: PropertyName | Array; + TAGS?: { + open: string; + close: string; + } + }; + SLOP?: number; + INORDER?: true; + LANGUAGE?: RedisSearchLanguages; + EXPANDER?: string; + SCORER?: string; + // EXPLAINSCORE?: true; // TODO: WITHSCORES + // PAYLOAD?: ; + // SORTBY?: SortByOptions; + MSORTBY?: SortByOptions | Array; + LIMIT?: { + from: number | string; + size: number | string; + }; +} + +export function transformArguments( + index: string, + query: string, + options?: SearchOptions +): RedisCommandArguments { + const args: RedisCommandArguments = ['FT.SEARCH', index, query]; + + if (options?.VERBATIM) { + args.push('VERBATIM'); + } + + if (options?.NOSTOPWORDS) { + args.push('NOSTOPWORDS'); + } + + // if (options?.WITHSCORES) { + // args.push('WITHSCORES'); + // } + + // if (options?.WITHPAYLOADS) { + // args.push('WITHPAYLOADS'); + // } + + pushOptionalVerdictArgument(args, 'INKEYS', options?.INKEYS); + pushOptionalVerdictArgument(args, 'INFIELDS', options?.INFIELDS); + pushOptionalVerdictArgument(args, 'RETURN', options?.RETURN); + + if (options?.SUMMARIZE) { + args.push('SUMMARIZE'); + + if (typeof options.SUMMARIZE === 'object') { + if (options.SUMMARIZE.FIELDS) { + args.push('FIELDS'); + pushVerdictArgument(args, options.SUMMARIZE.FIELDS); + } + + if (options.SUMMARIZE.FRAGS) { + args.push('FRAGS', options.SUMMARIZE.FRAGS.toString()); + } + + if (options.SUMMARIZE.LEN) { + args.push('LEN', options.SUMMARIZE.LEN.toString()); + } + + if (options.SUMMARIZE.SEPARATOR) { + args.push('SEPARATOR', options.SUMMARIZE.SEPARATOR); + } + } + } + + if (options?.HIGHLIGHT) { + args.push('HIGHLIGHT'); + + if (typeof options.HIGHLIGHT === 'object') { + if (options.HIGHLIGHT.FIELDS) { + args.push('FIELDS'); + pushVerdictArgument(args, options.HIGHLIGHT.FIELDS); + } + + if (options.HIGHLIGHT.TAGS) { + args.push('TAGS', options.HIGHLIGHT.TAGS.open, options.HIGHLIGHT.TAGS.close); + } + } + } + + if (options?.SLOP) { + args.push('SLOP', options.SLOP.toString()); + } + + if (options?.INORDER) { + args.push('INORDER'); + } + + if (options?.LANGUAGE) { + args.push('LANGUAGE', options.LANGUAGE); + } + + if (options?.EXPANDER) { + args.push('EXPANDER', options.EXPANDER); + } + + if (options?.SCORER) { + args.push('SCORER', options.SCORER); + } + + // if (options?.EXPLAINSCORE) { + // args.push('EXPLAINSCORE'); + // } + + // if (options?.PAYLOAD) { + // args.push('PAYLOAD', options.PAYLOAD); + // } + + // if (options?.SORTBY) { + // args.push('SORTBY'); + // pushSortByArguments(args, options.SORTBY); + // } + + if (options?.MSORTBY) { + pushSortByArguments(args, 'MSORTBY', options.MSORTBY); + } + + if (options?.LIMIT) { + args.push( + 'LIMIT', + options.LIMIT.from.toString(), + options.LIMIT.size.toString() + ); + } + + return args; +} + +interface SearchDocumentValue { + [key: string]: string | number | null | Array | SearchDocumentValue; +} + +interface SearchReply { + total: number; + documents: Array<{ + id: string; + value: SearchDocumentValue; + }>; +} + +export function transformReply(reply: Array): SearchReply { + const documents = []; + for (let i = 1; i < reply.length; i += 2) { + const tuples = reply[i + 1]; + documents.push({ + id: reply[i], + value: tuples.length === 2 && tuples[0] === '$' ? + JSON.parse(tuples[1]) : + transformReplyTuples(tuples) + }); + } + + return { + total: reply[0], + documents + }; +} diff --git a/packages/search/lib/commands/SPELLCHECK.spec.ts b/packages/search/lib/commands/SPELLCHECK.spec.ts new file mode 100644 index 00000000000..bacbe118b38 --- /dev/null +++ b/packages/search/lib/commands/SPELLCHECK.spec.ts @@ -0,0 +1,71 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { SchemaFieldTypes } from './CREATE'; +import { transformArguments } from './SPELLCHECK'; + +describe('SPELLCHECK', () => { + describe('transformArguments', () => { + it('without options', () => { + assert.deepEqual( + transformArguments('index', 'query'), + ['FT.SPELLCHECK', 'index', 'query'] + ); + }); + + it('with DISTANCE', () => { + assert.deepEqual( + transformArguments('index', 'query', { DISTANCE: 2 }), + ['FT.SPELLCHECK', 'index', 'query', 'DISTANCE', '2'] + ); + }); + + describe('with TERMS', () => { + it('single', () => { + assert.deepEqual( + transformArguments('index', 'query', { + TERMS: { + mode: 'INCLUDE', + dictionary: 'dictionary' + } + }), + ['FT.SPELLCHECK', 'index', 'query', 'TERMS', 'INCLUDE', 'dictionary'] + ); + }); + + it('multiple', () => { + assert.deepEqual( + transformArguments('index', 'query', { + TERMS: [{ + mode: 'INCLUDE', + dictionary: 'include' + }, { + mode: 'EXCLUDE', + dictionary: 'exclude' + }] + }), + ['FT.SPELLCHECK', 'index', 'query', 'TERMS', 'INCLUDE', 'include', 'TERMS', 'EXCLUDE', 'exclude'] + ); + }); + }); + }); + + testUtils.testWithClient('client.ft.spellCheck', async client => { + await Promise.all([ + client.ft.create('index', { + field: SchemaFieldTypes.TEXT + }), + client.hSet('key', 'field', 'query') + ]); + + assert.deepEqual( + await client.ft.spellCheck('index', 'quer'), + [{ + term: 'quer', + suggestions: [{ + score: 1, + suggestion: 'query' + }] + }] + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/search/lib/commands/SPELLCHECK.ts b/packages/search/lib/commands/SPELLCHECK.ts new file mode 100644 index 00000000000..ae4cb3cdce1 --- /dev/null +++ b/packages/search/lib/commands/SPELLCHECK.ts @@ -0,0 +1,57 @@ +interface SpellCheckTerms { + mode: 'INCLUDE' | 'EXCLUDE'; + dictionary: string; +} + +interface SpellCheckOptions { + DISTANCE?: number; + TERMS?: SpellCheckTerms | Array; +} + +export function transformArguments(index: string, query: string, options?: SpellCheckOptions): Array { + const args = ['FT.SPELLCHECK', index, query]; + + if (options?.DISTANCE) { + args.push('DISTANCE', options.DISTANCE.toString()); + } + + if (options?.TERMS) { + if (Array.isArray(options.TERMS)) { + for (const term of options.TERMS) { + pushTerms(args, term); + } + } else { + pushTerms(args, options.TERMS); + } + } + + return args; +} + +function pushTerms(args: Array, { mode, dictionary }: SpellCheckTerms): void { + args.push('TERMS', mode, dictionary); +} + +type SpellCheckRawReply = Array<[ + _: string, + term: string, + suggestions: Array<[score: string, suggestion: string]> +]>; + +type SpellCheckReply = Array<{ + term: string, + suggestions: Array<{ + score: number, + suggestion: string + }> +}>; + +export function transformReply(rawReply: SpellCheckRawReply): SpellCheckReply { + return rawReply.map(([, term, suggestions]) => ({ + term, + suggestions: suggestions.map(([score, suggestion]) => ({ + score: Number(score), + suggestion + })) + })); +} diff --git a/packages/search/lib/commands/SUGADD.spec.ts b/packages/search/lib/commands/SUGADD.spec.ts new file mode 100644 index 00000000000..23294eb4abd --- /dev/null +++ b/packages/search/lib/commands/SUGADD.spec.ts @@ -0,0 +1,35 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './SUGADD'; + +describe('SUGADD', () => { + describe('transformArguments', () => { + it('without options', () => { + assert.deepEqual( + transformArguments('key', 'string', 1), + ['FT.SUGADD', 'key', 'string', '1'] + ); + }); + + it('with INCR', () => { + assert.deepEqual( + transformArguments('key', 'string', 1, { INCR: true }), + ['FT.SUGADD', 'key', 'string', '1', 'INCR'] + ); + }); + + it('with PAYLOAD', () => { + assert.deepEqual( + transformArguments('key', 'string', 1, { PAYLOAD: 'payload' }), + ['FT.SUGADD', 'key', 'string', '1', 'PAYLOAD', 'payload'] + ); + }); + }); + + testUtils.testWithClient('client.ft.sugAdd', async client => { + assert.equal( + await client.ft.sugAdd('key', 'string', 1), + 1 + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/search/lib/commands/SUGADD.ts b/packages/search/lib/commands/SUGADD.ts new file mode 100644 index 00000000000..d68f0d98841 --- /dev/null +++ b/packages/search/lib/commands/SUGADD.ts @@ -0,0 +1,20 @@ +interface SugAddOptions { + INCR?: true; + PAYLOAD?: string; +} + +export function transformArguments(key: string, string: string, score: number, options?: SugAddOptions): Array { + const args = ['FT.SUGADD', key, string, score.toString()]; + + if (options?.INCR) { + args.push('INCR'); + } + + if (options?.PAYLOAD) { + args.push('PAYLOAD', options.PAYLOAD); + } + + return args; +} + +export declare function transformReply(): number; diff --git a/packages/search/lib/commands/SUGDEL.spec.ts b/packages/search/lib/commands/SUGDEL.spec.ts new file mode 100644 index 00000000000..3d89e3b9a72 --- /dev/null +++ b/packages/search/lib/commands/SUGDEL.spec.ts @@ -0,0 +1,19 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './SUGDEL'; + +describe('SUGDEL', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key', 'string'), + ['FT.SUGDEL', 'key', 'string'] + ); + }); + + testUtils.testWithClient('client.ft.sugDel', async client => { + assert.equal( + await client.ft.sugDel('key', 'string'), + false + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/search/lib/commands/SUGDEL.ts b/packages/search/lib/commands/SUGDEL.ts new file mode 100644 index 00000000000..be2d4262caa --- /dev/null +++ b/packages/search/lib/commands/SUGDEL.ts @@ -0,0 +1,5 @@ +export function transformArguments(key: string, string: string): Array { + return ['FT.SUGDEL', key, string]; +} + +export { transformReplyBoolean as transformReply } from '@redis/client/dist/lib/commands/generic-transformers'; diff --git a/packages/search/lib/commands/SUGGET.spec.ts b/packages/search/lib/commands/SUGGET.spec.ts new file mode 100644 index 00000000000..c24c2ff0863 --- /dev/null +++ b/packages/search/lib/commands/SUGGET.spec.ts @@ -0,0 +1,46 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './SUGGET'; + +describe('SUGGET', () => { + describe('transformArguments', () => { + it('without options', () => { + assert.deepEqual( + transformArguments('key', 'prefix'), + ['FT.SUGGET', 'key', 'prefix'] + ); + }); + + it('with FUZZY', () => { + assert.deepEqual( + transformArguments('key', 'prefix', { FUZZY: true }), + ['FT.SUGGET', 'key', 'prefix', 'FUZZY'] + ); + }); + + it('with MAX', () => { + assert.deepEqual( + transformArguments('key', 'prefix', { MAX: 10 }), + ['FT.SUGGET', 'key', 'prefix', 'MAX', '10'] + ); + }); + }); + + describe('client.ft.sugGet', () => { + testUtils.testWithClient('null', async client => { + assert.equal( + await client.ft.sugGet('key', 'prefix'), + null + ); + }, GLOBAL.SERVERS.OPEN); + + testUtils.testWithClient('with suggestions', async client => { + await client.ft.sugAdd('key', 'string', 1); + + assert.deepEqual( + await client.ft.sugGet('key', 'string'), + ['string'] + ); + }, GLOBAL.SERVERS.OPEN); + }); +}); diff --git a/packages/search/lib/commands/SUGGET.ts b/packages/search/lib/commands/SUGGET.ts new file mode 100644 index 00000000000..558cedeaa08 --- /dev/null +++ b/packages/search/lib/commands/SUGGET.ts @@ -0,0 +1,22 @@ +export const IS_READ_ONLY = true; + +export interface SugGetOptions { + FUZZY?: true; + MAX?: number; +} + +export function transformArguments(key: string, prefix: string, options?: SugGetOptions): Array { + const args = ['FT.SUGGET', key, prefix]; + + if (options?.FUZZY) { + args.push('FUZZY'); + } + + if (options?.MAX) { + args.push('MAX', options.MAX.toString()); + } + + return args; +} + +export declare function transformReply(): null | Array; diff --git a/packages/search/lib/commands/SUGGET_WITHPAYLOADS.spec.ts b/packages/search/lib/commands/SUGGET_WITHPAYLOADS.spec.ts new file mode 100644 index 00000000000..a4a87ebe895 --- /dev/null +++ b/packages/search/lib/commands/SUGGET_WITHPAYLOADS.spec.ts @@ -0,0 +1,33 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './SUGGET_WITHPAYLOADS'; + +describe('SUGGET WITHPAYLOADS', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key', 'prefix'), + ['FT.SUGGET', 'key', 'prefix', 'WITHPAYLOADS'] + ); + }); + + describe('client.ft.sugGetWithPayloads', () => { + testUtils.testWithClient('null', async client => { + assert.equal( + await client.ft.sugGetWithPayloads('key', 'prefix'), + null + ); + }, GLOBAL.SERVERS.OPEN); + + testUtils.testWithClient('with suggestions', async client => { + await client.ft.sugAdd('key', 'string', 1, { PAYLOAD: 'payload' }); + + assert.deepEqual( + await client.ft.sugGetWithPayloads('key', 'string'), + [{ + suggestion: 'string', + payload: 'payload' + }] + ); + }, GLOBAL.SERVERS.OPEN); + }); +}); diff --git a/packages/search/lib/commands/SUGGET_WITHPAYLOADS.ts b/packages/search/lib/commands/SUGGET_WITHPAYLOADS.ts new file mode 100644 index 00000000000..7eaff4697e1 --- /dev/null +++ b/packages/search/lib/commands/SUGGET_WITHPAYLOADS.ts @@ -0,0 +1,29 @@ +import { SugGetOptions, transformArguments as transformSugGetArguments } from './SUGGET'; + +export { IS_READ_ONLY } from './SUGGET'; + +export function transformArguments(key: string, prefix: string, options?: SugGetOptions): Array { + return [ + ...transformSugGetArguments(key, prefix, options), + 'WITHPAYLOADS' + ]; +} + +export interface SuggestionWithPayload { + suggestion: string; + payload: string | null; +} + +export function transformReply(rawReply: Array | null): Array | null { + if (rawReply === null) return null; + + const transformedReply = []; + for (let i = 0; i < rawReply.length; i += 2) { + transformedReply.push({ + suggestion: rawReply[i]!, + payload: rawReply[i + 1] + }); + } + + return transformedReply; +} diff --git a/packages/search/lib/commands/SUGGET_WITHSCORES.spec.ts b/packages/search/lib/commands/SUGGET_WITHSCORES.spec.ts new file mode 100644 index 00000000000..e60daa917a9 --- /dev/null +++ b/packages/search/lib/commands/SUGGET_WITHSCORES.spec.ts @@ -0,0 +1,33 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './SUGGET_WITHSCORES'; + +describe('SUGGET WITHSCORES', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key', 'prefix'), + ['FT.SUGGET', 'key', 'prefix', 'WITHSCORES'] + ); + }); + + describe('client.ft.sugGetWithScores', () => { + testUtils.testWithClient('null', async client => { + assert.equal( + await client.ft.sugGetWithScores('key', 'prefix'), + null + ); + }, GLOBAL.SERVERS.OPEN); + + testUtils.testWithClient('with suggestions', async client => { + await client.ft.sugAdd('key', 'string', 1); + + assert.deepEqual( + await client.ft.sugGetWithScores('key', 'string'), + [{ + suggestion: 'string', + score: 2147483648 + }] + ); + }, GLOBAL.SERVERS.OPEN); + }); +}); diff --git a/packages/search/lib/commands/SUGGET_WITHSCORES.ts b/packages/search/lib/commands/SUGGET_WITHSCORES.ts new file mode 100644 index 00000000000..bad5bff2999 --- /dev/null +++ b/packages/search/lib/commands/SUGGET_WITHSCORES.ts @@ -0,0 +1,29 @@ +import { SugGetOptions, transformArguments as transformSugGetArguments } from './SUGGET'; + +export { IS_READ_ONLY } from './SUGGET'; + +export function transformArguments(key: string, prefix: string, options?: SugGetOptions): Array { + return [ + ...transformSugGetArguments(key, prefix, options), + 'WITHSCORES' + ]; +} + +export interface SuggestionWithScores { + suggestion: string; + score: number; +} + +export function transformReply(rawReply: Array | null): Array | null { + if (rawReply === null) return null; + + const transformedReply = []; + for (let i = 0; i < rawReply.length; i += 2) { + transformedReply.push({ + suggestion: rawReply[i], + score: Number(rawReply[i + 1]) + }); + } + + return transformedReply; +} diff --git a/packages/search/lib/commands/SUGGET_WITHSCORES_WITHPAYLOADS.spec.ts b/packages/search/lib/commands/SUGGET_WITHSCORES_WITHPAYLOADS.spec.ts new file mode 100644 index 00000000000..0900d91b8d9 --- /dev/null +++ b/packages/search/lib/commands/SUGGET_WITHSCORES_WITHPAYLOADS.spec.ts @@ -0,0 +1,34 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './SUGGET_WITHSCORES_WITHPAYLOADS'; + +describe('SUGGET WITHSCORES WITHPAYLOADS', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key', 'prefix'), + ['FT.SUGGET', 'key', 'prefix', 'WITHSCORES', 'WITHPAYLOADS'] + ); + }); + + describe('client.ft.sugGetWithScoresWithPayloads', () => { + testUtils.testWithClient('null', async client => { + assert.equal( + await client.ft.sugGetWithScoresWithPayloads('key', 'prefix'), + null + ); + }, GLOBAL.SERVERS.OPEN); + + testUtils.testWithClient('with suggestions', async client => { + await client.ft.sugAdd('key', 'string', 1, { PAYLOAD: 'payload' }); + + assert.deepEqual( + await client.ft.sugGetWithScoresWithPayloads('key', 'string'), + [{ + suggestion: 'string', + score: 2147483648, + payload: 'payload' + }] + ); + }, GLOBAL.SERVERS.OPEN); + }); +}); diff --git a/packages/search/lib/commands/SUGGET_WITHSCORES_WITHPAYLOADS.ts b/packages/search/lib/commands/SUGGET_WITHSCORES_WITHPAYLOADS.ts new file mode 100644 index 00000000000..3b2fe7667b7 --- /dev/null +++ b/packages/search/lib/commands/SUGGET_WITHSCORES_WITHPAYLOADS.ts @@ -0,0 +1,30 @@ +import { SugGetOptions, transformArguments as transformSugGetArguments } from './SUGGET'; +import { SuggestionWithPayload } from './SUGGET_WITHPAYLOADS'; +import { SuggestionWithScores } from './SUGGET_WITHSCORES'; + +export { IS_READ_ONLY } from './SUGGET'; + +export function transformArguments(key: string, prefix: string, options?: SugGetOptions): Array { + return [ + ...transformSugGetArguments(key, prefix, options), + 'WITHSCORES', + 'WITHPAYLOADS' + ]; +} + +type SuggestionWithScoresAndPayloads = SuggestionWithScores & SuggestionWithPayload; + +export function transformReply(rawReply: Array | null): Array | null { + if (rawReply === null) return null; + + const transformedReply = []; + for (let i = 0; i < rawReply.length; i += 3) { + transformedReply.push({ + suggestion: rawReply[i]!, + score: Number(rawReply[i + 1]!), + payload: rawReply[i + 2] + }); + } + + return transformedReply; +} diff --git a/packages/search/lib/commands/SUGLEN.spec.ts b/packages/search/lib/commands/SUGLEN.spec.ts new file mode 100644 index 00000000000..2ea680df953 --- /dev/null +++ b/packages/search/lib/commands/SUGLEN.spec.ts @@ -0,0 +1,19 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './SUGLEN'; + +describe('SUGLEN', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('key'), + ['FT.SUGLEN', 'key'] + ); + }); + + testUtils.testWithClient('client.ft.sugLen', async client => { + assert.equal( + await client.ft.sugLen('key'), + 0 + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/search/lib/commands/SUGLEN.ts b/packages/search/lib/commands/SUGLEN.ts new file mode 100644 index 00000000000..15b3da61261 --- /dev/null +++ b/packages/search/lib/commands/SUGLEN.ts @@ -0,0 +1,7 @@ +export const IS_READ_ONLY = true; + +export function transformArguments(key: string): Array { + return ['FT.SUGLEN', key]; +} + +export declare function transformReply(): number; diff --git a/packages/search/lib/commands/SYNDUMP.spec.ts b/packages/search/lib/commands/SYNDUMP.spec.ts new file mode 100644 index 00000000000..4b0cb0c8b3a --- /dev/null +++ b/packages/search/lib/commands/SYNDUMP.spec.ts @@ -0,0 +1,23 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './SYNDUMP'; + +describe('SYNDUMP', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('index'), + ['FT.SYNDUMP', 'index'] + ); + }); + + testUtils.testWithClient('client.ft.synDump', async client => { + await client.ft.create('index', {}, { + ON: 'HASH' // TODO: shouldn't be mandatory + }); + + assert.deepEqual( + await client.ft.synDump('index'), + [] + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/search/lib/commands/SYNDUMP.ts b/packages/search/lib/commands/SYNDUMP.ts new file mode 100644 index 00000000000..5f1e71aaf78 --- /dev/null +++ b/packages/search/lib/commands/SYNDUMP.ts @@ -0,0 +1,5 @@ +export function transformArguments(index: string): Array { + return ['FT.SYNDUMP', index]; +} + +export declare function transformReply(): Array; diff --git a/packages/search/lib/commands/SYNUPDATE.spec.ts b/packages/search/lib/commands/SYNUPDATE.spec.ts new file mode 100644 index 00000000000..bf7fed84934 --- /dev/null +++ b/packages/search/lib/commands/SYNUPDATE.spec.ts @@ -0,0 +1,39 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './SYNUPDATE'; + +describe('SYNUPDATE', () => { + describe('transformArguments', () => { + it('single term', () => { + assert.deepEqual( + transformArguments('index', 'groupId', 'term'), + ['FT.SYNUPDATE', 'index', 'groupId', 'term'] + ); + }); + + it('multiple terms', () => { + assert.deepEqual( + transformArguments('index', 'groupId', ['1', '2']), + ['FT.SYNUPDATE', 'index', 'groupId', '1', '2'] + ); + }); + + it('with SKIPINITIALSCAN', () => { + assert.deepEqual( + transformArguments('index', 'groupId', 'term', { SKIPINITIALSCAN: true }), + ['FT.SYNUPDATE', 'index', 'groupId', 'SKIPINITIALSCAN', 'term'] + ); + }); + }); + + testUtils.testWithClient('client.ft.synUpdate', async client => { + await client.ft.create('index', {}, { + ON: 'HASH' // TODO: shouldn't be mandatory + }); + + assert.equal( + await client.ft.synUpdate('index', 'groupId', 'term'), + 'OK' + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/search/lib/commands/SYNUPDATE.ts b/packages/search/lib/commands/SYNUPDATE.ts new file mode 100644 index 00000000000..3384ea59d94 --- /dev/null +++ b/packages/search/lib/commands/SYNUPDATE.ts @@ -0,0 +1,23 @@ +import { pushVerdictArguments } from '@redis/client/dist/lib/commands/generic-transformers'; +import { RedisCommandArguments } from '@redis/client/dist/lib/commands'; + +interface SynUpdateOptions { + SKIPINITIALSCAN?: true; +} + +export function transformArguments( + index: string, + groupId: string, + terms: string | Array, + options?: SynUpdateOptions +): RedisCommandArguments { + const args = ['FT.SYNUPDATE', index, groupId]; + + if (options?.SKIPINITIALSCAN) { + args.push('SKIPINITIALSCAN'); + } + + return pushVerdictArguments(args, terms); +} + +export declare function transformReply(): 'OK'; diff --git a/packages/search/lib/commands/TAGVALS.spec.ts b/packages/search/lib/commands/TAGVALS.spec.ts new file mode 100644 index 00000000000..1f90939bb0d --- /dev/null +++ b/packages/search/lib/commands/TAGVALS.spec.ts @@ -0,0 +1,24 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { SchemaFieldTypes } from './CREATE'; +import { transformArguments } from './TAGVALS'; + +describe('TAGVALS', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments('index', '@field'), + ['FT.TAGVALS', 'index', '@field'] + ); + }); + + testUtils.testWithClient('client.ft.tagVals', async client => { + await client.ft.create('index', { + field: SchemaFieldTypes.TAG + }); + + assert.deepEqual( + await client.ft.tagVals('index', 'field'), + [] + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/search/lib/commands/TAGVALS.ts b/packages/search/lib/commands/TAGVALS.ts new file mode 100644 index 00000000000..54342f0c9e5 --- /dev/null +++ b/packages/search/lib/commands/TAGVALS.ts @@ -0,0 +1,5 @@ +export function transformArguments(index: string, fieldName: string): Array { + return ['FT.TAGVALS', index, fieldName]; +} + +export declare function transformReply(): Array; diff --git a/packages/search/lib/commands/_LIST.spec.ts b/packages/search/lib/commands/_LIST.spec.ts new file mode 100644 index 00000000000..602c29975f2 --- /dev/null +++ b/packages/search/lib/commands/_LIST.spec.ts @@ -0,0 +1,19 @@ +import { strict as assert } from 'assert'; +import testUtils, { GLOBAL } from '../test-utils'; +import { transformArguments } from './_LIST'; + +describe('_LIST', () => { + it('transformArguments', () => { + assert.deepEqual( + transformArguments(), + ['FT._LIST'] + ); + }); + + testUtils.testWithClient('client.ft._list', async client => { + assert.deepEqual( + await client.ft._list(), + [] + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/search/lib/commands/_LIST.ts b/packages/search/lib/commands/_LIST.ts new file mode 100644 index 00000000000..588ec837c3b --- /dev/null +++ b/packages/search/lib/commands/_LIST.ts @@ -0,0 +1,5 @@ +export function transformArguments(): Array { + return ['FT._LIST']; +} + +export declare function transformReply(): Array; diff --git a/packages/search/lib/commands/index.spec.ts b/packages/search/lib/commands/index.spec.ts new file mode 100644 index 00000000000..f0afa304a92 --- /dev/null +++ b/packages/search/lib/commands/index.spec.ts @@ -0,0 +1,46 @@ +import { strict as assert } from 'assert'; +import { pushArgumentsWithLength, pushSortByArguments } from '.'; + +describe('pushSortByArguments', () => { + describe('single', () => { + it('string', () => { + assert.deepEqual( + pushSortByArguments([], 'SORTBT', '@property'), + ['SORTBT', '1', '@property'] + ); + }); + + it('.BY', () => { + assert.deepEqual( + pushSortByArguments([], 'SORTBT', { BY: '@property' }), + ['SORTBT', '1', '@property'] + ); + }); + + it('with DIRECTION', () => { + assert.deepEqual( + pushSortByArguments([], 'SORTBY', { + BY: '@property', + DIRECTION: 'ASC' + }), + ['SORTBY', '2', '@property', 'ASC'] + ); + }); + }); + + it('multiple', () => { + assert.deepEqual( + pushSortByArguments([], 'SORTBY', ['@1', '@2']), + ['SORTBY', '2', '@1', '@2'] + ); + }); +}); + +it('pushArgumentsWithLength', () => { + assert.deepEqual( + pushArgumentsWithLength(['a'], args => { + args.push('b', 'c'); + }), + ['a', '2', 'b', 'c'] + ); +}); diff --git a/packages/search/lib/commands/index.ts b/packages/search/lib/commands/index.ts new file mode 100644 index 00000000000..f54a71e0e0b --- /dev/null +++ b/packages/search/lib/commands/index.ts @@ -0,0 +1,133 @@ +import * as _LIST from './_LIST'; +import * as AGGREGATE from './AGGREGATE'; +import * as ALIASADD from './ALIASADD'; +import * as ALIASDEL from './ALIASDEL'; +import * as ALIASUPDATE from './ALIASUPDATE'; +import * as CONFIG_GET from './CONFIG_GET'; +import * as CONFIG_SET from './CONFIG_SET'; +import * as CREATE from './CREATE'; +import * as DICTADD from './DICTADD'; +import * as DICTDEL from './DICTDEL'; +import * as DICTDUMP from './DICTDUMP'; +import * as DROPINDEX from './DROPINDEX'; +import * as EXPLAIN from './EXPLAIN'; +import * as EXPLAINCLI from './EXPLAINCLI'; +import * as INFO from './INFO'; +// import * as PROFILE from './PROFILE'; +import * as SEARCH from './SEARCH'; +import * as SPELLCHECK from './SPELLCHECK'; +import * as SUGADD from './SUGADD'; +import * as SUGDEL from './SUGDEL'; +import * as SUGGET_WITHPAYLOADS from './SUGGET_WITHPAYLOADS'; +import * as SUGGET_WITHSCORES_WITHPAYLOADS from './SUGGET_WITHSCORES_WITHPAYLOADS'; +import * as SUGGET_WITHSCORES from './SUGGET_WITHSCORES'; +import * as SUGGET from './SUGGET'; +import * as SUGLEN from './SUGLEN'; +import * as SYNDUMP from './SYNDUMP'; +import * as SYNUPDATE from './SYNUPDATE'; +import * as TAGVALS from './TAGVALS'; +import { RedisCommandArguments } from '@redis/client/dist/lib/commands'; + +export default { + _LIST, + _list: _LIST, + AGGREGATE, + aggregate: AGGREGATE, + ALIASADD, + aliasAdd: ALIASADD, + ALIASDEL, + aliasDel: ALIASDEL, + ALIASUPDATE, + aliasUpdate: ALIASUPDATE, + CONFIG_GET, + configGet: CONFIG_GET, + CONFIG_SET, + configSet: CONFIG_SET, + CREATE, + create: CREATE, + DICTADD, + dictAdd: DICTADD, + DICTDEL, + dictDel: DICTDEL, + DICTDUMP, + dictDump: DICTDUMP, + DROPINDEX, + dropIndex: DROPINDEX, + EXPLAIN, + explain: EXPLAIN, + EXPLAINCLI, + explainCli: EXPLAINCLI, + INFO, + info: INFO, + // PROFILE, + // profile: PROFILE, + SEARCH, + search: SEARCH, + SPELLCHECK, + spellCheck: SPELLCHECK, + SUGADD, + sugAdd: SUGADD, + SUGDEL, + sugDel: SUGDEL, + SUGGET_WITHPAYLOADS, + sugGetWithPayloads: SUGGET_WITHPAYLOADS, + SUGGET_WITHSCORES_WITHPAYLOADS, + sugGetWithScoresWithPayloads: SUGGET_WITHSCORES_WITHPAYLOADS, + SUGGET_WITHSCORES, + sugGetWithScores: SUGGET_WITHSCORES, + SUGGET, + sugGet: SUGGET, + SUGLEN, + sugLen: SUGLEN, + SYNDUMP, + synDump: SYNDUMP, + SYNUPDATE, + synUpdate: SYNUPDATE, + TAGVALS, + tagVals: TAGVALS +}; + +export type PropertyName = `${'@' | '$.'}${string}`; + +export type SortByOptions = PropertyName | { + BY: PropertyName; + DIRECTION?: 'ASC' | 'DESC'; +}; + +function pushSortByProperty(args: RedisCommandArguments, sortBy: SortByOptions): void { + if (typeof sortBy === 'string') { + args.push(sortBy); + } else { + args.push(sortBy.BY); + + if (sortBy.DIRECTION) { + args.push(sortBy.DIRECTION); + } + } +} + +export function pushSortByArguments(args: RedisCommandArguments, name: string, sortBy: SortByOptions | Array): RedisCommandArguments { + const lengthBefore = args.push( + name, + '' // will be overwritten + ); + + if (Array.isArray(sortBy)) { + for (const field of sortBy) { + pushSortByProperty(args, field); + } + } else { + pushSortByProperty(args, sortBy); + } + + args[lengthBefore - 1] = (args.length - lengthBefore).toString(); + + return args; +} + +export function pushArgumentsWithLength(args: RedisCommandArguments, fn: (args: RedisCommandArguments) => void): RedisCommandArguments { + const lengthIndex = args.push('') - 1; + fn(args); + args[lengthIndex] = (args.length - lengthIndex - 1).toString(); + return args; +} diff --git a/packages/search/lib/index.ts b/packages/search/lib/index.ts new file mode 100644 index 00000000000..bc0e103e8c8 --- /dev/null +++ b/packages/search/lib/index.ts @@ -0,0 +1 @@ +export { default } from './commands'; diff --git a/packages/search/lib/test-utils.ts b/packages/search/lib/test-utils.ts new file mode 100644 index 00000000000..c68504c21d7 --- /dev/null +++ b/packages/search/lib/test-utils.ts @@ -0,0 +1,21 @@ +import TestUtils from '@redis/test-utils'; +import RediSearch from '.'; + +export default new TestUtils({ + dockerImageName: 'redislabs/redisearch', + dockerImageVersionArgument: 'redisearch-version', + defaultDockerVersion: '2.2.1' +}); + +export const GLOBAL = { + SERVERS: { + OPEN: { + serverArguments: ['--loadmodule /usr/lib/redis/modules/redisearch.so'], + clientOptions: { + modules: { + ft: RediSearch + } + } + } + } +}; diff --git a/packages/search/package.json b/packages/search/package.json new file mode 100644 index 00000000000..dc435cbd364 --- /dev/null +++ b/packages/search/package.json @@ -0,0 +1,24 @@ +{ + "name": "@redis/search", + "version": "1.0.0-rc.0", + "license": "MIT", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "test": "nyc -r text-summary -r html mocha -r source-map-support/register -r ts-node/register './lib/**/*.spec.ts'", + "build": "tsc" + }, + "peerDependencies": { + "@redis/client": "^4.0.0-rc" + }, + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@redis/test-utils": "*", + "@types/node": "^16.11.6", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4" + } +} diff --git a/packages/search/tsconfig.json b/packages/search/tsconfig.json new file mode 100644 index 00000000000..fdb86c004cc --- /dev/null +++ b/packages/search/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig", + "compilerOptions": { + "outDir": "./dist" + }, + "include": [ + "./lib/**/*.ts" + ] +} diff --git a/packages/test-utils/docker/Dockerfile b/packages/test-utils/docker/Dockerfile new file mode 100644 index 00000000000..23fc0b3a517 --- /dev/null +++ b/packages/test-utils/docker/Dockerfile @@ -0,0 +1,9 @@ +ARG IMAGE +FROM ${IMAGE} + +ARG REDIS_ARGUMENTS +ENV REDIS_ARGUMENTS=${REDIS_ARGUMENTS} + +COPY ./entrypoint.sh / + +ENTRYPOINT ["/entrypoint.sh"] diff --git a/packages/test-utils/docker/entrypoint.sh b/packages/test-utils/docker/entrypoint.sh new file mode 100755 index 00000000000..244977e83c4 --- /dev/null +++ b/packages/test-utils/docker/entrypoint.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +echo testststealkshdfklhasdf + +echo $REDIS_ARGUMENTS + +redis-server $REDIS_ARGUMENTS diff --git a/lib/test-utils/dockers.ts b/packages/test-utils/lib/dockers.ts similarity index 90% rename from lib/test-utils/dockers.ts rename to packages/test-utils/lib/dockers.ts index 3e48618ee46..28bd1e49057 100644 --- a/lib/test-utils/dockers.ts +++ b/packages/test-utils/lib/dockers.ts @@ -1,8 +1,9 @@ import { createConnection } from 'net'; import { once } from 'events'; -import { RedisModules, RedisScripts } from '../commands'; -import RedisClient, { RedisClientType } from '../client'; -import { promiseTimeout } from '../utils'; +import { RedisModules, RedisScripts } from '@redis/client/lib/commands'; +import RedisClient, { RedisClientType } from '@redis/client/lib/client'; +import { promiseTimeout } from '@redis/client/lib/utils'; +import path from 'path'; import { promisify } from 'util'; import { exec } from 'child_process'; const execAsync = promisify(exec); @@ -45,11 +46,17 @@ export interface RedisServerDocker { dockerId: string; } +// ".." cause it'll be in `./dist` +const DOCKER_FODLER_PATH = path.join(__dirname, '../docker'); + async function spawnRedisServerDocker({ image, version }: RedisServerDockerConfig, serverArguments: Array): Promise { const port = (await portIterator.next()).value, { stdout, stderr } = await execAsync( - `docker run -d --network host ${image}:${version.join('.')} ` + - `--save --port ${port.toString()} ${serverArguments.join(' ')}` + 'docker run -d --network host $(' + + `docker build ${DOCKER_FODLER_PATH} -q ` + + `--build-arg IMAGE=${image}:${version.join('.')} ` + + `--build-arg REDIS_ARGUMENTS="--save --port ${port.toString()} ${serverArguments.join(' ')}"` + + ')' ); if (!stdout) { diff --git a/lib/test-utils/test-utils.ts b/packages/test-utils/lib/index.ts similarity index 83% rename from lib/test-utils/test-utils.ts rename to packages/test-utils/lib/index.ts index a550e3f707d..d6692cace66 100644 --- a/lib/test-utils/test-utils.ts +++ b/packages/test-utils/lib/index.ts @@ -1,10 +1,18 @@ -import { RedisModules, RedisScripts } from '../commands'; -import RedisClient, { RedisClientOptions, RedisClientType } from '../client'; -import RedisCluster, { RedisClusterOptions, RedisClusterType } from '../cluster'; +import { RedisModules, RedisScripts } from '@redis/client/lib/commands'; +import RedisClient, { RedisClientOptions, RedisClientType } from '@redis/client/lib/client'; +import RedisCluster, { RedisClusterOptions, RedisClusterType } from '@redis/client/lib/cluster'; import { RedisServerDockerConfig, spawnRedisServer, spawnRedisCluster } from './dockers'; import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; +interface TestUtilsConfig { + dockerImageName: string; + dockerImageVersionArgument: string; + defaultDockerVersion: string; + defaultClientOptions?: Partial>; + defaultClusterOptions?: Partial>; +} + interface CommonTestOptions { minimumDockerVersion?: Array; } @@ -20,20 +28,14 @@ interface ClusterTestOptions ext clusterConfiguration?: Partial>; } -interface TestsUtilsConfig { - dockerImageName: string; - dockerImageVersionArgument: string; - defaultDockerVersion: string; -} - -export default class TestUtils { - static #getVersion(config: TestsUtilsConfig): Array { +export default class TestUtils { + static #getVersion(argumentName: string, defaultVersion: string): Array { return yargs(hideBin(process.argv)) - .option('redis-version', { + .option(argumentName, { type: 'string', - default: config.defaultDockerVersion + default: defaultVersion }) - .coerce(config.dockerImageVersionArgument, (arg: string) => { + .coerce(argumentName, (arg: string) => { return arg.split('.').map(x => { const value = Number(x); if (Number.isNaN(value)) { @@ -43,16 +45,16 @@ export default class TestUtils { return value; }); }) - .demandOption(config.dockerImageVersionArgument) - .parseSync()[config.dockerImageVersionArgument]; + .demandOption(argumentName) + .parseSync()[argumentName]; } readonly #DOCKER_IMAGE: RedisServerDockerConfig; - constructor(config: TestsUtilsConfig) { + constructor(config: TestUtilsConfig) { this.#DOCKER_IMAGE = { image: config.dockerImageName, - version: TestUtils.#getVersion(config) + version: TestUtils.#getVersion(config.dockerImageVersionArgument, config.defaultDockerVersion) }; } @@ -84,7 +86,7 @@ export default class TestUtils { title: string, fn: (client: RedisClientType) => Promise, options: ClientTestOptions - ): Mocha.Test { + ): void { let dockerPromise: ReturnType; if (this.isVersionGreaterThan(options.minimumDockerVersion)) { const dockerImage = this.#DOCKER_IMAGE; @@ -96,7 +98,7 @@ export default class TestUtils { }); } - return it(title, async function() { + it(title, async function() { if (!dockerPromise) return this.skip(); const client = RedisClient.create({ @@ -111,10 +113,10 @@ export default class TestUtils { return fn(client); } + await client.connect(); + try { - await client.connect(); await client.flushAll(); - await fn(client); } finally { if (client.isOpen) { @@ -135,7 +137,7 @@ export default class TestUtils { title: string, fn: (cluster: RedisClusterType) => Promise, options: ClusterTestOptions - ): Mocha.Test { + ): void { let dockersPromise: ReturnType; if (this.isVersionGreaterThan(options.minimumDockerVersion)) { const dockerImage = this.#DOCKER_IMAGE; @@ -147,7 +149,7 @@ export default class TestUtils { }); } - return it(title, async function () { + it(title, async function () { if (!dockersPromise) return this.skip(); const dockers = await dockersPromise, diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json new file mode 100644 index 00000000000..0c934ace9fb --- /dev/null +++ b/packages/test-utils/package.json @@ -0,0 +1,27 @@ +{ + "name": "@redis/test-utils", + "private": true, + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "build": "tsc", + "test": "echo \"TODO\"" + }, + "peerDependencies": { + "@redis/client": "^4.0.0-rc" + }, + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@tsconfig/node12": "^1.0.9", + "@types/mocha": "^9.0.0", + "@types/node": "^16.11.6", + "@types/yargs": "^17.0.5", + "mocha": "^9.1.3", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4", + "yargs": "^17.2.1" + } +} diff --git a/packages/test-utils/tsconfig.json b/packages/test-utils/tsconfig.json new file mode 100644 index 00000000000..fdb86c004cc --- /dev/null +++ b/packages/test-utils/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig", + "compilerOptions": { + "outDir": "./dist" + }, + "include": [ + "./lib/**/*.ts" + ] +} diff --git a/tsconfig.json b/tsconfig.json index 1f76310034d..fa46effbdcc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,33 +1,15 @@ { - "extends": "@tsconfig/node12/tsconfig.json", + "extends": "@tsconfig/node12/tsconfig", "compilerOptions": { - "outDir": "./dist", "declaration": true, - "useDefineForClassFields": true, - "allowJs": true + "allowJs": true, + "useDefineForClassFields": true }, "files": [ - "./lib/ts-declarations/cluster-key-slot.d.ts", - "./lib/ts-declarations/redis-parser.d.ts" - ], - "include": [ - "./index.ts", - "./lib/**/*.ts" + "./packages/client/lib/ts-declarations/cluster-key-slot.d.ts", + "./packages/client/lib/ts-declarations/redis-parser.d.ts" ], "ts-node": { "files": true - }, - "typedocOptions": { - "entryPoints": [ - "./index.ts", - "./lib" - ], - "entryPointStrategy": "expand", - "exclude": [ - "./lib/ts-declarations", - "./lib/test-utils.ts" - ], - "theme": "./node_modules/typedoc-github-wiki-theme/dist", - "out": "documentation" } } From 69d98bf39cec2c9b137db30994956a54d6a25dfd Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 9 Nov 2021 10:39:07 -0500 Subject: [PATCH 072/112] fix #1712 - fix LINDEX return type --- packages/client/lib/commands/LINDEX.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/lib/commands/LINDEX.ts b/packages/client/lib/commands/LINDEX.ts index 9a89b41da55..4c283f0912c 100644 --- a/packages/client/lib/commands/LINDEX.ts +++ b/packages/client/lib/commands/LINDEX.ts @@ -6,4 +6,4 @@ export function transformArguments(key: string, element: string): Array return ['LINDEX', key, element]; } -export declare function transformReply(): number | null; +export declare function transformReply(): string | null; From 64df5dc76e94d72188619e4457995df5bc3b96a0 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 9 Nov 2021 12:32:21 -0500 Subject: [PATCH 073/112] uncomment TIME tests --- packages/client/lib/commands/TIME.spec.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/client/lib/commands/TIME.spec.ts b/packages/client/lib/commands/TIME.spec.ts index 1139d18d537..bbaa7942db0 100644 --- a/packages/client/lib/commands/TIME.spec.ts +++ b/packages/client/lib/commands/TIME.spec.ts @@ -10,9 +10,9 @@ describe('TIME', () => { ); }); - // testUtils.testWithClient('client.time', async client => { - // const reply = await client.time(); - // assert.ok(reply instanceof Date); - // assert.ok(typeof reply.microseconds === 'number'); - // }, GLOBAL.SERVERS.OPEN); + testUtils.testWithClient('client.time', async client => { + const reply = await client.time(); + assert.ok(reply instanceof Date); + assert.ok(typeof reply.microseconds === 'number'); + }, GLOBAL.SERVERS.OPEN); }); From cd74f9632eb056ff18afd5e5cc21690990307275 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 9 Nov 2021 13:07:53 -0500 Subject: [PATCH 074/112] use codecov --- .github/workflows/tests.yml | 32 +++++++++++++------------------- packages/client/.nycrc.json | 2 +- packages/client/README.md | 4 ++-- packages/client/package.json | 2 +- packages/json/package.json | 2 +- packages/search/package.json | 2 +- 6 files changed, 19 insertions(+), 25 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 59421208396..2d03fa563f8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -25,6 +25,9 @@ jobs: with: node-version: ${{ matrix.node-version }} + - name: Update npm + run: npm i -g + - name: Install Packages run: npm ci @@ -34,22 +37,13 @@ jobs: - name: Run Tests run: npm run test -- --forbid-only --redis-version=${{ matrix.redis-version }} - - name: Generate lcov - run: ./node_modules/.bin/nyc report -r lcov - - - name: Coveralls - uses: coverallsapp/github-action@1.1.3 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - flag-name: Node ${{ matrix.node-version }} Redis ${{ matrix.redis-version }} - parallel: true - - finish: - needs: tests - runs-on: ubuntu-latest - steps: - - name: Coveralls Finished - uses: coverallsapp/github-action@1.1.3 - with: - github-token: ${{ secrets.github_token }} - parallel-finished: true + - name: Upload to Codecov + run: | + curl https://keybase.io/codecovsecurity/pgp_keys.asc | gpg --no-default-keyring --keyring trustedkeys.gpg --import + curl -Os https://uploader.codecov.io/latest/linux/codecov + curl -Os https://uploader.codecov.io/latest/linux/codecov.SHA256SUM + curl -Os https://uploader.codecov.io/latest/linux/codecov.SHA256SUM.sig + gpgv codecov.SHA256SUM.sig codecov.SHA256SUM + shasum -a 256 -c codecov.SHA256SUM + chmod +x codecov + ./codecov diff --git a/packages/client/.nycrc.json b/packages/client/.nycrc.json index b4e671e178f..dd42463d9cb 100644 --- a/packages/client/.nycrc.json +++ b/packages/client/.nycrc.json @@ -1,4 +1,4 @@ { "extends": "@istanbuljs/nyc-config-typescript", - "exclude": ["**/*.spec.ts", "lib/test-utils.ts"] + "exclude": ["**/*.spec.ts", "lib/test-utils.ts", "examples/*"] } diff --git a/packages/client/README.md b/packages/client/README.md index 813f9830efd..6b136bf48a5 100644 --- a/packages/client/README.md +++ b/packages/client/README.md @@ -6,8 +6,8 @@

- - Coverage Status + + Coverage Downloads diff --git a/packages/client/package.json b/packages/client/package.json index 30be25d26af..1b4124c2eb3 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -5,7 +5,7 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "test": "nyc -r text-summary -r html mocha -r source-map-support/register -r ts-node/register './lib/**/*.spec.ts'", + "test": "nyc -r text-summary -r lcov mocha -r source-map-support/register -r ts-node/register './lib/**/*.spec.ts'", "build": "tsc", "lint": "eslint ./*.ts ./lib/**/*.ts", "documentation": "typedoc" diff --git a/packages/json/package.json b/packages/json/package.json index ebd7f8f76fa..7f53cc0b807 100644 --- a/packages/json/package.json +++ b/packages/json/package.json @@ -5,7 +5,7 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "test": "nyc -r text-summary -r html mocha -r source-map-support/register -r ts-node/register './lib/**/*.spec.ts'", + "test": "nyc -r text-summary -r lcov mocha -r source-map-support/register -r ts-node/register './lib/**/*.spec.ts'", "build": "tsc" }, "peerDependencies": { diff --git a/packages/search/package.json b/packages/search/package.json index dc435cbd364..b44dc8fb528 100644 --- a/packages/search/package.json +++ b/packages/search/package.json @@ -5,7 +5,7 @@ "main": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { - "test": "nyc -r text-summary -r html mocha -r source-map-support/register -r ts-node/register './lib/**/*.spec.ts'", + "test": "nyc -r text-summary -r lcov mocha -r source-map-support/register -r ts-node/register './lib/**/*.spec.ts'", "build": "tsc" }, "peerDependencies": { From 28018caf48998eb2470f57a0bebd26f632d96ce4 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 9 Nov 2021 13:09:35 -0500 Subject: [PATCH 075/112] fix tests.yml --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 2d03fa563f8..e85f7e1fd56 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -26,7 +26,7 @@ jobs: node-version: ${{ matrix.node-version }} - name: Update npm - run: npm i -g + run: npm i -g npm - name: Install Packages run: npm ci From 8b3daad88a70bf5e31c2a8e80d5f3000d0d2660c Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 9 Nov 2021 13:38:08 -0500 Subject: [PATCH 076/112] uncomment "should handle live resharding" test --- packages/client/lib/cluster/index.spec.ts | 71 ++++++++++++----------- packages/test-utils/lib/index.ts | 6 +- 2 files changed, 41 insertions(+), 36 deletions(-) diff --git a/packages/client/lib/cluster/index.spec.ts b/packages/client/lib/cluster/index.spec.ts index 43492a6500f..a4c4489ee7b 100644 --- a/packages/client/lib/cluster/index.spec.ts +++ b/packages/client/lib/cluster/index.spec.ts @@ -47,47 +47,48 @@ describe('Cluster', () => { } }); - // testUtils.testWithCluster('should handle live resharding', async cluster => { - // const key = 'key', - // value = 'value'; - // await cluster.set(key, value); + testUtils.testWithCluster('should handle live resharding', async cluster => { + const key = 'key', + value = 'value'; + await cluster.set(key, value); - // const slot = calculateSlot(key), - // from = cluster.getSlotMaster(slot), - // to = cluster.getMasters().find(node => node.id !== from.id); + const slot = calculateSlot(key), + from = cluster.getSlotMaster(slot), + to = cluster.getMasters().find(node => node.id !== from.id); - // await to!.client.clusterSetSlot(slot, ClusterSlotStates.IMPORTING, from.id); + await to!.client.clusterSetSlot(slot, ClusterSlotStates.IMPORTING, from.id); - // // should be able to get the key from the original node before it was migrated - // assert.equal( - // await cluster.get(key), - // value - // ); + // should be able to get the key from the original node before it was migrated + assert.equal( + await cluster.get(key), + value + ); - // await from.client.clusterSetSlot(slot, ClusterSlotStates.MIGRATING, to!.id); + await from.client.clusterSetSlot(slot, ClusterSlotStates.MIGRATING, to!.id); - // // should be able to get the key from the original node using the "ASKING" command - // assert.equal( - // await cluster.get(key), - // value - // ); + // should be able to get the key from the original node using the "ASKING" command + assert.equal( + await cluster.get(key), + value + ); - // const { port: toPort } = to!.client.options!.socket; + const { port: toPort } = to!.client.options!.socket; - // await from.client.migrate( - // '127.0.0.1', - // toPort, - // key, - // 0, - // 10 - // ); + await from.client.migrate( + '127.0.0.1', + toPort, + key, + 0, + 10 + ); - // // should be able to get the key from the new node - // assert.equal( - // await cluster.get(key), - // value - // ); - // }, { - // serverArguments: [] - // }); + // should be able to get the key from the new node + assert.equal( + await cluster.get(key), + value + ); + }, { + serverArguments: [], + numberOfNodes: 2 + }); }); diff --git a/packages/test-utils/lib/index.ts b/packages/test-utils/lib/index.ts index d6692cace66..f9a1fc1dbd9 100644 --- a/packages/test-utils/lib/index.ts +++ b/packages/test-utils/lib/index.ts @@ -26,6 +26,7 @@ interface ClientTestOptions exte interface ClusterTestOptions extends CommonTestOptions { serverArguments: Array; clusterConfiguration?: Partial>; + numberOfNodes?: number; } export default class TestUtils { @@ -144,7 +145,10 @@ export default class TestUtils { before(function () { this.timeout(30000); - dockersPromise = spawnRedisCluster(dockerImage, options.serverArguments); + dockersPromise = spawnRedisCluster({ + ...dockerImage, + numberOfNodes: options?.numberOfNodes + }, options.serverArguments); return dockersPromise; }); } From ab339d396a32e988a80f5ba71d999530d8ad064d Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 9 Nov 2021 18:07:26 -0500 Subject: [PATCH 077/112] fix #1714 - update README(s) --- README.md | 302 +- {packages/client/docs => docs}/FAQ.md | 0 .../docs => docs}/client-configuration.md | 0 {packages/client/docs => docs}/clustering.md | 0 .../docs => docs}/isolated-execution.md | 0 {packages/client/docs => docs}/v3-to-v4.md | 0 examples/.gitignore | 1 + .../client/examples => examples}/README.md | 10 +- .../blocking-list-pop.js | 0 .../command-with-modifiers.js | 19 +- .../connect-as-acl-user.js | 0 .../examples => examples}/lua-multi-incr.js | 0 .../client/examples => examples}/package.json | 5 +- examples/search+json.js | 76 + .../client/examples => examples}/set-scan.js | 0 package-lock.json | 11351 ---------------- packages/all-in-one/index.ts | 3 + packages/all-in-one/package.json | 4 +- packages/client/LICENSE | 24 - packages/client/README.md | 294 - packages/client/examples/package-lock.json | 87 - packages/client/package.json | 2 +- packages/json/lib/commands/GET.ts | 2 +- packages/json/package.json | 2 +- packages/search/lib/commands/CREATE.spec.ts | 23 +- packages/search/lib/commands/CREATE.ts | 42 +- packages/search/lib/commands/SEARCH.spec.ts | 3 +- packages/search/lib/commands/SEARCH.ts | 6 +- packages/search/lib/commands/index.ts | 28 + packages/search/lib/index.ts | 3 + packages/search/package.json | 2 +- packages/test-utils/lib/dockers.ts | 6 +- packages/test-utils/lib/index.ts | 6 +- packages/test-utils/package.json | 2 +- 34 files changed, 461 insertions(+), 11842 deletions(-) rename {packages/client/docs => docs}/FAQ.md (100%) rename {packages/client/docs => docs}/client-configuration.md (100%) rename {packages/client/docs => docs}/clustering.md (100%) rename {packages/client/docs => docs}/isolated-execution.md (100%) rename {packages/client/docs => docs}/v3-to-v4.md (100%) create mode 100644 examples/.gitignore rename {packages/client/examples => examples}/README.md (95%) rename {packages/client/examples => examples}/blocking-list-pop.js (100%) rename {packages/client/examples => examples}/command-with-modifiers.js (80%) rename {packages/client/examples => examples}/connect-as-acl-user.js (100%) rename {packages/client/examples => examples}/lua-multi-incr.js (100%) rename {packages/client/examples => examples}/package.json (64%) create mode 100644 examples/search+json.js rename {packages/client/examples => examples}/set-scan.js (100%) delete mode 100644 package-lock.json delete mode 100644 packages/client/LICENSE delete mode 100644 packages/client/README.md delete mode 100644 packages/client/examples/package-lock.json diff --git a/README.md b/README.md index 35648bd72ef..b5894f6f708 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,304 @@ -# Node-Redis monorpo +

+ + + +

Node Redis

+

-### Clients + -| Name | Description | -|------------------------------------|-------------| -| [redis](./packages/all-in-one) | | -| [@redis/client](./packages/client) | | +--- -### [Modules](https://redis.io/modules) +## Installation + +```bash +npm install redis@next +``` + +> :warning: The new interface is clean and cool, but if you have an existing code base, you'll want to read the [migration guide](./docs/v3-to-v4.md). + +## Usage + +### Basic Example + +```typescript +import { createClient } from 'redis'; + +(async () => { + const client = createClient(); + + client.on('error', (err) => console.log('Redis Client Error', err)); + + await client.connect(); + + await client.set('key', 'value'); + const value = await client.get('key'); +})(); +``` + +The above code connects to localhost on port 6379. To connect to a different host or port, use a connection string in the format `redis[s]://[[username][:password]@][host][:port][/db-number]`: + +```typescript +createClient({ + url: 'redis://alice:foobared@awesome.redis.server:6380' +}); +``` + +You can also use discrete parameters, UNIX sockets, and even TLS to connect. Details can be found in the [client configuration guide](./docs/client-configuration.md). + +### Redis Commands + +There is built-in support for all of the [out-of-the-box Redis commands](https://redis.io/commands). They are exposed using the raw Redis command names (`HSET`, `HGETALL`, etc.) and a friendlier camel-cased version (`hSet`, `hGetAll`, etc.): + +```typescript +// raw Redis commands +await client.HSET('key', 'field', 'value'); +await client.HGETALL('key'); + +// friendly JavaScript commands +await client.hSet('key', 'field', 'value'); +await client.hGetAll('key'); +``` + +Modifiers to commands are specified using a JavaScript object: + +```typescript +await client.set('key', 'value', { + EX: 10, + NX: true +}); +``` + +Replies will be transformed into useful data structures: + +```typescript +await client.hGetAll('key'); // { field1: 'value1', field2: 'value2' } +await client.hVals('key'); // ['value1', 'value2'] +``` + +### Unsupported Redis Commands + +If you want to run commands and/or use arguments that Node Redis doesn't know about (yet!) use `.sendCommand()`: + +```typescript +await client.sendCommand(['SET', 'key', 'value', 'NX']); // 'OK' + +await client.sendCommand(['HGETALL', 'key']); // ['key1', 'field1', 'key2', 'field2'] +``` + +### Transactions (Multi/Exec) + +Start a [transaction](https://redis.io/topics/transactions) by calling `.multi()`, then chaining your commands. When you're done, call `.exec()` and you'll get an array back with your results: + +```typescript +await client.set('another-key', 'another-value'); + +const [setKeyReply, otherKeyValue] = await client + .multi() + .set('key', 'value') + .get('another-key') + .exec(); // ['OK', 'another-value'] +``` + +You can also [watch](https://redis.io/topics/transactions#optimistic-locking-using-check-and-set) keys by calling `.watch()`. Your transaction will abort if any of the watched keys change. + +To dig deeper into transactions, check out the [Isolated Execution Guide](./docs/isolated-execution.md). + +### Blocking Commands + +Any command can be run on a new connection by specifying the `isolated` option. The newly created connection is closed when the command's `Promise` is fulfilled. + +This pattern works especially well for blocking commands—such as `BLPOP` and `BLMOVE`: + +```typescript +import { commandOptions } from 'redis'; + +const blPopPromise = client.blPop(commandOptions({ isolated: true }), 'key', 0); + +await client.lPush('key', ['1', '2']); + +await blPopPromise; // '2' +``` + +To learn more about isolated execution, check out the [guide](./docs/isolated-execution.md). + +### Pub/Sub + +Subscribing to a channel requires a dedicated stand-alone connection. You can easily get one by `.duplicate()`ing an existing Redis connection. + +```typescript +const subscriber = client.duplicate(); + +await subscriber.connect(); +``` + +Once you have one, simply subscribe and unsubscribe as needed: + +```typescript +await subscriber.subscribe('channel', (message) => { + console.log(message); // 'message' +}); + +await subscriber.pSubscribe('channe*', (message, channel) => { + console.log(message, channel); // 'message', 'channel' +}); + +await subscriber.unsubscribe('channel'); + +await subscriber.pUnsubscribe('channe*'); +``` + +Publish a message on a channel: + +```typescript +await publisher.publish('channel', 'message'); +``` + +### Scan Iterator + +[`SCAN`](https://redis.io/commands/scan) results can be looped over using [async iterators](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator): + +```typescript +for await (const key of client.scanIterator()) { + // use the key! + await client.get(key); +} +``` + +This works with `HSCAN`, `SSCAN`, and `ZSCAN` too: + +```typescript +for await (const { field, value } of client.hScanIterator('hash')) {} +for await (const member of client.sScanIterator('set')) {} +for await (const { score, member } of client.zScanIterator('sorted-set')) {} +``` + +You can override the default options by providing a configuration object: + +```typescript +client.scanIterator({ + TYPE: 'string', // `SCAN` only + MATCH: 'patter*', + COUNT: 100 +}); +``` + +### Lua Scripts + +Define new functions using [Lua scripts](https://redis.io/commands/eval) which execute on the Redis server: + +```typescript +import { createClient, defineScript } from 'redis'; + +(async () => { + const client = createClient({ + scripts: { + add: defineScript({ + NUMBER_OF_KEYS: 1, + SCRIPT: + 'local val = redis.pcall("GET", KEYS[1]);' + + 'return val + ARGV[1];', + transformArguments(key: string, toAdd: number): Array { + return [key, toAdd.toString()]; + }, + transformReply(reply: number): number { + return reply; + } + }) + } + }); + + await client.connect(); + + await client.set('key', '1'); + await client.add('key', 2); // 3 +})(); +``` + +### Disconnecting + +There are two functions that disconnect a client from the Redis server. In most scenarios you should use `.quit()` to ensure that pending commands are sent to Redis before closing a connection. + +#### `.QUIT()`/`.quit()` + +Gracefully close a client's connection to Redis, by sending the [`QUIT`](https://redis.io/commands/quit) command to the server. Before quitting, the client executes any remaining commands in its queue, and will receive replies from Redis for each of them. + +```typescript +const [ping, get, quit] = await Promise.all([ + client.ping(), + client.get('key'), + client.quit() +]); // ['PONG', null, 'OK'] + +try { + await client.get('key'); +} catch (err) { + // ClosedClient Error +} +``` + +#### `.disconnect()` + +Forcibly close a client's connection to Redis immediately. Calling `disconnect` will not send further pending commands to the Redis server, or wait for or parse outstanding responses. + +```typescript +await client.disconnect(); +``` + +### Auto-Pipelining + +Node Redis will automatically pipeline requests that are made during the same "tick". + +```typescript +client.set('Tm9kZSBSZWRpcw==', 'users:1'); +client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw=='); +``` + +Of course, if you don't do something with your Promises you're certain to get [unhandled Promise exceptions](https://nodejs.org/api/process.html#process_event_unhandledrejection). To take advantage of auto-pipelining and handle your Promises, use `Promise.all()`. + +```typescript +await Promise.all([ + client.set('Tm9kZSBSZWRpcw==', 'users:1'), + client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw==') +]); +``` + +### Clustering + +Check out the [Clustering Guide](./docs/clustering.md) when using Node Redis to connect to a Redis Cluster. + +## Supported Redis versions + +Node Redis is supported with the following versions of Redis: + +| Version | Supported | +|---------|--------------------| +| 6.2.z | :heavy_check_mark: | +| 6.0.z | :heavy_check_mark: | +| 5.y.z | :heavy_check_mark: | +| < 5.0 | :x: | + +> Node Redis should work with older versions of Redis, but it is not fully tested and we cannot offer support. + +## Packages | Name | Description | |------------------------------------|------------------------------------------------------------| +| [redis](./packages/all-in-one) | | +| [@redis/client](./packages/client) | | | [@redis/json](./packages/json) | [Redis JSON](https://oss.redis.com/redisjson/) commands | | [@redis/search](./packages/search) | [Redis Search](https://oss.redis.com/redisearch/) commands | diff --git a/packages/client/docs/FAQ.md b/docs/FAQ.md similarity index 100% rename from packages/client/docs/FAQ.md rename to docs/FAQ.md diff --git a/packages/client/docs/client-configuration.md b/docs/client-configuration.md similarity index 100% rename from packages/client/docs/client-configuration.md rename to docs/client-configuration.md diff --git a/packages/client/docs/clustering.md b/docs/clustering.md similarity index 100% rename from packages/client/docs/clustering.md rename to docs/clustering.md diff --git a/packages/client/docs/isolated-execution.md b/docs/isolated-execution.md similarity index 100% rename from packages/client/docs/isolated-execution.md rename to docs/isolated-execution.md diff --git a/packages/client/docs/v3-to-v4.md b/docs/v3-to-v4.md similarity index 100% rename from packages/client/docs/v3-to-v4.md rename to docs/v3-to-v4.md diff --git a/examples/.gitignore b/examples/.gitignore new file mode 100644 index 00000000000..d8b83df9cdb --- /dev/null +++ b/examples/.gitignore @@ -0,0 +1 @@ +package-lock.json diff --git a/packages/client/examples/README.md b/examples/README.md similarity index 95% rename from packages/client/examples/README.md rename to examples/README.md index 2b8fbec9277..9b285315219 100644 --- a/packages/client/examples/README.md +++ b/examples/README.md @@ -21,7 +21,7 @@ To set up the examples folder so that you can run an example / develop one of yo ``` $ git clone https://github.com/redis/node-redis.git $ cd node-redis -$ npm install && npm run build +$ npm install -ws && npm run build $ cd examples $ npm install ``` @@ -62,13 +62,13 @@ Here's a starter template for adding a new example, imagine this is stored in `d import { createClient } from 'redis'; async function doSomething() { - const client = createClient(); + const client = createClient(); - await client.connect(); + await client.connect(); - // Add your example code here... + // Add your example code here... - await client.quit(); + await client.quit(); } doSomething(); diff --git a/packages/client/examples/blocking-list-pop.js b/examples/blocking-list-pop.js similarity index 100% rename from packages/client/examples/blocking-list-pop.js rename to examples/blocking-list-pop.js diff --git a/packages/client/examples/command-with-modifiers.js b/examples/command-with-modifiers.js similarity index 80% rename from packages/client/examples/command-with-modifiers.js rename to examples/command-with-modifiers.js index 2932aec0d64..78b1d2e3d2f 100644 --- a/packages/client/examples/command-with-modifiers.js +++ b/examples/command-with-modifiers.js @@ -10,19 +10,18 @@ async function commandWithModifiers() { await client.del('mykey'); let result = await client.set('mykey', 'myvalue', { - EX: 60, - GET: true - } - ); - + EX: 60, + GET: true + }); + console.log(result); //nil result = await client.set('mykey', 'newvalue', { - EX: 60, - GET: true - } - ); - + EX: 60, + GET: true + } + ); + console.log(result); //myvalue await client.quit(); diff --git a/packages/client/examples/connect-as-acl-user.js b/examples/connect-as-acl-user.js similarity index 100% rename from packages/client/examples/connect-as-acl-user.js rename to examples/connect-as-acl-user.js diff --git a/packages/client/examples/lua-multi-incr.js b/examples/lua-multi-incr.js similarity index 100% rename from packages/client/examples/lua-multi-incr.js rename to examples/lua-multi-incr.js diff --git a/packages/client/examples/package.json b/examples/package.json similarity index 64% rename from packages/client/examples/package.json rename to examples/package.json index edb8cdacdb2..452d88cbe5d 100644 --- a/packages/client/examples/package.json +++ b/examples/package.json @@ -4,6 +4,9 @@ "description": "node-redis 4 example script", "main": "index.js", "private": true, - "type": "module" + "type": "module", + "dependencies": { + "redis": "../packages/all-in-one" + } } diff --git a/examples/search+json.js b/examples/search+json.js new file mode 100644 index 00000000000..43eaa2a158d --- /dev/null +++ b/examples/search+json.js @@ -0,0 +1,76 @@ +// RediSearch & ReJSON example + +import { createClient, SchemaFieldTypes, AggregateGroupByReducers, AggregateSteps } from 'redis'; + +async function searchPlusJson() { + const client = createClient(); + + await client.connect(); + + await client.flushAll(); + + // Create an index + await client.ft.create('users', { + '$.name': { + type: SchemaFieldTypes.TEXT, + SORTABLE: 'UNF' + }, + '$.age': SchemaFieldTypes.NUMERIC, + '$.coins': SchemaFieldTypes.NUMERIC + }, { + ON: 'JSON' + }); + + // Add some users + await Promise.all([ + client.json.set('users:1', '$', { + name: 'Alice', + age: 32, + coins: 100 + }), + client.json.set('users:2', '$', { + name: 'Bob', + age: 23, + coins: 15 + }) + ]); + + // Search all users under 30 + // TODO: why "$.age:[-inf, 30]" does not work? + console.log( + await client.ft.search('users', '*') + ); + // { + // total: 1, + // documents: [...] + // } + + // Some aggrigrations + console.log( + await client.ft.aggregate('users', '*', { + STEPS: [{ + type: AggregateSteps.GROUPBY, + REDUCE: [{ + type: AggregateGroupByReducers.AVG, + property: '$.age', + AS: 'avarageAge' + }, { + type: AggregateGroupByReducers.SUM, + property: '$.coins', + AS: 'totalCoins' + }] + }] + }) + ); + // { + // total: 2, + // results: [{ + // avarageAvg: '27.5', + // totalCoins: '115' + // }] + // } + + await client.quit(); +} + +searchPlusJson(); diff --git a/packages/client/examples/set-scan.js b/examples/set-scan.js similarity index 100% rename from packages/client/examples/set-scan.js rename to examples/set-scan.js diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 87ae980524c..00000000000 --- a/package-lock.json +++ /dev/null @@ -1,11351 +0,0 @@ -{ - "name": "redis-monorepo", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "redis-monorepo", - "workspaces": [ - "./packages/*" - ], - "devDependencies": { - "@tsconfig/node12": "^1.0.9" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz", - "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", - "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helpers": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.0.tgz", - "integrity": "sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", - "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", - "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", - "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", - "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", - "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", - "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", - "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", - "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", - "dev": true, - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", - "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.0.tgz", - "integrity": "sha512-dVRM0StFMdKlkt7cVcGgwD8UMaBfWJHl3A83Yfs8GQ3MO0LHIIIMvK7Fa0RGOGUQ10qikLaX6D7o5htcQWgTMQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.16.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.2.tgz", - "integrity": "sha512-RUVpT0G2h6rOZwqLDTrKk7ksNv7YpAilTnYe1/Q+eDjxEceRMKVWbCsX7t8h6C1qCFi/1Y8WZjcEPBAFG27GPw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.0.tgz", - "integrity": "sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/@cspotcode/source-map-support": { - "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" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", - "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.0.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/nyc-config-typescript": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.1.tgz", - "integrity": "sha512-/gz6LgVpky205LuoOfwEZmnUtaSmdk0QIMcNFj9OvxhiMhPpKftMgZmGN7jNj7jR+lr8IB1Yks3QSSSNSxfoaQ==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "nyc": ">=15", - "source-map-support": "*", - "ts-node": "*" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3" - } - }, - "node_modules/@octokit/core": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.5.1.tgz", - "integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==", - "dev": true, - "dependencies": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.0", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", - "dev": true, - "dependencies": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/openapi-types": { - "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.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.34.0" - }, - "peerDependencies": { - "@octokit/core": ">=2" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "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.34.0", - "deprecation": "^2.3.1" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/request": { - "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", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.1", - "universal-user-agent": "^6.0.0" - } - }, - "node_modules/@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "node_modules/@octokit/rest": { - "version": "18.10.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.10.0.tgz", - "integrity": "sha512-esHR5OKy38bccL/sajHqZudZCvmv4yjovMJzyXlphaUo7xykmtOdILGJ3aAm0mFHmMLmPFmDMJXf39cAjNJsrw==", - "dev": true, - "dependencies": { - "@octokit/core": "^3.5.1", - "@octokit/plugin-paginate-rest": "^2.16.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^5.9.0" - } - }, - "node_modules/@octokit/types": { - "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": "^11.2.0" - } - }, - "node_modules/@redis/client": { - "resolved": "packages/client", - "link": true - }, - "node_modules/@redis/json": { - "resolved": "packages/json", - "link": true - }, - "node_modules/@redis/search": { - "resolved": "packages/search", - "link": true - }, - "node_modules/@redis/test-utils": { - "resolved": "packages/test-utils", - "link": true - }, - "node_modules/@redis/time-series": { - "resolved": "packages/time-series", - "link": true - }, - "node_modules/@sindresorhus/is": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", - "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", - "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", - "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/mocha": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", - "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "16.11.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", - "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/sinon": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.6.tgz", - "integrity": "sha512-6EF+wzMWvBNeGrfP3Nx60hhx+FfwSg1JJBLAAP/IdIUq0EYkqCYf70VT3PhuhPX9eLD+Dp+lNdpb/ZeHG8Yezg==", - "dev": true, - "dependencies": { - "@sinonjs/fake-timers": "^7.1.0" - } - }, - "node_modules/@types/yallist": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/yallist/-/yallist-4.0.1.tgz", - "integrity": "sha512-G3FNJfaYtN8URU6wd6+uwFI62KO79j7n3XTYcwcFncP8gkfoi0b821GoVVt0oqKVnCqKYOMNKIGpakPoFhzAGA==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "17.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.5.tgz", - "integrity": "sha512-4HNq144yhaVjJs+ON6A07NEoi9Hh0Rhl/jI9Nt/l/YRjt+T6St/QK3meFARWZ8IgkzoD1LC0PdTdJenlQQi2WQ==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.3.1.tgz", - "integrity": "sha512-cFImaoIr5Ojj358xI/SDhjog57OK2NqlpxwdcgyxDA3bJlZcJq5CPzUXtpD7CxI2Hm6ATU7w5fQnnkVnmwpHqw==", - "dev": true, - "dependencies": { - "@typescript-eslint/experimental-utils": "5.3.1", - "@typescript-eslint/scope-manager": "5.3.1", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.1.tgz", - "integrity": "sha512-RgFn5asjZ5daUhbK5Sp0peq0SSMytqcrkNfU4pnDma2D8P3ElZ6JbYjY8IMSFfZAJ0f3x3tnO3vXHweYg0g59w==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.3.1", - "@typescript-eslint/types": "5.3.1", - "@typescript-eslint/typescript-estree": "5.3.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.3.1.tgz", - "integrity": "sha512-TD+ONlx5c+Qhk21x9gsJAMRohWAUMavSOmJgv3JGy9dgPhuBd5Wok0lmMClZDyJNLLZK1JRKiATzCKZNUmoyfw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.3.1", - "@typescript-eslint/types": "5.3.1", - "@typescript-eslint/typescript-estree": "5.3.1", - "debug": "^4.3.2" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.3.1.tgz", - "integrity": "sha512-XksFVBgAq0Y9H40BDbuPOTUIp7dn4u8oOuhcgGq7EoDP50eqcafkMVGrypyVGvDYHzjhdUCUwuwVUK4JhkMAMg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.3.1", - "@typescript-eslint/visitor-keys": "5.3.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.1.tgz", - "integrity": "sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.3.1.tgz", - "integrity": "sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.3.1", - "@typescript-eslint/visitor-keys": "5.3.1", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.1.tgz", - "integrity": "sha512-3cHUzUuVTuNHx0Gjjt5pEHa87+lzyqOiHXy/Gz+SJOCW1mpw9xQHIIEwnKn+Thph1mgWyZ90nboOcSuZr/jTTQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.3.1", - "eslint-visitor-keys": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-align": { - "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": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "dev": true, - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/before-after-hook": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", - "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz", - "integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30001274", - "electron-to-chromium": "^1.3.886", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001278", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001278.tgz", - "integrity": "sha512-mpF9KeH8u5cMoEmIic/cr7PNS+F5LWBk0t2ekGT60lFf0Wq+n9LspAj0g3P+o7DQhD3sUdlMln4YFAWhFYn9jg==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", - "dev": true - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "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" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - } - }, - "node_modules/cluster-key-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz", - "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "dev": true, - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/deprecated-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deprecated-obj/-/deprecated-obj-2.0.0.tgz", - "integrity": "sha512-CkdywZC2rJ8RGh+y3MM1fw1EJ4oO/oNExGbRFv0AQoMS+faTd3nO7slYjkj/6t8OnIMUE+wxh6G97YHhK1ytrw==", - "dev": true, - "dependencies": { - "flat": "^5.0.2", - "lodash": "^4.17.20" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.3.891", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.891.tgz", - "integrity": "sha512-3cpwR82QkIS01CN/dup/4Yr3BiOiRLlZlcAFn/5FbNCunMO9ojqDgEP9JEo1QNLflu3pEnPWve50gHOEKc7r6w==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.2.0.tgz", - "integrity": "sha512-erw7XmM+CLxTOickrimJ1SiF55jiNlVSp2qqm0NuBWPtHYQCegD5ZMaW0c3i5ytPqL+SSLaCxdvQXFPLJn+ABw==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.0.4", - "@humanwhocodes/config-array": "^0.6.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^6.0.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.2.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", - "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/espree": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", - "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", - "dev": true, - "dependencies": { - "acorn": "^8.5.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", - "dev": true - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/generic-pool": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz", - "integrity": "sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/git-up": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.5.tgz", - "integrity": "sha512-YUvVDg/vX3d0syBsk/CKUTib0srcQME0JyHkL5BaYdwLsiCslPWmDSi8PUMo9pXYjrryMcmsCoCgsTpSCJEQaA==", - "dev": true, - "dependencies": { - "is-ssh": "^1.3.0", - "parse-url": "^6.0.0" - } - }, - "node_modules/git-url-parse": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.6.0.tgz", - "integrity": "sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g==", - "dev": true, - "dependencies": { - "git-up": "^4.0.0" - } - }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "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/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/got": { - "version": "11.8.2", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz", - "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.1", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", - "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", - "dev": true, - "dependencies": { - "import-from": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-from/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/inquirer": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.5.tgz", - "integrity": "sha512-G6/9xUqmt/r+UvufSyrPpt84NYwhKZ9jLsgMbQzlx804XErNupor8WQdBnBRrXmBfTPpuwf1sV+ss2ovjgdXIg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.2.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-ci": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", - "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.1.1" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "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" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-ssh": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.3.tgz", - "integrity": "sha512-NKzJmQzJfEEma3w5cJNcUMxoXfDjz0Zj0eyCalHn2E6VOwlzjZo0yuO2fcBSf8zhFuVCL/82/r5gRcoi6aEPVQ==", - "dev": true, - "dependencies": { - "protocols": "^1.1.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", - "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", - "dev": true - }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "node_modules/keyv": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz", - "integrity": "sha512-vqNHbAc8BBsxk+7QBYLW0Y219rWcClspR6WSeoHYKG5mnsSoOH+BL1pWq02DDCVdvvuUny5rkBlzMRzoqc+GIg==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "node_modules/macos-release": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", - "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/marked": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", - "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", - "dev": true, - "bin": { - "marked": "bin/marked" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", - "dev": true, - "dependencies": { - "mime-db": "1.49.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "node_modules/mocha": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", - "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", - "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.2", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.7", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "3.0.4", - "ms": "2.1.3", - "nanoid": "3.1.25", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.1.5", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/mocha/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "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/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/nanoid": { - "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" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/new-github-release-url": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-1.0.0.tgz", - "integrity": "sha512-dle7yf655IMjyFUqn6Nxkb18r4AOAkzRcgcZv6WZ0IqrOH4QCEZ8Sm6I7XX21zvHdBeeMeTkhR9qT2Z0EJDx6A==", - "dev": true, - "dependencies": { - "type-fest": "^0.4.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/new-github-release-url/node_modules/type-fest": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", - "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/nise": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", - "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^7.0.4", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/nyc/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nyc/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/onigasm": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz", - "integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==", - "dev": true, - "dependencies": { - "lru-cache": "^5.1.1" - } - }, - "node_modules/onigasm/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/onigasm/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-name": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", - "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", - "dev": true, - "dependencies": { - "macos-release": "^2.5.0", - "windows-release": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json/node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json/node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json/node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/package-json/node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "node_modules/package-json/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json/node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/package-json/node_modules/got/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/package-json/node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "node_modules/package-json/node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/package-json/node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json/node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/package-json/node_modules/responselike/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-path": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.3.tgz", - "integrity": "sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA==", - "dev": true, - "dependencies": { - "is-ssh": "^1.3.0", - "protocols": "^1.4.0", - "qs": "^6.9.4", - "query-string": "^6.13.8" - } - }, - "node_modules/parse-url": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-6.0.0.tgz", - "integrity": "sha512-cYyojeX7yIIwuJzledIHeLUBVJ6COVLeT4eF+2P6aKVzwvgKQPndCBv3+yQ7pcWjqToYwaligxzSYNNmGoMAvw==", - "dev": true, - "dependencies": { - "is-ssh": "^1.3.0", - "normalize-url": "^6.1.0", - "parse-path": "^4.0.0", - "protocols": "^1.4.0" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "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", - "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/query-string": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", - "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", - "dev": true, - "dependencies": { - "decode-uri-component": "^0.2.0", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/redis": { - "resolved": "packages/all-in-one", - "link": true - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/release-it": { - "version": "14.11.6", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.11.6.tgz", - "integrity": "sha512-6BNcuzFZHThBUBJ/xYw/bxZ+58CAwrwf1zgmjq2Ibl3nlDZbjphHG6iqxkJu7mZ8TIWs6NjloEAhqpjeXoN//Q==", - "dev": true, - "dependencies": { - "@iarna/toml": "2.2.5", - "@octokit/rest": "18.10.0", - "async-retry": "1.3.3", - "chalk": "4.1.2", - "cosmiconfig": "7.0.1", - "debug": "4.3.2", - "deprecated-obj": "2.0.0", - "execa": "5.1.1", - "form-data": "4.0.0", - "git-url-parse": "11.6.0", - "globby": "11.0.4", - "got": "11.8.2", - "import-cwd": "3.0.0", - "inquirer": "8.1.5", - "is-ci": "3.0.0", - "lodash": "4.17.21", - "mime-types": "2.1.32", - "new-github-release-url": "1.0.0", - "open": "7.4.2", - "ora": "5.4.1", - "os-name": "4.0.1", - "parse-json": "5.2.0", - "semver": "7.3.5", - "shelljs": "0.8.4", - "update-notifier": "5.1.0", - "url-join": "4.0.1", - "uuid": "8.3.2", - "yaml": "1.10.2", - "yargs-parser": "20.2.9" - }, - "bin": { - "release-it": "bin/release-it.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/release-it/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/release-it/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "dev": true, - "dependencies": { - "lowercase-keys": "^2.0.0" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "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" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", - "dev": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/shiki": { - "version": "0.9.12", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.12.tgz", - "integrity": "sha512-VXcROdldv0/Qu0w2XvzU4IrvTeBNs/Kj/FCmtcEXGz7Tic/veQzliJj6tEiAgoKianhQstpYmbPDStHU5Opqcw==", - "dev": true, - "dependencies": { - "jsonc-parser": "^3.0.0", - "onigasm": "^2.2.5", - "vscode-textmate": "5.2.0" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "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": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", - "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^7.1.2", - "@sinonjs/samsam": "^6.0.2", - "diff": "^5.0.0", - "nise": "^5.1.0", - "supports-color": "^7.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/string-width": { - "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.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "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.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "node_modules/ts-node": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", - "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "0.7.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typedoc": { - "version": "0.22.8", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.8.tgz", - "integrity": "sha512-92S+YzyhospdXN5rnkYUTgirdTYqNWY7NP9vco+IqQQoiSXzVSUsawVro+tMyEEsWUS7EMaJ2YOjB9uE0CBi6A==", - "dev": true, - "dependencies": { - "glob": "^7.2.0", - "lunr": "^2.3.9", - "marked": "^3.0.8", - "minimatch": "^3.0.4", - "shiki": "^0.9.12" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 12.10.0" - }, - "peerDependencies": { - "typescript": "4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x" - } - }, - "node_modules/typedoc-github-wiki-theme": { - "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.22.0", - "typedoc-plugin-markdown": ">=3.11.0" - } - }, - "node_modules/typedoc-plugin-markdown": { - "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.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": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", - "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uglify-js": { - "version": "3.14.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz", - "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - }, - "node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/update-notifier/node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true - }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/vscode-textmate": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", - "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", - "dev": true - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/windows-release": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", - "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", - "dev": true, - "dependencies": { - "execa": "^4.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/windows-release/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "node_modules/workerpool": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", - "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", - "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/all-in-one": { - "name": "redis", - "version": "4.0.0-rc.3", - "license": "MIT", - "dependencies": { - "@redis/client": "^4.0.0-rc", - "@redis/json": "^1.0.0-rc", - "@redis/search": "^1.0.0-rc" - }, - "devDependencies": { - "release-it": "^14.11.6", - "typescript": "^4.4.4" - } - }, - "packages/client": { - "name": "@redis/client", - "version": "4.0.0-rc.3", - "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", - "@redis/test-utils": "*", - "@types/node": "^16.11.6", - "@types/sinon": "^10.0.6", - "@types/yallist": "^4.0.1", - "@typescript-eslint/eslint-plugin": "^5.2.0", - "@typescript-eslint/parser": "^5.2.0", - "eslint": "^8.1.0", - "nyc": "^15.1.0", - "release-it": "^14.11.6", - "sinon": "^11.1.2", - "source-map-support": "^0.5.20", - "ts-node": "^10.4.0", - "typedoc": "^0.22.7", - "typedoc-github-wiki-theme": "^0.6.0", - "typedoc-plugin-markdown": "^3.11.3", - "typescript": "^4.4.4" - }, - "engines": { - "node": ">=12" - } - }, - "packages/json": { - "name": "@redis/json", - "version": "1.0.0-rc.0", - "license": "MIT", - "devDependencies": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@redis/test-utils": "*", - "@types/node": "^16.11.6", - "nyc": "^15.1.0", - "release-it": "^14.11.6", - "source-map-support": "^0.5.20", - "ts-node": "^10.4.0", - "typescript": "^4.4.4" - }, - "peerDependencies": { - "@redis/client": "^4.0.0-rc" - } - }, - "packages/search": { - "name": "@redis/search", - "version": "1.0.0-rc.0", - "license": "MIT", - "devDependencies": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@redis/test-utils": "*", - "@types/node": "^16.11.6", - "nyc": "^15.1.0", - "release-it": "^14.11.6", - "source-map-support": "^0.5.20", - "ts-node": "^10.4.0", - "typescript": "^4.4.4" - }, - "peerDependencies": { - "@redis/client": "^4.0.0-rc" - } - }, - "packages/test-utils": { - "name": "@redis/test-utils", - "devDependencies": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@tsconfig/node12": "^1.0.9", - "@types/mocha": "^9.0.0", - "@types/node": "^16.11.6", - "@types/yargs": "^17.0.5", - "mocha": "^9.1.3", - "nyc": "^15.1.0", - "release-it": "^14.11.6", - "source-map-support": "^0.5.20", - "ts-node": "^10.4.0", - "typescript": "^4.4.4", - "yargs": "^17.2.1" - }, - "peerDependencies": { - "@redis/client": "^4.0.0-rc" - } - }, - "packages/time-series": { - "name": "@redis/time-series", - "version": "1.0.0", - "license": "ISC", - "devDependencies": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@redis/test-utils": "*", - "@types/node": "^16.11.6", - "nyc": "^15.1.0", - "release-it": "^14.11.6", - "source-map-support": "^0.5.20", - "ts-node": "^10.4.0", - "typescript": "^4.4.4" - } - } - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.0" - } - }, - "@babel/compat-data": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz", - "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==", - "dev": true - }, - "@babel/core": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", - "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helpers": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.0.tgz", - "integrity": "sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", - "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", - "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", - "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", - "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-module-transforms": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", - "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", - "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-replace-supers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", - "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", - "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", - "dev": true - }, - "@babel/helpers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.0.tgz", - "integrity": "sha512-dVRM0StFMdKlkt7cVcGgwD8UMaBfWJHl3A83Yfs8GQ3MO0LHIIIMvK7Fa0RGOGUQ10qikLaX6D7o5htcQWgTMQ==", - "dev": true, - "requires": { - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.16.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.2.tgz", - "integrity": "sha512-RUVpT0G2h6rOZwqLDTrKk7ksNv7YpAilTnYe1/Q+eDjxEceRMKVWbCsX7t8h6C1qCFi/1Y8WZjcEPBAFG27GPw==", - "dev": true - }, - "@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/traverse": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.0.tgz", - "integrity": "sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "to-fast-properties": "^2.0.0" - } - }, - "@cspotcode/source-map-consumer": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", - "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", - "dev": true - }, - "@cspotcode/source-map-support": { - "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" - } - }, - "@eslint/eslintrc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", - "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.0.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/nyc-config-typescript": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.1.tgz", - "integrity": "sha512-/gz6LgVpky205LuoOfwEZmnUtaSmdk0QIMcNFj9OvxhiMhPpKftMgZmGN7jNj7jR+lr8IB1Yks3QSSSNSxfoaQ==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2" - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@octokit/auth-token": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", - "dev": true, - "requires": { - "@octokit/types": "^6.0.3" - } - }, - "@octokit/core": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.5.1.tgz", - "integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==", - "dev": true, - "requires": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.0", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", - "dev": true, - "requires": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", - "dev": true, - "requires": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/openapi-types": { - "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.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.34.0" - } - }, - "@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "requires": {} - }, - "@octokit/plugin-rest-endpoint-methods": { - "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.34.0", - "deprecation": "^2.3.1" - } - }, - "@octokit/request": { - "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", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.1", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", - "dev": true, - "requires": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/rest": { - "version": "18.10.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.10.0.tgz", - "integrity": "sha512-esHR5OKy38bccL/sajHqZudZCvmv4yjovMJzyXlphaUo7xykmtOdILGJ3aAm0mFHmMLmPFmDMJXf39cAjNJsrw==", - "dev": true, - "requires": { - "@octokit/core": "^3.5.1", - "@octokit/plugin-paginate-rest": "^2.16.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^5.9.0" - } - }, - "@octokit/types": { - "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": "^11.2.0" - } - }, - "@redis/client": { - "version": "file:packages/client", - "requires": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@redis/test-utils": "*", - "@types/node": "^16.11.6", - "@types/sinon": "^10.0.6", - "@types/yallist": "^4.0.1", - "@typescript-eslint/eslint-plugin": "^5.2.0", - "@typescript-eslint/parser": "^5.2.0", - "cluster-key-slot": "1.1.0", - "eslint": "^8.1.0", - "generic-pool": "3.8.2", - "nyc": "^15.1.0", - "redis-parser": "3.0.0", - "release-it": "^14.11.6", - "sinon": "^11.1.2", - "source-map-support": "^0.5.20", - "ts-node": "^10.4.0", - "typedoc": "^0.22.7", - "typedoc-github-wiki-theme": "^0.6.0", - "typedoc-plugin-markdown": "^3.11.3", - "typescript": "^4.4.4", - "yallist": "4.0.0" - } - }, - "@redis/json": { - "version": "file:packages/json", - "requires": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@redis/test-utils": "*", - "@types/node": "^16.11.6", - "nyc": "^15.1.0", - "release-it": "^14.11.6", - "source-map-support": "^0.5.20", - "ts-node": "^10.4.0", - "typescript": "^4.4.4" - } - }, - "@redis/search": { - "version": "file:packages/search", - "requires": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@redis/test-utils": "*", - "@types/node": "^16.11.6", - "nyc": "^15.1.0", - "release-it": "^14.11.6", - "source-map-support": "^0.5.20", - "ts-node": "^10.4.0", - "typescript": "^4.4.4" - } - }, - "@redis/test-utils": { - "version": "file:packages/test-utils", - "requires": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@tsconfig/node12": "^1.0.9", - "@types/mocha": "^9.0.0", - "@types/node": "^16.11.6", - "@types/yargs": "^17.0.5", - "mocha": "^9.1.3", - "nyc": "^15.1.0", - "release-it": "^14.11.6", - "source-map-support": "^0.5.20", - "ts-node": "^10.4.0", - "typescript": "^4.4.4", - "yargs": "^17.2.1" - } - }, - "@redis/time-series": { - "version": "file:packages/time-series", - "requires": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@redis/test-utils": "*", - "@types/node": "^16.11.6", - "nyc": "^15.1.0", - "release-it": "^14.11.6", - "source-map-support": "^0.5.20", - "ts-node": "^10.4.0", - "typescript": "^4.4.4" - } - }, - "@sindresorhus/is": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", - "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==", - "dev": true - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@sinonjs/samsam": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", - "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", - "dev": true - }, - "@types/cacheable-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", - "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", - "dev": true - }, - "@types/keyv": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", - "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/mocha": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", - "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==", - "dev": true - }, - "@types/node": { - "version": "16.11.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", - "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true - }, - "@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/sinon": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.6.tgz", - "integrity": "sha512-6EF+wzMWvBNeGrfP3Nx60hhx+FfwSg1JJBLAAP/IdIUq0EYkqCYf70VT3PhuhPX9eLD+Dp+lNdpb/ZeHG8Yezg==", - "dev": true, - "requires": { - "@sinonjs/fake-timers": "^7.1.0" - } - }, - "@types/yallist": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/yallist/-/yallist-4.0.1.tgz", - "integrity": "sha512-G3FNJfaYtN8URU6wd6+uwFI62KO79j7n3XTYcwcFncP8gkfoi0b821GoVVt0oqKVnCqKYOMNKIGpakPoFhzAGA==", - "dev": true - }, - "@types/yargs": { - "version": "17.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.5.tgz", - "integrity": "sha512-4HNq144yhaVjJs+ON6A07NEoi9Hh0Rhl/jI9Nt/l/YRjt+T6St/QK3meFARWZ8IgkzoD1LC0PdTdJenlQQi2WQ==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "20.2.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", - "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.3.1.tgz", - "integrity": "sha512-cFImaoIr5Ojj358xI/SDhjog57OK2NqlpxwdcgyxDA3bJlZcJq5CPzUXtpD7CxI2Hm6ATU7w5fQnnkVnmwpHqw==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "5.3.1", - "@typescript-eslint/scope-manager": "5.3.1", - "debug": "^4.3.2", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.2.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.1.tgz", - "integrity": "sha512-RgFn5asjZ5daUhbK5Sp0peq0SSMytqcrkNfU4pnDma2D8P3ElZ6JbYjY8IMSFfZAJ0f3x3tnO3vXHweYg0g59w==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.3.1", - "@typescript-eslint/types": "5.3.1", - "@typescript-eslint/typescript-estree": "5.3.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.3.1.tgz", - "integrity": "sha512-TD+ONlx5c+Qhk21x9gsJAMRohWAUMavSOmJgv3JGy9dgPhuBd5Wok0lmMClZDyJNLLZK1JRKiATzCKZNUmoyfw==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.3.1", - "@typescript-eslint/types": "5.3.1", - "@typescript-eslint/typescript-estree": "5.3.1", - "debug": "^4.3.2" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.3.1.tgz", - "integrity": "sha512-XksFVBgAq0Y9H40BDbuPOTUIp7dn4u8oOuhcgGq7EoDP50eqcafkMVGrypyVGvDYHzjhdUCUwuwVUK4JhkMAMg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.3.1", - "@typescript-eslint/visitor-keys": "5.3.1" - } - }, - "@typescript-eslint/types": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.1.tgz", - "integrity": "sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.3.1.tgz", - "integrity": "sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.3.1", - "@typescript-eslint/visitor-keys": "5.3.1", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.1.tgz", - "integrity": "sha512-3cHUzUuVTuNHx0Gjjt5pEHa87+lzyqOiHXy/Gz+SJOCW1mpw9xQHIIEwnKn+Thph1mgWyZ90nboOcSuZr/jTTQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.3.1", - "eslint-visitor-keys": "^3.0.0" - } - }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-align": { - "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": "^4.1.0" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "requires": { - "default-require-extensions": "^3.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "dev": true, - "requires": { - "retry": "0.13.1" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "before-after-hook": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", - "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserslist": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz", - "integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001274", - "electron-to-chromium": "^1.3.886", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true - }, - "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "requires": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001278", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001278.tgz", - "integrity": "sha512-mpF9KeH8u5cMoEmIic/cr7PNS+F5LWBk0t2ekGT60lFf0Wq+n9LspAj0g3P+o7DQhD3sUdlMln4YFAWhFYn9jg==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "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": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "cluster-key-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz", - "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==" - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "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" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - } - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", - "dev": true, - "requires": { - "strip-bom": "^4.0.0" - } - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "deprecated-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deprecated-obj/-/deprecated-obj-2.0.0.tgz", - "integrity": "sha512-CkdywZC2rJ8RGh+y3MM1fw1EJ4oO/oNExGbRFv0AQoMS+faTd3nO7slYjkj/6t8OnIMUE+wxh6G97YHhK1ytrw==", - "dev": true, - "requires": { - "flat": "^5.0.2", - "lodash": "^4.17.20" - } - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.891", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.891.tgz", - "integrity": "sha512-3cpwR82QkIS01CN/dup/4Yr3BiOiRLlZlcAFn/5FbNCunMO9ojqDgEP9JEo1QNLflu3pEnPWve50gHOEKc7r6w==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.2.0.tgz", - "integrity": "sha512-erw7XmM+CLxTOickrimJ1SiF55jiNlVSp2qqm0NuBWPtHYQCegD5ZMaW0c3i5ytPqL+SSLaCxdvQXFPLJn+ABw==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.0.4", - "@humanwhocodes/config-array": "^0.6.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^6.0.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.2.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "eslint-scope": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", - "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", - "dev": true - }, - "espree": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", - "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", - "dev": true, - "requires": { - "acorn": "^8.5.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=", - "dev": true - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", - "dev": true - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "generic-pool": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz", - "integrity": "sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==" - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "git-up": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.5.tgz", - "integrity": "sha512-YUvVDg/vX3d0syBsk/CKUTib0srcQME0JyHkL5BaYdwLsiCslPWmDSi8PUMo9pXYjrryMcmsCoCgsTpSCJEQaA==", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "parse-url": "^6.0.0" - } - }, - "git-url-parse": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.6.0.tgz", - "integrity": "sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g==", - "dev": true, - "requires": { - "git-up": "^4.0.0" - } - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "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" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "requires": { - "ini": "2.0.0" - } - }, - "globals": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", - "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - } - }, - "got": { - "version": "11.8.2", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz", - "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.1", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, - "hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", - "dev": true - }, - "import-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", - "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", - "dev": true, - "requires": { - "import-from": "^3.0.0" - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", - "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - }, - "inquirer": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.5.tgz", - "integrity": "sha512-G6/9xUqmt/r+UvufSyrPpt84NYwhKZ9jLsgMbQzlx804XErNupor8WQdBnBRrXmBfTPpuwf1sV+ss2ovjgdXIg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.2.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-ci": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", - "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", - "dev": true, - "requires": { - "ci-info": "^3.1.1" - } - }, - "is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "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" - } - }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "is-ssh": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.3.tgz", - "integrity": "sha512-NKzJmQzJfEEma3w5cJNcUMxoXfDjz0Zj0eyCalHn2E6VOwlzjZo0yuO2fcBSf8zhFuVCL/82/r5gRcoi6aEPVQ==", - "dev": true, - "requires": { - "protocols": "^1.1.0" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "requires": { - "append-transform": "^2.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-processinfo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", - "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.0", - "istanbul-lib-coverage": "^3.0.0-alpha.1", - "make-dir": "^3.0.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^3.3.3" - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", - "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", - "dev": true - }, - "just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "keyv": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz", - "integrity": "sha512-vqNHbAc8BBsxk+7QBYLW0Y219rWcClspR6WSeoHYKG5mnsSoOH+BL1pWq02DDCVdvvuUny5rkBlzMRzoqc+GIg==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "macos-release": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", - "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", - "dev": true - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "marked": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", - "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", - "dev": true - }, - "mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", - "dev": true, - "requires": { - "mime-db": "1.49.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mocha": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", - "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", - "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.2", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.7", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "3.0.4", - "ms": "2.1.3", - "nanoid": "3.1.25", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.1.5", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "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 - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "new-github-release-url": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-1.0.0.tgz", - "integrity": "sha512-dle7yf655IMjyFUqn6Nxkb18r4AOAkzRcgcZv6WZ0IqrOH4QCEZ8Sm6I7XX21zvHdBeeMeTkhR9qT2Z0EJDx6A==", - "dev": true, - "requires": { - "type-fest": "^0.4.1" - }, - "dependencies": { - "type-fest": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", - "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", - "dev": true - } - } - }, - "nise": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", - "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^7.0.4", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node-fetch": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", - "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "requires": { - "process-on-spawn": "^1.0.0" - } - }, - "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "requires": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "dependencies": { - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "onigasm": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz", - "integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==", - "dev": true, - "requires": { - "lru-cache": "^5.1.1" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - } - }, - "os-name": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", - "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", - "dev": true, - "requires": { - "macos-release": "^2.5.0", - "windows-release": "^4.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "dependencies": { - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - } - } - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - }, - "dependencies": { - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - } - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse-path": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.3.tgz", - "integrity": "sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA==", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "protocols": "^1.4.0", - "qs": "^6.9.4", - "query-string": "^6.13.8" - } - }, - "parse-url": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-6.0.0.tgz", - "integrity": "sha512-cYyojeX7yIIwuJzledIHeLUBVJ6COVLeT4eF+2P6aKVzwvgKQPndCBv3+yQ7pcWjqToYwaligxzSYNNmGoMAvw==", - "dev": true, - "requires": { - "is-ssh": "^1.3.0", - "normalize-url": "^6.1.0", - "parse-path": "^4.0.0", - "protocols": "^1.4.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, - "process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "requires": { - "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", - "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, - "qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "query-string": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", - "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", - "dev": true, - "requires": { - "decode-uri-component": "^0.2.0", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - } - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "redis": { - "version": "file:packages/all-in-one", - "requires": { - "@redis/client": "^4.0.0-rc", - "@redis/json": "^1.0.0-rc", - "@redis/search": "^1.0.0-rc", - "release-it": "^14.11.6", - "typescript": "^4.4.4" - } - }, - "redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=" - }, - "redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", - "requires": { - "redis-errors": "^1.0.0" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "release-it": { - "version": "14.11.6", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.11.6.tgz", - "integrity": "sha512-6BNcuzFZHThBUBJ/xYw/bxZ+58CAwrwf1zgmjq2Ibl3nlDZbjphHG6iqxkJu7mZ8TIWs6NjloEAhqpjeXoN//Q==", - "dev": true, - "requires": { - "@iarna/toml": "2.2.5", - "@octokit/rest": "18.10.0", - "async-retry": "1.3.3", - "chalk": "4.1.2", - "cosmiconfig": "7.0.1", - "debug": "4.3.2", - "deprecated-obj": "2.0.0", - "execa": "5.1.1", - "form-data": "4.0.0", - "git-url-parse": "11.6.0", - "globby": "11.0.4", - "got": "11.8.2", - "import-cwd": "3.0.0", - "inquirer": "8.1.5", - "is-ci": "3.0.0", - "lodash": "4.17.21", - "mime-types": "2.1.32", - "new-github-release-url": "1.0.0", - "open": "7.4.2", - "ora": "5.4.1", - "os-name": "4.0.1", - "parse-json": "5.2.0", - "semver": "7.3.5", - "shelljs": "0.8.4", - "update-notifier": "5.1.0", - "url-join": "4.0.1", - "uuid": "8.3.2", - "yaml": "1.10.2", - "yargs-parser": "20.2.9" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } - } - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "responselike": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", - "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "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" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "shiki": { - "version": "0.9.12", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.12.tgz", - "integrity": "sha512-VXcROdldv0/Qu0w2XvzU4IrvTeBNs/Kj/FCmtcEXGz7Tic/veQzliJj6tEiAgoKianhQstpYmbPDStHU5Opqcw==", - "dev": true, - "requires": { - "jsonc-parser": "^3.0.0", - "onigasm": "^2.2.5", - "vscode-textmate": "5.2.0" - } - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", - "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", - "dev": true - }, - "sinon": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", - "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^7.1.2", - "@sinonjs/samsam": "^6.0.2", - "diff": "^5.0.0", - "nise": "^5.1.0", - "supports-color": "^7.2.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "requires": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - } - }, - "split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } - } - }, - "string-width": { - "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.1" - } - }, - "strip-ansi": { - "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.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "ts-node": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", - "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "0.7.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - } - } - }, - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typedoc": { - "version": "0.22.8", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.8.tgz", - "integrity": "sha512-92S+YzyhospdXN5rnkYUTgirdTYqNWY7NP9vco+IqQQoiSXzVSUsawVro+tMyEEsWUS7EMaJ2YOjB9uE0CBi6A==", - "dev": true, - "requires": { - "glob": "^7.2.0", - "lunr": "^2.3.9", - "marked": "^3.0.8", - "minimatch": "^3.0.4", - "shiki": "^0.9.12" - }, - "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-github-wiki-theme": { - "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.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" - } - }, - "typescript": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", - "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", - "dev": true - }, - "uglify-js": { - "version": "3.14.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz", - "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==", - "dev": true, - "optional": true - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - } - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "vscode-textmate": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", - "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", - "dev": true - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - } - }, - "windows-release": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", - "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", - "dev": true, - "requires": { - "execa": "^4.0.2" - }, - "dependencies": { - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - } - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "workerpool": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", - "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yargs": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", - "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - } - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} diff --git a/packages/all-in-one/index.ts b/packages/all-in-one/index.ts index b0cd5c1f8f7..7913630a199 100644 --- a/packages/all-in-one/index.ts +++ b/packages/all-in-one/index.ts @@ -4,6 +4,8 @@ import { RedisClientOptions, RedisClientType } from '@redis/client/dist/lib/clie import RedisJSON from '@redis/json'; import RediSearch from '@redis/search'; +export * from '@redis/search'; + const modules = { json: RedisJSON, ft: RediSearch @@ -17,3 +19,4 @@ export function createClient>( modules }); } + diff --git a/packages/all-in-one/package.json b/packages/all-in-one/package.json index 8fdb7149717..1fcaa1697d0 100644 --- a/packages/all-in-one/package.json +++ b/packages/all-in-one/package.json @@ -3,12 +3,12 @@ "version": "4.0.0-rc.3", "license": "MIT", "main": "./dist/index.js", - "types": "./dist/index.ts", + "types": "./dist/index.d.ts", "scripts": { "build": "tsc" }, "dependencies": { - "@redis/client": "^4.0.0-rc", + "@redis/client": "^1.0.0-rc", "@redis/json": "^1.0.0-rc", "@redis/search": "^1.0.0-rc" }, diff --git a/packages/client/LICENSE b/packages/client/LICENSE deleted file mode 100644 index db86cc4de7f..00000000000 --- a/packages/client/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -MIT License - -Copyright (c) 2016-present Node Redis contributors. - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/client/README.md b/packages/client/README.md deleted file mode 100644 index 6b136bf48a5..00000000000 --- a/packages/client/README.md +++ /dev/null @@ -1,294 +0,0 @@ -

- - - -

Node Redis

-

- - - ---- - -## Installation - -```bash -npm install redis@next -``` - -> :warning: The new interface is clean and cool, but if you have an existing code base, you'll want to read the [migration guide](./docs/v3-to-v4.md). - -## Usage - -### Basic Example - -```typescript -import { createClient } from 'redis'; - -(async () => { - const client = createClient(); - - client.on('error', (err) => console.log('Redis Client Error', err)); - - await client.connect(); - - await client.set('key', 'value'); - const value = await client.get('key'); -})(); -``` - -The above code connects to localhost on port 6379. To connect to a different host or port, use a connection string in the format `redis[s]://[[username][:password]@][host][:port][/db-number]`: - -```typescript -createClient({ - url: 'redis://alice:foobared@awesome.redis.server:6380' -}); -``` - -You can also use discrete parameters, UNIX sockets, and even TLS to connect. Details can be found in the [client configuration guide](./docs/client-configuration.md). - -### Redis Commands - -There is built-in support for all of the [out-of-the-box Redis commands](https://redis.io/commands). They are exposed using the raw Redis command names (`HSET`, `HGETALL`, etc.) and a friendlier camel-cased version (`hSet`, `hGetAll`, etc.): - -```typescript -// raw Redis commands -await client.HSET('key', 'field', 'value'); -await client.HGETALL('key'); - -// friendly JavaScript commands -await client.hSet('key', 'field', 'value'); -await client.hGetAll('key'); -``` - -Modifiers to commands are specified using a JavaScript object: - -```typescript -await client.set('key', 'value', { - EX: 10, - NX: true -}); -``` - -Replies will be transformed into useful data structures: - -```typescript -await client.hGetAll('key'); // { field1: 'value1', field2: 'value2' } -await client.hVals('key'); // ['value1', 'value2'] -``` - -### Unsupported Redis Commands - -If you want to run commands and/or use arguments that Node Redis doesn't know about (yet!) use `.sendCommand()`: - -```typescript -await client.sendCommand(['SET', 'key', 'value', 'NX']); // 'OK' - -await client.sendCommand(['HGETALL', 'key']); // ['key1', 'field1', 'key2', 'field2'] -``` - -### Transactions (Multi/Exec) - -Start a [transaction](https://redis.io/topics/transactions) by calling `.multi()`, then chaining your commands. When you're done, call `.exec()` and you'll get an array back with your results: - -```typescript -await client.set('another-key', 'another-value'); - -const [setKeyReply, otherKeyValue] = await client - .multi() - .set('key', 'value') - .get('another-key') - .exec(); // ['OK', 'another-value'] -``` - -You can also [watch](https://redis.io/topics/transactions#optimistic-locking-using-check-and-set) keys by calling `.watch()`. Your transaction will abort if any of the watched keys change. - -To dig deeper into transactions, check out the [Isolated Execution Guide](./docs/isolated-execution.md). - -### Blocking Commands - -Any command can be run on a new connection by specifying the `isolated` option. The newly created connection is closed when the command's `Promise` is fulfilled. - -This pattern works especially well for blocking commands—such as `BLPOP` and `BLMOVE`: - -```typescript -import { commandOptions } from 'redis'; - -const blPopPromise = client.blPop(commandOptions({ isolated: true }), 'key', 0); - -await client.lPush('key', ['1', '2']); - -await blPopPromise; // '2' -``` - -To learn more about isolated execution, check out the [guide](./docs/isolated-execution.md). - -### Pub/Sub - -Subscribing to a channel requires a dedicated stand-alone connection. You can easily get one by `.duplicate()`ing an existing Redis connection. - -```typescript -const subscriber = client.duplicate(); - -await subscriber.connect(); -``` - -Once you have one, simply subscribe and unsubscribe as needed: - -```typescript -await subscriber.subscribe('channel', (message) => { - console.log(message); // 'message' -}); - -await subscriber.pSubscribe('channe*', (message, channel) => { - console.log(message, channel); // 'message', 'channel' -}); - -await subscriber.unsubscribe('channel'); - -await subscriber.pUnsubscribe('channe*'); -``` - -Publish a message on a channel: - -```typescript -await publisher.publish('channel', 'message'); -``` - -### Scan Iterator - -[`SCAN`](https://redis.io/commands/scan) results can be looped over using [async iterators](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator): - -```typescript -for await (const key of client.scanIterator()) { - // use the key! - await client.get(key); -} -``` - -This works with `HSCAN`, `SSCAN`, and `ZSCAN` too: - -```typescript -for await (const { field, value } of client.hScanIterator('hash')) {} -for await (const member of client.sScanIterator('set')) {} -for await (const { score, member } of client.zScanIterator('sorted-set')) {} -``` - -You can override the default options by providing a configuration object: - -```typescript -client.scanIterator({ - TYPE: 'string', // `SCAN` only - MATCH: 'patter*', - COUNT: 100 -}); -``` - -### Lua Scripts - -Define new functions using [Lua scripts](https://redis.io/commands/eval) which execute on the Redis server: - -```typescript -import { createClient, defineScript } from 'redis'; - -(async () => { - const client = createClient({ - scripts: { - add: defineScript({ - NUMBER_OF_KEYS: 1, - SCRIPT: - 'local val = redis.pcall("GET", KEYS[1]);' + - 'return val + ARGV[1];', - transformArguments(key: string, toAdd: number): Array { - return [key, toAdd.toString()]; - }, - transformReply(reply: number): number { - return reply; - } - }) - } - }); - - await client.connect(); - - await client.set('key', '1'); - await client.add('key', 2); // 3 -})(); -``` - -### Disconnecting - -There are two functions that disconnect a client from the Redis server. In most scenarios you should use `.quit()` to ensure that pending commands are sent to Redis before closing a connection. - -#### `.QUIT()`/`.quit()` - -Gracefully close a client's connection to Redis, by sending the [`QUIT`](https://redis.io/commands/quit) command to the server. Before quitting, the client executes any remaining commands in its queue, and will receive replies from Redis for each of them. - -```typescript -const [ping, get, quit] = await Promise.all([ - client.ping(), - client.get('key'), - client.quit() -]); // ['PONG', null, 'OK'] - -try { - await client.get('key'); -} catch (err) { - // ClosedClient Error -} -``` - -#### `.disconnect()` - -Forcibly close a client's connection to Redis immediately. Calling `disconnect` will not send further pending commands to the Redis server, or wait for or parse outstanding responses. - -```typescript -await client.disconnect(); -``` - -### Auto-Pipelining - -Node Redis will automatically pipeline requests that are made during the same "tick". - -```typescript -client.set('Tm9kZSBSZWRpcw==', 'users:1'); -client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw=='); -``` - -Of course, if you don't do something with your Promises you're certain to get [unhandled Promise exceptions](https://nodejs.org/api/process.html#process_event_unhandledrejection). To take advantage of auto-pipelining and handle your Promises, use `Promise.all()`. - -```typescript -await Promise.all([ - client.set('Tm9kZSBSZWRpcw==', 'users:1'), - client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw==') -]); -``` - -### Clustering - -Check out the [Clustering Guide](./docs/clustering.md) when using Node Redis to connect to a Redis Cluster. - -## Supported Redis versions - -Node Redis is supported with the following versions of Redis: - -| Version | Supported | -|---------|--------------------| -| 6.2.z | :heavy_check_mark: | -| 6.0.z | :heavy_check_mark: | -| 5.y.z | :heavy_check_mark: | -| < 5.0 | :x: | - -> Node Redis should work with older versions of Redis, but it is not fully tested and we cannot offer support. diff --git a/packages/client/examples/package-lock.json b/packages/client/examples/package-lock.json deleted file mode 100644 index e99b7b2184c..00000000000 --- a/packages/client/examples/package-lock.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "name": "node-redis-examples", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "node-redis-examples", - "version": "1.0.0", - "dependencies": { - "redis": "../" - } - }, - "..": { - "version": "4.0.0-rc.3", - "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.11.1", - "@types/sinon": "^10.0.4", - "@types/which": "^2.0.1", - "@types/yallist": "^4.0.1", - "@typescript-eslint/eslint-plugin": "^5.1.0", - "@typescript-eslint/parser": "^5.1.0", - "eslint": "^8.0.1", - "mocha": "^9.1.3", - "nyc": "^15.1.0", - "release-it": "^14.11.6", - "sinon": "^11.1.2", - "source-map-support": "^0.5.20", - "ts-node": "^10.3.0", - "typedoc": "^0.22.6", - "typedoc-github-wiki-theme": "^0.6.0", - "typedoc-plugin-markdown": "^3.11.3", - "typescript": "^4.4.4", - "which": "^2.0.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/redis": { - "resolved": "..", - "link": true - } - }, - "dependencies": { - "redis": { - "version": "file:..", - "requires": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@tsconfig/node12": "^1.0.9", - "@types/mocha": "^9.0.0", - "@types/node": "^16.11.1", - "@types/sinon": "^10.0.4", - "@types/which": "^2.0.1", - "@types/yallist": "^4.0.1", - "@typescript-eslint/eslint-plugin": "^5.1.0", - "@typescript-eslint/parser": "^5.1.0", - "cluster-key-slot": "1.1.0", - "eslint": "^8.0.1", - "generic-pool": "3.8.2", - "mocha": "^9.1.3", - "nyc": "^15.1.0", - "redis-parser": "3.0.0", - "release-it": "^14.11.6", - "sinon": "^11.1.2", - "source-map-support": "^0.5.20", - "ts-node": "^10.3.0", - "typedoc": "^0.22.6", - "typedoc-github-wiki-theme": "^0.6.0", - "typedoc-plugin-markdown": "^3.11.3", - "typescript": "^4.4.4", - "which": "^2.0.2", - "yallist": "4.0.0" - } - } - } -} diff --git a/packages/client/package.json b/packages/client/package.json index 1b4124c2eb3..812f742db84 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@redis/client", - "version": "4.0.0-rc.3", + "version": "1.0.0-rc", "license": "MIT", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/packages/json/lib/commands/GET.ts b/packages/json/lib/commands/GET.ts index 8b69dc80533..36bb9bc4e4c 100644 --- a/packages/json/lib/commands/GET.ts +++ b/packages/json/lib/commands/GET.ts @@ -1,4 +1,4 @@ -import { pushVerdictArguments } from '@redis/client/lib/commands/generic-transformers'; +import { pushVerdictArguments } from '@redis/client/dist/lib/commands/generic-transformers'; export const FIRST_KEY_INDEX = 1; diff --git a/packages/json/package.json b/packages/json/package.json index 7f53cc0b807..1dcf907ea0e 100644 --- a/packages/json/package.json +++ b/packages/json/package.json @@ -9,7 +9,7 @@ "build": "tsc" }, "peerDependencies": { - "@redis/client": "^4.0.0-rc" + "@redis/client": "^1.0.0-rc" }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", diff --git a/packages/search/lib/commands/CREATE.spec.ts b/packages/search/lib/commands/CREATE.spec.ts index 2ac68cc9710..5bdf4c93a43 100644 --- a/packages/search/lib/commands/CREATE.spec.ts +++ b/packages/search/lib/commands/CREATE.spec.ts @@ -1,6 +1,7 @@ import { strict as assert } from 'assert'; import testUtils, { GLOBAL } from '../test-utils'; -import { RedisSearchLanguages, SchemaFieldTypes, SchemaTextFieldPhonetics, transformArguments } from './CREATE'; +import { SchemaFieldTypes, SchemaTextFieldPhonetics, transformArguments } from './CREATE'; +import { RedisSearchLanguages } from '.'; describe('CREATE', () => { describe('transformArguments', () => { @@ -111,30 +112,32 @@ describe('CREATE', () => { ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TAG', 'SEPERATOR', 'seperator'] ); }); - }); - describe('with generic options', () => { - it('with AS', () => { + + + it('with CASESENSITIVE', () => { assert.deepEqual( transformArguments('index', { field: { - type: SchemaFieldTypes.TEXT, - AS: 'as' + type: SchemaFieldTypes.TAG, + CASESENSITIVE: true } }), - ['FT.CREATE', 'index', 'SCHEMA', 'field', 'AS', 'as', 'TEXT'] + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TAG', 'CASESENSITIVE'] ); }); + }); - it('with CASESENSITIVE', () => { + describe('with generic options', () => { + it('with AS', () => { assert.deepEqual( transformArguments('index', { field: { type: SchemaFieldTypes.TEXT, - CASESENSITIVE: true + AS: 'as' } }), - ['FT.CREATE', 'index', 'SCHEMA', 'field', 'TEXT', 'CASESENSITIVE'] + ['FT.CREATE', 'index', 'SCHEMA', 'field', 'AS', 'as', 'TEXT'] ); }); diff --git a/packages/search/lib/commands/CREATE.ts b/packages/search/lib/commands/CREATE.ts index 94c063ec503..b67896cd64c 100644 --- a/packages/search/lib/commands/CREATE.ts +++ b/packages/search/lib/commands/CREATE.ts @@ -1,17 +1,16 @@ import { pushOptionalVerdictArgument } from '@redis/client/dist/lib/commands/generic-transformers'; -import { PropertyName } from '.'; +import { RedisSearchLanguages, PropertyName } from '.'; export enum SchemaFieldTypes { TEXT = 'TEXT', NUMERIC = 'NUMERIC', GEO = 'GEO', - TAG = 'TAG', + TAG = 'TAG' } type CreateSchemaField> = T | ({ type: T; AS?: string; - CASESENSITIVE?: true; SORTABLE?: true | 'UNF'; NOINDEX?: true; } & E); @@ -35,6 +34,7 @@ type CreateSchemaGeoField = CreateSchemaField; type CreateSchemaTagField = CreateSchemaField; interface CreateSchema { @@ -45,34 +45,6 @@ interface CreateSchema { CreateSchemaTagField } -export enum RedisSearchLanguages { - ARABIC = 'Arabic', - BASQUE = 'Basque', - CATALANA = 'Catalan', - DANISH = 'Danish', - DUTCH = 'Dutch', - ENGLISH = 'English', - FINNISH = 'Finnish', - FRENCH = 'French', - GERMAN = 'German', - GREEK = 'Greek', - HUNGARIAN = 'Hungarian', - INDONESAIN = 'Indonesian', - IRISH = 'Irish', - ITALIAN = 'Italian', - LITHUANIAN = 'Lithuanian', - NEPALI = 'Nepali', - NORWEIGAN = 'Norwegian', - PORTUGUESE = 'Portuguese', - ROMANIAN = 'Romanian', - RUSSIAN = 'Russian', - SPANISH = 'Spanish', - SWEDISH = 'Swedish', - TAMIL = 'Tamil', - TURKISH = 'Turkish', - CHINESE = 'Chinese' -} - interface CreateOptions { ON?: 'HASH' | 'JSON'; PREFIX?: string | Array; @@ -196,11 +168,11 @@ export function transformArguments(index: string, schema: CreateSchema, options? args.push('SEPERATOR', fieldOptions.SEPERATOR); } - break; - } + if (fieldOptions.CASESENSITIVE) { + args.push('CASESENSITIVE'); + } - if (fieldOptions.CASESENSITIVE) { - args.push('CASESENSITIVE'); + break; } if (fieldOptions.SORTABLE) { diff --git a/packages/search/lib/commands/SEARCH.spec.ts b/packages/search/lib/commands/SEARCH.spec.ts index efe9c899ac2..15dc4740948 100644 --- a/packages/search/lib/commands/SEARCH.spec.ts +++ b/packages/search/lib/commands/SEARCH.spec.ts @@ -1,6 +1,7 @@ import { strict as assert } from 'assert'; +import { RedisSearchLanguages } from '.'; import testUtils, { GLOBAL } from '../test-utils'; -import { RedisSearchLanguages, SchemaFieldTypes } from './CREATE'; +import { SchemaFieldTypes } from './CREATE'; import { transformArguments } from './SEARCH'; describe('SEARCH', () => { diff --git a/packages/search/lib/commands/SEARCH.ts b/packages/search/lib/commands/SEARCH.ts index 6b14a0a18fd..a773514a738 100644 --- a/packages/search/lib/commands/SEARCH.ts +++ b/packages/search/lib/commands/SEARCH.ts @@ -1,8 +1,6 @@ import { RedisCommandArguments } from '@redis/client/dist/lib/commands'; import { pushOptionalVerdictArgument, pushVerdictArgument, transformReplyTuples } from '@redis/client/dist/lib/commands/generic-transformers'; -import { type } from 'os'; -import { PropertyName, pushSortByArguments, SortByOptions } from '.'; -import { RedisSearchLanguages } from './CREATE'; +import { RedisSearchLanguages, PropertyName, pushSortByArguments, SortByOptions } from '.'; export const FIRST_KEY_INDEX = 1; @@ -41,7 +39,7 @@ interface SearchOptions { TAGS?: { open: string; close: string; - } + }; }; SLOP?: number; INORDER?: true; diff --git a/packages/search/lib/commands/index.ts b/packages/search/lib/commands/index.ts index f54a71e0e0b..c10a10774b7 100644 --- a/packages/search/lib/commands/index.ts +++ b/packages/search/lib/commands/index.ts @@ -87,6 +87,34 @@ export default { tagVals: TAGVALS }; +export enum RedisSearchLanguages { + ARABIC = 'Arabic', + BASQUE = 'Basque', + CATALANA = 'Catalan', + DANISH = 'Danish', + DUTCH = 'Dutch', + ENGLISH = 'English', + FINNISH = 'Finnish', + FRENCH = 'French', + GERMAN = 'German', + GREEK = 'Greek', + HUNGARIAN = 'Hungarian', + INDONESAIN = 'Indonesian', + IRISH = 'Irish', + ITALIAN = 'Italian', + LITHUANIAN = 'Lithuanian', + NEPALI = 'Nepali', + NORWEIGAN = 'Norwegian', + PORTUGUESE = 'Portuguese', + ROMANIAN = 'Romanian', + RUSSIAN = 'Russian', + SPANISH = 'Spanish', + SWEDISH = 'Swedish', + TAMIL = 'Tamil', + TURKISH = 'Turkish', + CHINESE = 'Chinese' +} + export type PropertyName = `${'@' | '$.'}${string}`; export type SortByOptions = PropertyName | { diff --git a/packages/search/lib/index.ts b/packages/search/lib/index.ts index bc0e103e8c8..9e0be7b169c 100644 --- a/packages/search/lib/index.ts +++ b/packages/search/lib/index.ts @@ -1 +1,4 @@ export { default } from './commands'; + +export { SchemaFieldTypes, SchemaTextFieldPhonetics } from './commands/CREATE'; +export { AggregateSteps, AggregateGroupByReducers } from './commands/AGGREGATE'; diff --git a/packages/search/package.json b/packages/search/package.json index b44dc8fb528..5f8e9e550db 100644 --- a/packages/search/package.json +++ b/packages/search/package.json @@ -9,7 +9,7 @@ "build": "tsc" }, "peerDependencies": { - "@redis/client": "^4.0.0-rc" + "@redis/client": "^1.0.0-rc" }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", diff --git a/packages/test-utils/lib/dockers.ts b/packages/test-utils/lib/dockers.ts index 28bd1e49057..29f93b9c825 100644 --- a/packages/test-utils/lib/dockers.ts +++ b/packages/test-utils/lib/dockers.ts @@ -1,8 +1,8 @@ import { createConnection } from 'net'; import { once } from 'events'; -import { RedisModules, RedisScripts } from '@redis/client/lib/commands'; -import RedisClient, { RedisClientType } from '@redis/client/lib/client'; -import { promiseTimeout } from '@redis/client/lib/utils'; +import { RedisModules, RedisScripts } from '@redis/client/dist/lib/commands'; +import RedisClient, { RedisClientType } from '@redis/client/dist/lib/client'; +import { promiseTimeout } from '@redis/client/dist/lib/utils'; import path from 'path'; import { promisify } from 'util'; import { exec } from 'child_process'; diff --git a/packages/test-utils/lib/index.ts b/packages/test-utils/lib/index.ts index f9a1fc1dbd9..e553e132894 100644 --- a/packages/test-utils/lib/index.ts +++ b/packages/test-utils/lib/index.ts @@ -1,6 +1,6 @@ -import { RedisModules, RedisScripts } from '@redis/client/lib/commands'; -import RedisClient, { RedisClientOptions, RedisClientType } from '@redis/client/lib/client'; -import RedisCluster, { RedisClusterOptions, RedisClusterType } from '@redis/client/lib/cluster'; +import { RedisModules, RedisScripts } from '@redis/client/dist/lib/commands'; +import RedisClient, { RedisClientOptions, RedisClientType } from '@redis/client/dist/lib/client'; +import RedisCluster, { RedisClusterOptions, RedisClusterType } from '@redis/client/dist/lib/cluster'; import { RedisServerDockerConfig, spawnRedisServer, spawnRedisCluster } from './dockers'; import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 0c934ace9fb..fba6744136a 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -8,7 +8,7 @@ "test": "echo \"TODO\"" }, "peerDependencies": { - "@redis/client": "^4.0.0-rc" + "@redis/client": "^1.0.0-rc" }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", From ca4ec86f89cf8b5713a16f1ae787f367ba8ff9b1 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 9 Nov 2021 18:09:19 -0500 Subject: [PATCH 078/112] add package-lock.json --- package-lock.json | 11351 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 11351 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000000..b9e9ed91405 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,11351 @@ +{ + "name": "redis-monorepo", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "redis-monorepo", + "workspaces": [ + "./packages/*" + ], + "devDependencies": { + "@tsconfig/node12": "^1.0.9" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz", + "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", + "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", + "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", + "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.3", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.3.tgz", + "integrity": "sha512-dcNwU1O4sx57ClvLBVFbEgx0UZWfd0JQX5X6fxFRCLHelFBGXFfSz6Y0FAq2PEwUqlqLkdVjVr4VASEOuUnLJw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", + "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.3", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@cspotcode/source-map-support": { + "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" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", + "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.0.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", + "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/nyc-config-typescript": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.1.tgz", + "integrity": "sha512-/gz6LgVpky205LuoOfwEZmnUtaSmdk0QIMcNFj9OvxhiMhPpKftMgZmGN7jNj7jR+lr8IB1Yks3QSSSNSxfoaQ==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "nyc": ">=15", + "source-map-support": "*", + "ts-node": "*" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@octokit/auth-token": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", + "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3" + } + }, + "node_modules/@octokit/core": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.5.1.tgz", + "integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==", + "dev": true, + "dependencies": { + "@octokit/auth-token": "^2.4.4", + "@octokit/graphql": "^4.5.8", + "@octokit/request": "^5.6.0", + "@octokit/request-error": "^2.0.5", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/endpoint": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", + "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/graphql": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", + "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "dev": true, + "dependencies": { + "@octokit/request": "^5.6.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/openapi-types": { + "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.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.34.0" + }, + "peerDependencies": { + "@octokit/core": ">=2" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "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.34.0", + "deprecation": "^2.3.1" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/request": { + "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", + "@octokit/request-error": "^2.1.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.1", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/request-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", + "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "node_modules/@octokit/rest": { + "version": "18.10.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.10.0.tgz", + "integrity": "sha512-esHR5OKy38bccL/sajHqZudZCvmv4yjovMJzyXlphaUo7xykmtOdILGJ3aAm0mFHmMLmPFmDMJXf39cAjNJsrw==", + "dev": true, + "dependencies": { + "@octokit/core": "^3.5.1", + "@octokit/plugin-paginate-rest": "^2.16.0", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^5.9.0" + } + }, + "node_modules/@octokit/types": { + "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": "^11.2.0" + } + }, + "node_modules/@redis/client": { + "resolved": "packages/client", + "link": true + }, + "node_modules/@redis/json": { + "resolved": "packages/json", + "link": true + }, + "node_modules/@redis/search": { + "resolved": "packages/search", + "link": true + }, + "node_modules/@redis/test-utils": { + "resolved": "packages/test-utils", + "link": true + }, + "node_modules/@redis/time-series": { + "resolved": "packages/time-series", + "link": true + }, + "node_modules/@sindresorhus/is": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", + "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", + "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", + "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "node_modules/@types/keyv": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", + "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mocha": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", + "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "16.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", + "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/sinon": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.6.tgz", + "integrity": "sha512-6EF+wzMWvBNeGrfP3Nx60hhx+FfwSg1JJBLAAP/IdIUq0EYkqCYf70VT3PhuhPX9eLD+Dp+lNdpb/ZeHG8Yezg==", + "dev": true, + "dependencies": { + "@sinonjs/fake-timers": "^7.1.0" + } + }, + "node_modules/@types/yallist": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/yallist/-/yallist-4.0.1.tgz", + "integrity": "sha512-G3FNJfaYtN8URU6wd6+uwFI62KO79j7n3XTYcwcFncP8gkfoi0b821GoVVt0oqKVnCqKYOMNKIGpakPoFhzAGA==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.5.tgz", + "integrity": "sha512-4HNq144yhaVjJs+ON6A07NEoi9Hh0Rhl/jI9Nt/l/YRjt+T6St/QK3meFARWZ8IgkzoD1LC0PdTdJenlQQi2WQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.3.1.tgz", + "integrity": "sha512-cFImaoIr5Ojj358xI/SDhjog57OK2NqlpxwdcgyxDA3bJlZcJq5CPzUXtpD7CxI2Hm6ATU7w5fQnnkVnmwpHqw==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "5.3.1", + "@typescript-eslint/scope-manager": "5.3.1", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.1.tgz", + "integrity": "sha512-RgFn5asjZ5daUhbK5Sp0peq0SSMytqcrkNfU4pnDma2D8P3ElZ6JbYjY8IMSFfZAJ0f3x3tnO3vXHweYg0g59w==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/typescript-estree": "5.3.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.3.1.tgz", + "integrity": "sha512-TD+ONlx5c+Qhk21x9gsJAMRohWAUMavSOmJgv3JGy9dgPhuBd5Wok0lmMClZDyJNLLZK1JRKiATzCKZNUmoyfw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/typescript-estree": "5.3.1", + "debug": "^4.3.2" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.3.1.tgz", + "integrity": "sha512-XksFVBgAq0Y9H40BDbuPOTUIp7dn4u8oOuhcgGq7EoDP50eqcafkMVGrypyVGvDYHzjhdUCUwuwVUK4JhkMAMg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.1.tgz", + "integrity": "sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.3.1.tgz", + "integrity": "sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.1.tgz", + "integrity": "sha512-3cHUzUuVTuNHx0Gjjt5pEHa87+lzyqOiHXy/Gz+SJOCW1mpw9xQHIIEwnKn+Thph1mgWyZ90nboOcSuZr/jTTQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.3.1", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-align": { + "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": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, + "dependencies": { + "retry": "0.13.1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/before-after-hook": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", + "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.17.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz", + "integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001274", + "electron-to-chromium": "^1.3.886", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001279", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001279.tgz", + "integrity": "sha512-VfEHpzHEXj6/CxggTwSFoZBBYGQfQv9Cf42KPlO79sWXCD1QNKWKsKzFeWL7QpZHJQYAvocqV6Rty1yJMkqWLQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "dev": true + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz", + "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/deprecated-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deprecated-obj/-/deprecated-obj-2.0.0.tgz", + "integrity": "sha512-CkdywZC2rJ8RGh+y3MM1fw1EJ4oO/oNExGbRFv0AQoMS+faTd3nO7slYjkj/6t8OnIMUE+wxh6G97YHhK1ytrw==", + "dev": true, + "dependencies": { + "flat": "^5.0.2", + "lodash": "^4.17.20" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.3.893", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.893.tgz", + "integrity": "sha512-ChtwF7qB03INq1SyMpue08wc6cve+ktj2UC/Y7se9vB+JryfzziJeYwsgb8jLaCA5GMkHCdn5M62PfSMWhifZg==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.2.0.tgz", + "integrity": "sha512-erw7XmM+CLxTOickrimJ1SiF55jiNlVSp2qqm0NuBWPtHYQCegD5ZMaW0c3i5ytPqL+SSLaCxdvQXFPLJn+ABw==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.0.4", + "@humanwhocodes/config-array": "^0.6.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^6.0.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.2.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", + "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", + "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/espree": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", + "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", + "dev": true, + "dependencies": { + "acorn": "^8.5.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "dev": true + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/generic-pool": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz", + "integrity": "sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-up": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.5.tgz", + "integrity": "sha512-YUvVDg/vX3d0syBsk/CKUTib0srcQME0JyHkL5BaYdwLsiCslPWmDSi8PUMo9pXYjrryMcmsCoCgsTpSCJEQaA==", + "dev": true, + "dependencies": { + "is-ssh": "^1.3.0", + "parse-url": "^6.0.0" + } + }, + "node_modules/git-url-parse": { + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.6.0.tgz", + "integrity": "sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g==", + "dev": true, + "dependencies": { + "git-up": "^4.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got": { + "version": "11.8.2", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz", + "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.1", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "dev": true, + "dependencies": { + "import-from": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-from/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/inquirer": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.5.tgz", + "integrity": "sha512-G6/9xUqmt/r+UvufSyrPpt84NYwhKZ9jLsgMbQzlx804XErNupor8WQdBnBRrXmBfTPpuwf1sV+ss2ovjgdXIg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.2.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.1.1" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-ssh": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.3.tgz", + "integrity": "sha512-NKzJmQzJfEEma3w5cJNcUMxoXfDjz0Zj0eyCalHn2E6VOwlzjZo0yuO2fcBSf8zhFuVCL/82/r5gRcoi6aEPVQ==", + "dev": true, + "dependencies": { + "protocols": "^1.1.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", + "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "node_modules/keyv": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz", + "integrity": "sha512-vqNHbAc8BBsxk+7QBYLW0Y219rWcClspR6WSeoHYKG5mnsSoOH+BL1pWq02DDCVdvvuUny5rkBlzMRzoqc+GIg==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "node_modules/macos-release": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", + "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/marked": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", + "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", + "dev": true, + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "dev": true, + "dependencies": { + "mime-db": "1.49.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mocha": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", + "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", + "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.2", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.7", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.25", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.1.5", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "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/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/nanoid": { + "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" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/new-github-release-url": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-1.0.0.tgz", + "integrity": "sha512-dle7yf655IMjyFUqn6Nxkb18r4AOAkzRcgcZv6WZ0IqrOH4QCEZ8Sm6I7XX21zvHdBeeMeTkhR9qT2Z0EJDx6A==", + "dev": true, + "dependencies": { + "type-fest": "^0.4.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/new-github-release-url/node_modules/type-fest": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", + "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/nise": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", + "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/node-fetch": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/onigasm": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz", + "integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==", + "dev": true, + "dependencies": { + "lru-cache": "^5.1.1" + } + }, + "node_modules/onigasm/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/onigasm/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-name": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", + "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", + "dev": true, + "dependencies": { + "macos-release": "^2.5.0", + "windows-release": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json/node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json/node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "node_modules/package-json/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/package-json/node_modules/got/node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/package-json/node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "node_modules/package-json/node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/package-json/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json/node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/package-json/node_modules/responselike/node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-path": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.3.tgz", + "integrity": "sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA==", + "dev": true, + "dependencies": { + "is-ssh": "^1.3.0", + "protocols": "^1.4.0", + "qs": "^6.9.4", + "query-string": "^6.13.8" + } + }, + "node_modules/parse-url": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-6.0.0.tgz", + "integrity": "sha512-cYyojeX7yIIwuJzledIHeLUBVJ6COVLeT4eF+2P6aKVzwvgKQPndCBv3+yQ7pcWjqToYwaligxzSYNNmGoMAvw==", + "dev": true, + "dependencies": { + "is-ssh": "^1.3.0", + "normalize-url": "^6.1.0", + "parse-path": "^4.0.0", + "protocols": "^1.4.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "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", + "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/query-string": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", + "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", + "dev": true, + "dependencies": { + "decode-uri-component": "^0.2.0", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redis": { + "resolved": "packages/all-in-one", + "link": true + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/release-it": { + "version": "14.11.6", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.11.6.tgz", + "integrity": "sha512-6BNcuzFZHThBUBJ/xYw/bxZ+58CAwrwf1zgmjq2Ibl3nlDZbjphHG6iqxkJu7mZ8TIWs6NjloEAhqpjeXoN//Q==", + "dev": true, + "dependencies": { + "@iarna/toml": "2.2.5", + "@octokit/rest": "18.10.0", + "async-retry": "1.3.3", + "chalk": "4.1.2", + "cosmiconfig": "7.0.1", + "debug": "4.3.2", + "deprecated-obj": "2.0.0", + "execa": "5.1.1", + "form-data": "4.0.0", + "git-url-parse": "11.6.0", + "globby": "11.0.4", + "got": "11.8.2", + "import-cwd": "3.0.0", + "inquirer": "8.1.5", + "is-ci": "3.0.0", + "lodash": "4.17.21", + "mime-types": "2.1.32", + "new-github-release-url": "1.0.0", + "open": "7.4.2", + "ora": "5.4.1", + "os-name": "4.0.1", + "parse-json": "5.2.0", + "semver": "7.3.5", + "shelljs": "0.8.4", + "update-notifier": "5.1.0", + "url-join": "4.0.1", + "uuid": "8.3.2", + "yaml": "1.10.2", + "yargs-parser": "20.2.9" + }, + "bin": { + "release-it": "bin/release-it.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/release-it/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/release-it/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/responselike": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "dev": true, + "dependencies": { + "lowercase-keys": "^2.0.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "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" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shiki": { + "version": "0.9.12", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.12.tgz", + "integrity": "sha512-VXcROdldv0/Qu0w2XvzU4IrvTeBNs/Kj/FCmtcEXGz7Tic/veQzliJj6tEiAgoKianhQstpYmbPDStHU5Opqcw==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.0.0", + "onigasm": "^2.2.5", + "vscode-textmate": "5.2.0" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "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": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", + "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^7.1.2", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-width": { + "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.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "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.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "node_modules/ts-node": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", + "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "0.7.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typedoc": { + "version": "0.22.8", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.8.tgz", + "integrity": "sha512-92S+YzyhospdXN5rnkYUTgirdTYqNWY7NP9vco+IqQQoiSXzVSUsawVro+tMyEEsWUS7EMaJ2YOjB9uE0CBi6A==", + "dev": true, + "dependencies": { + "glob": "^7.2.0", + "lunr": "^2.3.9", + "marked": "^3.0.8", + "minimatch": "^3.0.4", + "shiki": "^0.9.12" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 12.10.0" + }, + "peerDependencies": { + "typescript": "4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x" + } + }, + "node_modules/typedoc-github-wiki-theme": { + "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.22.0", + "typedoc-plugin-markdown": ">=3.11.0" + } + }, + "node_modules/typedoc-plugin-markdown": { + "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.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": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", + "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/uglify-js": { + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz", + "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + }, + "node_modules/update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dev": true, + "dependencies": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "node_modules/update-notifier/node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", + "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "dev": true + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/windows-release": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", + "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", + "dev": true, + "dependencies": { + "execa": "^4.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/windows-release/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "node_modules/workerpool": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", + "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/all-in-one": { + "name": "redis", + "version": "4.0.0-rc.3", + "license": "MIT", + "dependencies": { + "@redis/client": "^1.0.0-rc", + "@redis/json": "^1.0.0-rc", + "@redis/search": "^1.0.0-rc" + }, + "devDependencies": { + "release-it": "^14.11.6", + "typescript": "^4.4.4" + } + }, + "packages/client": { + "name": "@redis/client", + "version": "1.0.0-rc", + "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", + "@redis/test-utils": "*", + "@types/node": "^16.11.6", + "@types/sinon": "^10.0.6", + "@types/yallist": "^4.0.1", + "@typescript-eslint/eslint-plugin": "^5.2.0", + "@typescript-eslint/parser": "^5.2.0", + "eslint": "^8.1.0", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "sinon": "^11.1.2", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typedoc": "^0.22.7", + "typedoc-github-wiki-theme": "^0.6.0", + "typedoc-plugin-markdown": "^3.11.3", + "typescript": "^4.4.4" + }, + "engines": { + "node": ">=12" + } + }, + "packages/json": { + "name": "@redis/json", + "version": "1.0.0-rc.0", + "license": "MIT", + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@redis/test-utils": "*", + "@types/node": "^16.11.6", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4" + }, + "peerDependencies": { + "@redis/client": "^1.0.0-rc" + } + }, + "packages/search": { + "name": "@redis/search", + "version": "1.0.0-rc.0", + "license": "MIT", + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@redis/test-utils": "*", + "@types/node": "^16.11.6", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4" + }, + "peerDependencies": { + "@redis/client": "^1.0.0-rc" + } + }, + "packages/test-utils": { + "name": "@redis/test-utils", + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@tsconfig/node12": "^1.0.9", + "@types/mocha": "^9.0.0", + "@types/node": "^16.11.6", + "@types/yargs": "^17.0.5", + "mocha": "^9.1.3", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4", + "yargs": "^17.2.1" + }, + "peerDependencies": { + "@redis/client": "^1.0.0-rc" + } + }, + "packages/time-series": { + "name": "@redis/time-series", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@redis/test-utils": "*", + "@types/node": "^16.11.6", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/compat-data": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz", + "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==", + "dev": true + }, + "@babel/core": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", + "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", + "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helpers": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", + "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "dev": true, + "requires": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.3", + "@babel/types": "^7.16.0" + } + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.3.tgz", + "integrity": "sha512-dcNwU1O4sx57ClvLBVFbEgx0UZWfd0JQX5X6fxFRCLHelFBGXFfSz6Y0FAq2PEwUqlqLkdVjVr4VASEOuUnLJw==", + "dev": true + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", + "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.3", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", + "dev": true + }, + "@cspotcode/source-map-support": { + "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" + } + }, + "@eslint/eslintrc": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", + "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.0.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", + "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/nyc-config-typescript": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.1.tgz", + "integrity": "sha512-/gz6LgVpky205LuoOfwEZmnUtaSmdk0QIMcNFj9OvxhiMhPpKftMgZmGN7jNj7jR+lr8IB1Yks3QSSSNSxfoaQ==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@octokit/auth-token": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", + "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.3" + } + }, + "@octokit/core": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.5.1.tgz", + "integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==", + "dev": true, + "requires": { + "@octokit/auth-token": "^2.4.4", + "@octokit/graphql": "^4.5.8", + "@octokit/request": "^5.6.0", + "@octokit/request-error": "^2.0.5", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/endpoint": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", + "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/graphql": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", + "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "dev": true, + "requires": { + "@octokit/request": "^5.6.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/openapi-types": { + "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.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.34.0" + } + }, + "@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "requires": {} + }, + "@octokit/plugin-rest-endpoint-methods": { + "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.34.0", + "deprecation": "^2.3.1" + } + }, + "@octokit/request": { + "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", + "@octokit/request-error": "^2.1.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.1", + "universal-user-agent": "^6.0.0" + } + }, + "@octokit/request-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", + "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "dev": true, + "requires": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "@octokit/rest": { + "version": "18.10.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.10.0.tgz", + "integrity": "sha512-esHR5OKy38bccL/sajHqZudZCvmv4yjovMJzyXlphaUo7xykmtOdILGJ3aAm0mFHmMLmPFmDMJXf39cAjNJsrw==", + "dev": true, + "requires": { + "@octokit/core": "^3.5.1", + "@octokit/plugin-paginate-rest": "^2.16.0", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^5.9.0" + } + }, + "@octokit/types": { + "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": "^11.2.0" + } + }, + "@redis/client": { + "version": "file:packages/client", + "requires": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@redis/test-utils": "*", + "@types/node": "^16.11.6", + "@types/sinon": "^10.0.6", + "@types/yallist": "^4.0.1", + "@typescript-eslint/eslint-plugin": "^5.2.0", + "@typescript-eslint/parser": "^5.2.0", + "cluster-key-slot": "1.1.0", + "eslint": "^8.1.0", + "generic-pool": "3.8.2", + "nyc": "^15.1.0", + "redis-parser": "3.0.0", + "release-it": "^14.11.6", + "sinon": "^11.1.2", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typedoc": "^0.22.7", + "typedoc-github-wiki-theme": "^0.6.0", + "typedoc-plugin-markdown": "^3.11.3", + "typescript": "^4.4.4", + "yallist": "4.0.0" + } + }, + "@redis/json": { + "version": "file:packages/json", + "requires": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@redis/test-utils": "*", + "@types/node": "^16.11.6", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4" + } + }, + "@redis/search": { + "version": "file:packages/search", + "requires": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@redis/test-utils": "*", + "@types/node": "^16.11.6", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4" + } + }, + "@redis/test-utils": { + "version": "file:packages/test-utils", + "requires": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@tsconfig/node12": "^1.0.9", + "@types/mocha": "^9.0.0", + "@types/node": "^16.11.6", + "@types/yargs": "^17.0.5", + "mocha": "^9.1.3", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4", + "yargs": "^17.2.1" + } + }, + "@redis/time-series": { + "version": "file:packages/time-series", + "requires": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@redis/test-utils": "*", + "@types/node": "^16.11.6", + "nyc": "^15.1.0", + "release-it": "^14.11.6", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4" + } + }, + "@sindresorhus/is": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", + "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==", + "dev": true + }, + "@sinonjs/commons": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", + "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sinonjs/samsam": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.2.tgz", + "integrity": "sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "requires": { + "defer-to-connect": "^2.0.0" + } + }, + "@tsconfig/node10": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", + "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", + "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", + "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", + "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "dev": true + }, + "@types/cacheable-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", + "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "dev": true, + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, + "@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/keyv": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", + "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", + "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==", + "dev": true + }, + "@types/node": { + "version": "16.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", + "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/sinon": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.6.tgz", + "integrity": "sha512-6EF+wzMWvBNeGrfP3Nx60hhx+FfwSg1JJBLAAP/IdIUq0EYkqCYf70VT3PhuhPX9eLD+Dp+lNdpb/ZeHG8Yezg==", + "dev": true, + "requires": { + "@sinonjs/fake-timers": "^7.1.0" + } + }, + "@types/yallist": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/yallist/-/yallist-4.0.1.tgz", + "integrity": "sha512-G3FNJfaYtN8URU6wd6+uwFI62KO79j7n3XTYcwcFncP8gkfoi0b821GoVVt0oqKVnCqKYOMNKIGpakPoFhzAGA==", + "dev": true + }, + "@types/yargs": { + "version": "17.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.5.tgz", + "integrity": "sha512-4HNq144yhaVjJs+ON6A07NEoi9Hh0Rhl/jI9Nt/l/YRjt+T6St/QK3meFARWZ8IgkzoD1LC0PdTdJenlQQi2WQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.3.1.tgz", + "integrity": "sha512-cFImaoIr5Ojj358xI/SDhjog57OK2NqlpxwdcgyxDA3bJlZcJq5CPzUXtpD7CxI2Hm6ATU7w5fQnnkVnmwpHqw==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "5.3.1", + "@typescript-eslint/scope-manager": "5.3.1", + "debug": "^4.3.2", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.1.8", + "regexpp": "^3.2.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.1.tgz", + "integrity": "sha512-RgFn5asjZ5daUhbK5Sp0peq0SSMytqcrkNfU4pnDma2D8P3ElZ6JbYjY8IMSFfZAJ0f3x3tnO3vXHweYg0g59w==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/typescript-estree": "5.3.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.3.1.tgz", + "integrity": "sha512-TD+ONlx5c+Qhk21x9gsJAMRohWAUMavSOmJgv3JGy9dgPhuBd5Wok0lmMClZDyJNLLZK1JRKiATzCKZNUmoyfw==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/typescript-estree": "5.3.1", + "debug": "^4.3.2" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.3.1.tgz", + "integrity": "sha512-XksFVBgAq0Y9H40BDbuPOTUIp7dn4u8oOuhcgGq7EoDP50eqcafkMVGrypyVGvDYHzjhdUCUwuwVUK4JhkMAMg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1" + } + }, + "@typescript-eslint/types": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.1.tgz", + "integrity": "sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.3.1.tgz", + "integrity": "sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/visitor-keys": "5.3.1", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.1.tgz", + "integrity": "sha512-3cHUzUuVTuNHx0Gjjt5pEHa87+lzyqOiHXy/Gz+SJOCW1mpw9xQHIIEwnKn+Thph1mgWyZ90nboOcSuZr/jTTQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.3.1", + "eslint-visitor-keys": "^3.0.0" + } + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-align": { + "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": "^4.1.0" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, + "requires": { + "retry": "0.13.1" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "before-after-hook": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", + "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserslist": { + "version": "4.17.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz", + "integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001274", + "electron-to-chromium": "^1.3.886", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true + }, + "cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001279", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001279.tgz", + "integrity": "sha512-VfEHpzHEXj6/CxggTwSFoZBBYGQfQv9Cf42KPlO79sWXCD1QNKWKsKzFeWL7QpZHJQYAvocqV6Rty1yJMkqWLQ==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "dev": true + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "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": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "cluster-key-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz", + "integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==" + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, + "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" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + } + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "deprecated-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deprecated-obj/-/deprecated-obj-2.0.0.tgz", + "integrity": "sha512-CkdywZC2rJ8RGh+y3MM1fw1EJ4oO/oNExGbRFv0AQoMS+faTd3nO7slYjkj/6t8OnIMUE+wxh6G97YHhK1ytrw==", + "dev": true, + "requires": { + "flat": "^5.0.2", + "lodash": "^4.17.20" + } + }, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.893", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.893.tgz", + "integrity": "sha512-ChtwF7qB03INq1SyMpue08wc6cve+ktj2UC/Y7se9vB+JryfzziJeYwsgb8jLaCA5GMkHCdn5M62PfSMWhifZg==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.2.0.tgz", + "integrity": "sha512-erw7XmM+CLxTOickrimJ1SiF55jiNlVSp2qqm0NuBWPtHYQCegD5ZMaW0c3i5ytPqL+SSLaCxdvQXFPLJn+ABw==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.0.4", + "@humanwhocodes/config-array": "^0.6.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^6.0.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.2.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "eslint-scope": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", + "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", + "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "dev": true + }, + "espree": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", + "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", + "dev": true, + "requires": { + "acorn": "^8.5.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^3.0.0" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=", + "dev": true + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "dev": true + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "generic-pool": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.8.2.tgz", + "integrity": "sha512-nGToKy6p3PAbYQ7p1UlWl6vSPwfwU6TMSWK7TTu+WUY4ZjyZQGniGGt2oNVvyNSpyZYSB43zMXVLcBm08MTMkg==" + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "git-up": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.5.tgz", + "integrity": "sha512-YUvVDg/vX3d0syBsk/CKUTib0srcQME0JyHkL5BaYdwLsiCslPWmDSi8PUMo9pXYjrryMcmsCoCgsTpSCJEQaA==", + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "parse-url": "^6.0.0" + } + }, + "git-url-parse": { + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.6.0.tgz", + "integrity": "sha512-WWUxvJs5HsyHL6L08wOusa/IXYtMuCAhrMmnTjQPpBU0TTHyDhnOATNH3xNQz7YOQUsqIIPTGr4xiVti1Hsk5g==", + "dev": true, + "requires": { + "git-up": "^4.0.0" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "requires": { + "ini": "2.0.0" + } + }, + "globals": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "got": { + "version": "11.8.2", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz", + "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==", + "dev": true, + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.1", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true + }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "dev": true + }, + "import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "dev": true, + "requires": { + "import-from": "^3.0.0" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, + "inquirer": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.5.tgz", + "integrity": "sha512-G6/9xUqmt/r+UvufSyrPpt84NYwhKZ9jLsgMbQzlx804XErNupor8WQdBnBRrXmBfTPpuwf1sV+ss2ovjgdXIg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.2.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "dev": true, + "requires": { + "ci-info": "^3.1.1" + } + }, + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "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" + } + }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + }, + "is-ssh": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.3.tgz", + "integrity": "sha512-NKzJmQzJfEEma3w5cJNcUMxoXfDjz0Zj0eyCalHn2E6VOwlzjZo0yuO2fcBSf8zhFuVCL/82/r5gRcoi6aEPVQ==", + "dev": true, + "requires": { + "protocols": "^1.1.0" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", + "integrity": "sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, + "just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "keyv": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz", + "integrity": "sha512-vqNHbAc8BBsxk+7QBYLW0Y219rWcClspR6WSeoHYKG5mnsSoOH+BL1pWq02DDCVdvvuUny5rkBlzMRzoqc+GIg==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, + "macos-release": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", + "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "marked": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", + "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "dev": true + }, + "mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "dev": true, + "requires": { + "mime-db": "1.49.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mocha": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", + "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", + "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.2", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.7", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.25", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.1.5", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "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 + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nanoid": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "new-github-release-url": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-1.0.0.tgz", + "integrity": "sha512-dle7yf655IMjyFUqn6Nxkb18r4AOAkzRcgcZv6WZ0IqrOH4QCEZ8Sm6I7XX21zvHdBeeMeTkhR9qT2Z0EJDx6A==", + "dev": true, + "requires": { + "type-fest": "^0.4.1" + }, + "dependencies": { + "type-fest": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", + "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "dev": true + } + } + }, + "nise": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.0.tgz", + "integrity": "sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^7.0.4", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node-fetch": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "onigasm": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz", + "integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==", + "dev": true, + "requires": { + "lru-cache": "^5.1.1" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, + "os-name": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", + "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", + "dev": true, + "requires": { + "macos-release": "^2.5.0", + "windows-release": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + } + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + } + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-path": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.3.tgz", + "integrity": "sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA==", + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "protocols": "^1.4.0", + "qs": "^6.9.4", + "query-string": "^6.13.8" + } + }, + "parse-url": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-6.0.0.tgz", + "integrity": "sha512-cYyojeX7yIIwuJzledIHeLUBVJ6COVLeT4eF+2P6aKVzwvgKQPndCBv3+yQ7pcWjqToYwaligxzSYNNmGoMAvw==", + "dev": true, + "requires": { + "is-ssh": "^1.3.0", + "normalize-url": "^6.1.0", + "parse-path": "^4.0.0", + "protocols": "^1.4.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "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", + "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, + "qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "query-string": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.14.1.tgz", + "integrity": "sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==", + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "redis": { + "version": "file:packages/all-in-one", + "requires": { + "@redis/client": "^1.0.0-rc", + "@redis/json": "^1.0.0-rc", + "@redis/search": "^1.0.0-rc", + "release-it": "^14.11.6", + "typescript": "^4.4.4" + } + }, + "redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=" + }, + "redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", + "requires": { + "redis-errors": "^1.0.0" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "release-it": { + "version": "14.11.6", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.11.6.tgz", + "integrity": "sha512-6BNcuzFZHThBUBJ/xYw/bxZ+58CAwrwf1zgmjq2Ibl3nlDZbjphHG6iqxkJu7mZ8TIWs6NjloEAhqpjeXoN//Q==", + "dev": true, + "requires": { + "@iarna/toml": "2.2.5", + "@octokit/rest": "18.10.0", + "async-retry": "1.3.3", + "chalk": "4.1.2", + "cosmiconfig": "7.0.1", + "debug": "4.3.2", + "deprecated-obj": "2.0.0", + "execa": "5.1.1", + "form-data": "4.0.0", + "git-url-parse": "11.6.0", + "globby": "11.0.4", + "got": "11.8.2", + "import-cwd": "3.0.0", + "inquirer": "8.1.5", + "is-ci": "3.0.0", + "lodash": "4.17.21", + "mime-types": "2.1.32", + "new-github-release-url": "1.0.0", + "open": "7.4.2", + "ora": "5.4.1", + "os-name": "4.0.1", + "parse-json": "5.2.0", + "semver": "7.3.5", + "shelljs": "0.8.4", + "update-notifier": "5.1.0", + "url-join": "4.0.1", + "uuid": "8.3.2", + "yaml": "1.10.2", + "yargs-parser": "20.2.9" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "responselike": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "dev": true, + "requires": { + "lowercase-keys": "^2.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rxjs": { + "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" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "shiki": { + "version": "0.9.12", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.12.tgz", + "integrity": "sha512-VXcROdldv0/Qu0w2XvzU4IrvTeBNs/Kj/FCmtcEXGz7Tic/veQzliJj6tEiAgoKianhQstpYmbPDStHU5Opqcw==", + "dev": true, + "requires": { + "jsonc-parser": "^3.0.0", + "onigasm": "^2.2.5", + "vscode-textmate": "5.2.0" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", + "dev": true + }, + "sinon": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", + "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^7.1.2", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + } + }, + "split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "string-width": { + "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.1" + } + }, + "strip-ansi": { + "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.1" + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "ts-node": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz", + "integrity": "sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "0.7.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typedoc": { + "version": "0.22.8", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.8.tgz", + "integrity": "sha512-92S+YzyhospdXN5rnkYUTgirdTYqNWY7NP9vco+IqQQoiSXzVSUsawVro+tMyEEsWUS7EMaJ2YOjB9uE0CBi6A==", + "dev": true, + "requires": { + "glob": "^7.2.0", + "lunr": "^2.3.9", + "marked": "^3.0.8", + "minimatch": "^3.0.4", + "shiki": "^0.9.12" + }, + "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-github-wiki-theme": { + "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.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" + } + }, + "typescript": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", + "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", + "dev": true + }, + "uglify-js": { + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz", + "integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==", + "dev": true, + "optional": true + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + }, + "update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dev": true, + "requires": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + } + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "vscode-textmate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", + "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "dev": true + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "requires": { + "string-width": "^4.0.0" + } + }, + "windows-release": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", + "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", + "dev": true, + "requires": { + "execa": "^4.0.2" + }, + "dependencies": { + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "workerpool": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", + "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + } + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} From 162ac4ce64c39db42066f767d908e90e9ad82387 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 9 Nov 2021 18:14:32 -0500 Subject: [PATCH 079/112] update CONTRIBUTING.md --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a041584e6fd..0243cc19359 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -45,7 +45,7 @@ A huge thank you to the original author of Node Redis, [Matthew Ranney](https:// Node Redis has a full test suite with coverage setup. -To run the tests, run `npm install` to install dependencies, then run `npm test`. +To run the tests, run `npm install` to install dependencies, then run `npm run build:tests-tools && npm test`. Note that the test suite assumes that [`docker`](https://www.docker.com/) is installed in your environment. From 3ad8a227eb2d98b99a515696a66b7c7bb12c95af Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 9 Nov 2021 18:24:01 -0500 Subject: [PATCH 080/112] update examples --- examples/README.md | 17 +++++++++-------- examples/search+json.js | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/examples/README.md b/examples/README.md index 9b285315219..aef0b38bdbb 100644 --- a/examples/README.md +++ b/examples/README.md @@ -2,13 +2,14 @@ This folder contains example scripts showing how to use Node Redis in different scenarios. -| File Name | Description | -|-----------------------------|--------------------------------------| -| `connect-as-acl-user.js` | Connect to Redis 6 using an ACL user | -| `blocking-list-pop.js` | Block until an element is pushed to a list | -| `lua-multi-incr.js` | Define a custom lua script that allows you to perform INCRBY on multiple keys | -| `command-with-modifiers.js` | Define a script that allows to run a command with several modifiers | -| `set-scan.js` | An example script that shows how to use the SSCAN iterator functionality | +| File Name | Description | +|-----------------------------|------------------------------------------------------------------------------------| +| `blocking-list-pop.js` | Block until an element is pushed to a list | +| `command-with-modifiers.js` | Define a script that allows to run a command with several modifiers | +| `connect-as-acl-user.js` | Connect to Redis 6 using an ACL user | +| `lua-multi-incr.js` | Define a custom lua script that allows you to perform INCRBY on multiple keys | +| `search+json.js` | Use [Redis Search](https://redisearch.io/) and [Redis JSON](https://redisjson.io/) | +| `set-scan.js` | An example script that shows how to use the SSCAN iterator functionality | ## Contributing @@ -46,7 +47,7 @@ When adding a new example, please follow these guidelines: * Leave an empty line at the end of your `.js` file * Update this `README.md` file to add your example to the table -Use [connect-as-acl-user.js](connect-as-acl-user.js) as a guide to develop a well formatted example script. +Use [connect-as-acl-user.js](./connect-as-acl-user.js) as a guide to develop a well formatted example script. ### Example Template diff --git a/examples/search+json.js b/examples/search+json.js index 43eaa2a158d..647daab6231 100644 --- a/examples/search+json.js +++ b/examples/search+json.js @@ -1,4 +1,4 @@ -// RediSearch & ReJSON example +// Use Redis Search and Redis JSON import { createClient, SchemaFieldTypes, AggregateGroupByReducers, AggregateSteps } from 'redis'; From 0e70f245c8514c5843556d183465d7c16343c4e9 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 9 Nov 2021 19:32:15 -0500 Subject: [PATCH 081/112] uncomment some tests --- packages/client/lib/client/index.spec.ts | 20 ++++++++++---------- packages/client/lib/commands/COMMAND.spec.ts | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/client/lib/client/index.spec.ts b/packages/client/lib/client/index.spec.ts index 21abe8a25f1..51dded18b1f 100644 --- a/packages/client/lib/client/index.spec.ts +++ b/packages/client/lib/client/index.spec.ts @@ -444,16 +444,16 @@ describe('Client', () => { } }); - // testUtils.testWithClient('executeIsolated', async client => { - // await client.sendCommand(['CLIENT', 'SETNAME', 'client']); - - // assert.equal( - // await client.executeIsolated(isolatedClient => - // isolatedClient.sendCommand(['CLIENT', 'GETNAME']) - // ), - // null - // ); - // }, GLOBAL.SERVERS.OPEN); + testUtils.testWithClient('executeIsolated', async client => { + await client.sendCommand(['CLIENT', 'SETNAME', 'client']); + + assert.equal( + await client.executeIsolated(isolatedClient => + isolatedClient.sendCommand(['CLIENT', 'GETNAME']) + ), + null + ); + }, GLOBAL.SERVERS.OPEN); async function killClient(client: RedisClientType): Promise { const onceErrorPromise = once(client, 'error'); diff --git a/packages/client/lib/commands/COMMAND.spec.ts b/packages/client/lib/commands/COMMAND.spec.ts index 04ceab2a07c..baad79845ab 100644 --- a/packages/client/lib/commands/COMMAND.spec.ts +++ b/packages/client/lib/commands/COMMAND.spec.ts @@ -11,7 +11,7 @@ describe('COMMAND', () => { ); }); - // testUtils.testWithClient('client.command', async client => { - // assertPingCommand((await client.command()).find(command => command.name === 'ping')); - // }, GLOBAL.SERVERS.OPEN); + testUtils.testWithClient('client.command', async client => { + assertPingCommand((await client.command()).find(command => command.name === 'ping')); + }, GLOBAL.SERVERS.OPEN); }); From 57539e7c3f1b72910c594ffa236a83daed8ca293 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 9 Nov 2021 19:32:31 -0500 Subject: [PATCH 082/112] fix test-utils --- packages/test-utils/lib/dockers.ts | 6 +++--- packages/test-utils/lib/index.ts | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/test-utils/lib/dockers.ts b/packages/test-utils/lib/dockers.ts index 29f93b9c825..28bd1e49057 100644 --- a/packages/test-utils/lib/dockers.ts +++ b/packages/test-utils/lib/dockers.ts @@ -1,8 +1,8 @@ import { createConnection } from 'net'; import { once } from 'events'; -import { RedisModules, RedisScripts } from '@redis/client/dist/lib/commands'; -import RedisClient, { RedisClientType } from '@redis/client/dist/lib/client'; -import { promiseTimeout } from '@redis/client/dist/lib/utils'; +import { RedisModules, RedisScripts } from '@redis/client/lib/commands'; +import RedisClient, { RedisClientType } from '@redis/client/lib/client'; +import { promiseTimeout } from '@redis/client/lib/utils'; import path from 'path'; import { promisify } from 'util'; import { exec } from 'child_process'; diff --git a/packages/test-utils/lib/index.ts b/packages/test-utils/lib/index.ts index e553e132894..f9a1fc1dbd9 100644 --- a/packages/test-utils/lib/index.ts +++ b/packages/test-utils/lib/index.ts @@ -1,6 +1,6 @@ -import { RedisModules, RedisScripts } from '@redis/client/dist/lib/commands'; -import RedisClient, { RedisClientOptions, RedisClientType } from '@redis/client/dist/lib/client'; -import RedisCluster, { RedisClusterOptions, RedisClusterType } from '@redis/client/dist/lib/cluster'; +import { RedisModules, RedisScripts } from '@redis/client/lib/commands'; +import RedisClient, { RedisClientOptions, RedisClientType } from '@redis/client/lib/client'; +import RedisCluster, { RedisClusterOptions, RedisClusterType } from '@redis/client/lib/cluster'; import { RedisServerDockerConfig, spawnRedisServer, spawnRedisCluster } from './dockers'; import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; From 38426fe2a48ac950f3c1cd130f63b6ed539494d9 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 9 Nov 2021 19:55:16 -0500 Subject: [PATCH 083/112] move "all-in-one" to root folder --- .github/workflows/tests.yml | 1 + .npmignore | 9 + examples/package.json | 2 +- examples/search+json.js | 2 - packages/all-in-one/index.ts => index.ts | 0 package-lock.json | 686 ++++++++++++----------- package.json | 32 +- packages/all-in-one/package.json | 27 - packages/all-in-one/tsconfig.json | 9 - packages/client/.npmignore | 1 - packages/client/package.json | 12 +- packages/client/tsconfig.json | 2 +- packages/json/tsconfig.json | 2 +- packages/search/tsconfig.json | 2 +- packages/test-utils/tsconfig.json | 2 +- tsconfig.base.json | 15 + tsconfig.json | 16 +- 17 files changed, 410 insertions(+), 410 deletions(-) create mode 100644 .npmignore rename packages/all-in-one/index.ts => index.ts (100%) delete mode 100644 packages/all-in-one/package.json delete mode 100644 packages/all-in-one/tsconfig.json create mode 100644 tsconfig.base.json diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e85f7e1fd56..a0152cea869 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -27,6 +27,7 @@ jobs: - name: Update npm run: npm i -g npm + if: ${{ matrix.node-version <= 14.x }} - name: Install Packages run: npm ci diff --git a/.npmignore b/.npmignore new file mode 100644 index 00000000000..0689fb63fe4 --- /dev/null +++ b/.npmignore @@ -0,0 +1,9 @@ +.github/ +.vscode/ +docs/ +examples/ +packages/ +.deepsource.toml +index.ts +tsconfig.base.json +tsconfig.json diff --git a/examples/package.json b/examples/package.json index 452d88cbe5d..65ba1442f7e 100644 --- a/examples/package.json +++ b/examples/package.json @@ -6,7 +6,7 @@ "private": true, "type": "module", "dependencies": { - "redis": "../packages/all-in-one" + "redis": "../" } } diff --git a/examples/search+json.js b/examples/search+json.js index 647daab6231..adc298289cd 100644 --- a/examples/search+json.js +++ b/examples/search+json.js @@ -7,8 +7,6 @@ async function searchPlusJson() { await client.connect(); - await client.flushAll(); - // Create an index await client.ft.create('users', { '$.name': { diff --git a/packages/all-in-one/index.ts b/index.ts similarity index 100% rename from packages/all-in-one/index.ts rename to index.ts diff --git a/package-lock.json b/package-lock.json index b9e9ed91405..2b4d4be9c61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,25 @@ { - "name": "redis-monorepo", + "name": "redis", + "version": "4.0.0-rc.3", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "redis-monorepo", + "name": "redis", + "version": "4.0.0-rc.3", + "license": "MIT", "workspaces": [ "./packages/*" ], + "dependencies": { + "@redis/client": "^1.0.0-rc", + "@redis/json": "^1.0.0-rc", + "@redis/search": "^1.0.0-rc" + }, "devDependencies": { - "@tsconfig/node12": "^1.0.9" + "@tsconfig/node12": "^1.0.9", + "release-it": "^14.11.6", + "typescript": "^4.4.4" } }, "node_modules/@babel/code-frame": { @@ -332,15 +342,6 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -480,6 +481,18 @@ "node": ">= 4" } }, + "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", @@ -531,6 +544,15 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -1246,18 +1268,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1423,10 +1433,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boxen/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "node_modules/boxen/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "engines": { "node": ">=10" @@ -1596,12 +1606,15 @@ } }, "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/caniuse-lite": { @@ -1657,18 +1670,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/ci-info": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", @@ -1834,6 +1835,12 @@ "safe-buffer": "~5.1.1" } }, + "node_modules/convert-source-map/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/cosmiconfig": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", @@ -2132,15 +2139,12 @@ } }, "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, "node_modules/eslint": { @@ -2247,6 +2251,18 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint/node_modules/eslint-scope": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", @@ -2269,6 +2285,18 @@ "node": ">=4.0" } }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/eslint/node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -2278,6 +2306,18 @@ "node": ">= 4" } }, + "node_modules/eslint/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/espree": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", @@ -2424,18 +2464,6 @@ "node": ">=8" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -2472,15 +2500,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -2735,9 +2754,9 @@ } }, "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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", @@ -2755,15 +2774,15 @@ } }, "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 6" } }, "node_modules/global-dirs": { @@ -2796,6 +2815,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/globby": { "version": "11.0.4", "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", @@ -3482,6 +3513,16 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-processinfo/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, "node_modules/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", @@ -3917,12 +3958,56 @@ "url": "https://opencollective.com/mochajs" } }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/mocha/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -3956,6 +4041,15 @@ "node": ">=10" } }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4130,6 +4224,15 @@ "node": ">=8.9" } }, + "node_modules/nyc/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/nyc/node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -5018,15 +5121,6 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -5065,10 +5159,6 @@ "node": ">= 0.10" } }, - "node_modules/redis": { - "resolved": "packages/all-in-one", - "link": true - }, "node_modules/redis-errors": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", @@ -5167,24 +5257,6 @@ "node": ">=10" } }, - "node_modules/release-it/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/release-it/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -5338,10 +5410,24 @@ } }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -5574,26 +5660,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -5639,15 +5705,12 @@ } }, "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/supports-color": { @@ -5835,9 +5898,9 @@ } }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "engines": { "node": ">=10" @@ -5899,26 +5962,6 @@ "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": { "version": "4.4.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", @@ -6043,13 +6086,12 @@ "dev": true }, "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache": { @@ -6291,9 +6333,9 @@ } }, "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, "engines": { "node": ">=10" @@ -6314,18 +6356,6 @@ "node": ">=10" } }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/yargs-unparser/node_modules/decamelize": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", @@ -6359,22 +6389,7 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/all-in-one": { - "name": "redis", - "version": "4.0.0-rc.3", - "license": "MIT", - "dependencies": { - "@redis/client": "^1.0.0-rc", - "@redis/json": "^1.0.0-rc", - "@redis/search": "^1.0.0-rc" - }, - "devDependencies": { - "release-it": "^14.11.6", - "typescript": "^4.4.4" - } - }, "packages/client": { - "name": "@redis/client", "version": "1.0.0-rc", "license": "MIT", "dependencies": { @@ -6407,7 +6422,6 @@ } }, "packages/json": { - "name": "@redis/json", "version": "1.0.0-rc.0", "license": "MIT", "devDependencies": { @@ -6425,7 +6439,6 @@ } }, "packages/search": { - "name": "@redis/search", "version": "1.0.0-rc.0", "license": "MIT", "devDependencies": { @@ -6443,7 +6456,6 @@ } }, "packages/test-utils": { - "name": "@redis/test-utils", "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@tsconfig/node12": "^1.0.9", @@ -6463,7 +6475,6 @@ } }, "packages/time-series": { - "name": "@redis/time-series", "version": "1.0.0", "license": "ISC", "devDependencies": { @@ -6727,12 +6738,6 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -6839,6 +6844,12 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true } } }, @@ -6887,6 +6898,12 @@ "sprintf-js": "~1.0.2" } }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -7505,14 +7522,6 @@ "dev": true, "requires": { "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } } }, "ansi-regex": { @@ -7639,10 +7648,10 @@ "wrap-ansi": "^7.0.0" }, "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true } } @@ -7762,9 +7771,9 @@ "dev": true }, "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true }, "caniuse-lite": { @@ -7803,17 +7812,6 @@ "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } } }, "ci-info": { @@ -7943,6 +7941,14 @@ "dev": true, "requires": { "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, "cosmiconfig": { @@ -8174,9 +8180,9 @@ "dev": true }, "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "eslint": { @@ -8225,6 +8231,12 @@ "v8-compile-cache": "^2.0.3" }, "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, "eslint-scope": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", @@ -8241,11 +8253,26 @@ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true } } }, @@ -8390,17 +8417,6 @@ "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } } }, "fast-json-stable-stringify": { @@ -8431,14 +8447,6 @@ "dev": true, "requires": { "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } } }, "file-entry-cache": { @@ -8620,9 +8628,9 @@ } }, "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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", @@ -8634,12 +8642,12 @@ } }, "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" } }, "global-dirs": { @@ -8658,6 +8666,14 @@ "dev": true, "requires": { "type-fest": "^0.20.2" + }, + "dependencies": { + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } } }, "globby": { @@ -9150,6 +9166,14 @@ "p-map": "^3.0.0", "rimraf": "^3.0.0", "uuid": "^3.3.3" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "istanbul-lib-report": { @@ -9487,12 +9511,38 @@ "yargs-unparser": "2.0.0" }, "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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" + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -9516,6 +9566,12 @@ "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true } } }, @@ -9659,6 +9715,12 @@ "yargs": "^15.0.2" }, "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, "cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -10336,12 +10398,6 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true } } }, @@ -10374,16 +10430,6 @@ "resolve": "^1.1.6" } }, - "redis": { - "version": "file:packages/all-in-one", - "requires": { - "@redis/client": "^1.0.0-rc", - "@redis/json": "^1.0.0-rc", - "@redis/search": "^1.0.0-rc", - "release-it": "^14.11.6", - "typescript": "^4.4.4" - } - }, "redis-errors": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", @@ -10456,20 +10502,6 @@ "uuid": "8.3.2", "yaml": "1.10.2", "yargs-parser": "20.2.9" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } } }, "release-zalgo": { @@ -10580,9 +10612,9 @@ } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, "safer-buffer": { @@ -10769,14 +10801,6 @@ "dev": true, "requires": { "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } } }, "string-width": { @@ -10812,9 +10836,9 @@ "dev": true }, "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, "supports-color": { @@ -10952,9 +10976,9 @@ "dev": true }, "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true }, "typedarray-to-buffer": { @@ -10977,22 +11001,6 @@ "marked": "^3.0.8", "minimatch": "^3.0.4", "shiki": "^0.9.12" - }, - "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-github-wiki-theme": { @@ -11109,9 +11117,9 @@ "dev": true }, "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, "v8-compile-cache": { @@ -11304,9 +11312,9 @@ } }, "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true }, "yargs-unparser": { @@ -11321,12 +11329,6 @@ "is-plain-obj": "^2.1.0" }, "dependencies": { - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, "decamelize": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", diff --git a/package.json b/package.json index e7de3fc8674..051abd3a75d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,9 @@ { - "name": "redis-monorepo", - "private": true, + "name": "redis", + "version": "4.0.0-rc.3", + "license": "MIT", + "main": "./dist/index.js", + "types": "./dist/index.d.ts", "workspaces": [ "./packages/*" ], @@ -9,11 +12,26 @@ "build:client": "npm run build -w ./packages/client", "build:test-utils": "npm run build -w ./packages/test-utils", "build:tests-tools": "npm run build:client && npm run build:test-utils", - "build:modules": "find ./packages -mindepth 1 -maxdepth 1 -type d ! -name 'client' ! -name 'test-utils' ! -name 'all-in-one' -exec npm run build -w {} \\;", - "build:all-in-one": "npm run build -w ./packages/all-in-one", - "build": "npm run build:client && npm run build:test-utils && npm run build:modules && npm run build:all-in-one" + "build:modules": "find ./packages -mindepth 1 -maxdepth 1 -type d ! -name 'client' ! -name 'test-utils' -exec npm run build -w {} \\;", + "build": "tsc", + "build-all": "npm run build:client && npm run build:test-utils && npm run build:modules && npm run build" + }, + "dependencies": { + "@redis/client": "^1.0.0-rc", + "@redis/json": "^1.0.0-rc", + "@redis/search": "^1.0.0-rc" }, "devDependencies": { - "@tsconfig/node12": "^1.0.9" - } + "@tsconfig/node12": "^1.0.9", + "release-it": "^14.11.6", + "typescript": "^4.4.4" + }, + "repository": { + "type": "git", + "url": "git://github.com/redis/node-redis.git" + }, + "bugs": { + "url": "https://github.com/redis/node-redis/issues" + }, + "homepage": "https://github.com/redis/node-redis" } diff --git a/packages/all-in-one/package.json b/packages/all-in-one/package.json deleted file mode 100644 index 1fcaa1697d0..00000000000 --- a/packages/all-in-one/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "redis", - "version": "4.0.0-rc.3", - "license": "MIT", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", - "scripts": { - "build": "tsc" - }, - "dependencies": { - "@redis/client": "^1.0.0-rc", - "@redis/json": "^1.0.0-rc", - "@redis/search": "^1.0.0-rc" - }, - "devDependencies": { - "release-it": "^14.11.6", - "typescript": "^4.4.4" - }, - "repository": { - "type": "git", - "url": "git://github.com/redis/node-redis.git" - }, - "bugs": { - "url": "https://github.com/redis/node-redis/issues" - }, - "homepage": "https://github.com/redis/node-redis" -} diff --git a/packages/all-in-one/tsconfig.json b/packages/all-in-one/tsconfig.json deleted file mode 100644 index 103760b874b..00000000000 --- a/packages/all-in-one/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "compilerOptions": { - "outDir": "./dist" - }, - "include": [ - "./index.ts" - ] - } diff --git a/packages/client/.npmignore b/packages/client/.npmignore index b7310e15767..9f9e21d98b8 100644 --- a/packages/client/.npmignore +++ b/packages/client/.npmignore @@ -1,7 +1,6 @@ .nyc_output/ coverage/ documentation/ -examples/ lib/ .nycrc.json dump.rdb diff --git a/packages/client/package.json b/packages/client/package.json index 812f742db84..0288ed25644 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -19,18 +19,18 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@redis/test-utils": "*", - "@types/node": "^16.11.6", + "@types/node": "^16.11.7", "@types/sinon": "^10.0.6", "@types/yallist": "^4.0.1", - "@typescript-eslint/eslint-plugin": "^5.2.0", - "@typescript-eslint/parser": "^5.2.0", - "eslint": "^8.1.0", + "@typescript-eslint/eslint-plugin": "^5.3.1", + "@typescript-eslint/parser": "^5.3.1", + "eslint": "^8.2.0", "nyc": "^15.1.0", "release-it": "^14.11.6", - "sinon": "^11.1.2", + "sinon": "^12.0.1", "source-map-support": "^0.5.20", "ts-node": "^10.4.0", - "typedoc": "^0.22.7", + "typedoc": "^0.22.8", "typedoc-github-wiki-theme": "^0.6.0", "typedoc-plugin-markdown": "^3.11.3", "typescript": "^4.4.4" diff --git a/packages/client/tsconfig.json b/packages/client/tsconfig.json index 1700c9097bf..3280af594ef 100644 --- a/packages/client/tsconfig.json +++ b/packages/client/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.json", + "extends": "../../tsconfig.base.json", "compilerOptions": { "outDir": "./dist" }, diff --git a/packages/json/tsconfig.json b/packages/json/tsconfig.json index fdb86c004cc..14fda1d8711 100644 --- a/packages/json/tsconfig.json +++ b/packages/json/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig", + "extends": "../../tsconfig.base.json", "compilerOptions": { "outDir": "./dist" }, diff --git a/packages/search/tsconfig.json b/packages/search/tsconfig.json index fdb86c004cc..14fda1d8711 100644 --- a/packages/search/tsconfig.json +++ b/packages/search/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig", + "extends": "../../tsconfig.base.json", "compilerOptions": { "outDir": "./dist" }, diff --git a/packages/test-utils/tsconfig.json b/packages/test-utils/tsconfig.json index fdb86c004cc..14fda1d8711 100644 --- a/packages/test-utils/tsconfig.json +++ b/packages/test-utils/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig", + "extends": "../../tsconfig.base.json", "compilerOptions": { "outDir": "./dist" }, diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 00000000000..d6cd971b01d --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,15 @@ +{ + "extends": "@tsconfig/node12/tsconfig.json", + "compilerOptions": { + "declaration": true, + "allowJs": true, + "useDefineForClassFields": true + }, + "files": [ + "./packages/client/lib/ts-declarations/cluster-key-slot.d.ts", + "./packages/client/lib/ts-declarations/redis-parser.d.ts" + ], + "ts-node": { + "files": true + } +} diff --git a/tsconfig.json b/tsconfig.json index fa46effbdcc..285b7ff0a97 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,15 +1,9 @@ { - "extends": "@tsconfig/node12/tsconfig", + "extends": "./tsconfig.base.json", "compilerOptions": { - "declaration": true, - "allowJs": true, - "useDefineForClassFields": true + "outDir": "./dist" }, - "files": [ - "./packages/client/lib/ts-declarations/cluster-key-slot.d.ts", - "./packages/client/lib/ts-declarations/redis-parser.d.ts" - ], - "ts-node": { - "files": true - } + "include": [ + "./index.ts" + ] } From 27a1fa7d1474d9707159dda19181acb72422b752 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 9 Nov 2021 19:57:04 -0500 Subject: [PATCH 084/112] fix tests workflow --- .github/workflows/tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a0152cea869..ad34df0b33a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [12.x, 14.x, 16.x] + node-version: [12, 14, 16] redis-version: [5, 6.0, 6.2] steps: @@ -27,7 +27,7 @@ jobs: - name: Update npm run: npm i -g npm - if: ${{ matrix.node-version <= 14.x }} + if: ${{ matrix.node-version <= 14 }} - name: Install Packages run: npm ci From f1f9c7ac241125b9bcb410f5ad14403a8a94fa20 Mon Sep 17 00:00:00 2001 From: leibale Date: Wed, 10 Nov 2021 14:20:46 -0500 Subject: [PATCH 085/112] fix bug in cluster slots, enhance live resharding test --- index.ts | 1 - packages/client/lib/cluster/cluster-slots.ts | 2 +- packages/client/lib/cluster/index.spec.ts | 6 ++++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/index.ts b/index.ts index 7913630a199..3bbb4c9d943 100644 --- a/index.ts +++ b/index.ts @@ -19,4 +19,3 @@ export function createClient>( modules }); } - diff --git a/packages/client/lib/cluster/cluster-slots.ts b/packages/client/lib/cluster/cluster-slots.ts index f65411d7974..4c53445b680 100644 --- a/packages/client/lib/cluster/cluster-slots.ts +++ b/packages/client/lib/cluster/cluster-slots.ts @@ -82,7 +82,7 @@ export default class RedisClusterSlots { 10 ); + await Promise.all( + cluster.getMasters().map(({ client }) => { + return client.clusterSetSlot(slot, ClusterSlotStates.NODE, to!.id); + }) + ); + // should be able to get the key from the new node assert.equal( await cluster.get(key), From 3d009780ee6eb388750d53263a168e3bedfd65a1 Mon Sep 17 00:00:00 2001 From: leibale Date: Wed, 10 Nov 2021 14:42:53 -0500 Subject: [PATCH 086/112] fix live resharding test --- packages/client/lib/cluster/index.spec.ts | 37 ++++++++++++----------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/packages/client/lib/cluster/index.spec.ts b/packages/client/lib/cluster/index.spec.ts index 395d44e1a3c..c926c02d03a 100644 --- a/packages/client/lib/cluster/index.spec.ts +++ b/packages/client/lib/cluster/index.spec.ts @@ -53,42 +53,43 @@ describe('Cluster', () => { await cluster.set(key, value); const slot = calculateSlot(key), - from = cluster.getSlotMaster(slot), - to = cluster.getMasters().find(node => node.id !== from.id); + source = cluster.getSlotMaster(slot), + destination = cluster.getMasters().find(node => node.id !== source.id)!; - await to!.client.clusterSetSlot(slot, ClusterSlotStates.IMPORTING, from.id); + await Promise.all([ + source.client.clusterSetSlot(slot, ClusterSlotStates.MIGRATING, destination.id), + destination.client.clusterSetSlot(slot, ClusterSlotStates.IMPORTING, destination.id) + ]); - // should be able to get the key from the original node before it was migrated + // should be able to get the key from the source node using "ASKING" assert.equal( await cluster.get(key), value ); - await from.client.clusterSetSlot(slot, ClusterSlotStates.MIGRATING, to!.id); + await Promise.all([ + source.client.migrate( + '127.0.0.1', + (destination.client.options).socket.port, + key, + 0, + 10 + ) + ]); - // should be able to get the key from the original node using the "ASKING" command + // should be able to get the key from the destination node using the "ASKING" command assert.equal( await cluster.get(key), value ); - const { port: toPort } = to!.client.options!.socket; - - await from.client.migrate( - '127.0.0.1', - toPort, - key, - 0, - 10 - ); - await Promise.all( cluster.getMasters().map(({ client }) => { - return client.clusterSetSlot(slot, ClusterSlotStates.NODE, to!.id); + return client.clusterSetSlot(slot, ClusterSlotStates.NODE, destination.id); }) ); - // should be able to get the key from the new node + // should handle "MOVED" errors assert.equal( await cluster.get(key), value From 53bc5647930ca03c6d33b0f67d370349125901a5 Mon Sep 17 00:00:00 2001 From: leibale Date: Wed, 10 Nov 2021 16:57:15 -0500 Subject: [PATCH 087/112] fix #1707 - handle number arguments in legacy mode --- packages/client/lib/client/index.spec.ts | 10 +++++----- packages/client/lib/client/index.ts | 16 +++++++++------- packages/client/lib/client/multi-command.ts | 6 +++--- packages/client/lib/commander.ts | 15 +++++++++++++++ 4 files changed, 32 insertions(+), 15 deletions(-) diff --git a/packages/client/lib/client/index.spec.ts b/packages/client/lib/client/index.spec.ts index 51dded18b1f..3f0bca45e27 100644 --- a/packages/client/lib/client/index.spec.ts +++ b/packages/client/lib/client/index.spec.ts @@ -1,6 +1,6 @@ import { strict as assert } from 'assert'; import testUtils, { GLOBAL, waitTillBeenCalled } from '../test-utils'; -import RedisClient, { RedisClientType } from '.'; +import RedisClient, { ClientLegacyCommandArguments, RedisClientType } from '.'; import { RedisClientMultiCommandType } from './multi-command'; import { RedisCommandArguments, RedisCommandRawReply, RedisModules, RedisScripts } from '../commands'; import { AbortError, ClientClosedError, ConnectionTimeoutError, DisconnectsClientError, SocketClosedUnexpectedlyError, WatchError } from '../errors'; @@ -170,7 +170,7 @@ describe('Client', () => { } }); - function setAsync(client: RedisClientType, ...args: Array): Promise { + function setAsync(client: RedisClientType, ...args: ClientLegacyCommandArguments): Promise { return new Promise((resolve, reject) => { (client as any).set(...args, (err: Error | undefined, reply: RedisCommandRawReply) => { if (err) return reject(err); @@ -204,10 +204,10 @@ describe('Client', () => { } }); - testUtils.testWithClient('client.{command} should accept mix of strings and array of strings', async client => { + testUtils.testWithClient('client.{command} should accept mix of arrays and arguments', async client => { assert.equal( - await setAsync(client, ['a'], 'b', ['XX']), - null + await setAsync(client, ['a'], 'b', ['EX', 1]), + 'OK' ); }, { ...GLOBAL.SERVERS.OPEN, diff --git a/packages/client/lib/client/index.ts b/packages/client/lib/client/index.ts index 40499cbf7c0..dd1bf833344 100644 --- a/packages/client/lib/client/index.ts +++ b/packages/client/lib/client/index.ts @@ -9,7 +9,7 @@ import { CommandOptions, commandOptions, isCommandOptions } from '../command-opt import { ScanOptions, ZMember } from '../commands/generic-transformers'; import { ScanCommandOptions } from '../commands/SCAN'; import { HScanTuple } from '../commands/HSCAN'; -import { extendWithCommands, extendWithModulesAndScripts, transformCommandArguments, transformCommandReply } from '../commander'; +import { extendWithCommands, extendWithModulesAndScripts, LegacyCommandArguments, transformCommandArguments, transformCommandReply, transformLegacyCommandArguments } from '../commander'; import { Pool, Options as PoolOptions, createPool } from 'generic-pool'; import { ClientClosedError, DisconnectsClientError } from '../errors'; import { URL } from 'url'; @@ -55,6 +55,7 @@ export interface ClientCommandOptions extends QueueCommandOptions { type ClientLegacyCallback = (err: Error | null, reply?: RedisCommandRawReply) => void; +export type ClientLegacyCommandArguments = LegacyCommandArguments | [...LegacyCommandArguments, ClientLegacyCallback]; export default class RedisClient extends EventEmitter { static commandOptions(options: ClientCommandOptions): CommandOptions { return commandOptions(options); @@ -246,12 +247,13 @@ export default class RedisClient if (!this.#options?.legacyMode) return; (this as any).#v4.sendCommand = this.#sendCommand.bind(this); - (this as any).sendCommand = (...args: Array): void => { - const callback = typeof args[args.length - 1] === 'function' ? - args[args.length - 1] as ClientLegacyCallback : - undefined, - actualArgs = !callback ? args : args.slice(0, -1); - this.#sendCommand(actualArgs.flat() as Array) + (this as any).sendCommand = (...args: ClientLegacyCommandArguments): void => { + let callback: ClientLegacyCallback; + if (typeof args[args.length - 1] === 'function') { + callback = args.pop() as ClientLegacyCallback; + } + + this.#sendCommand(transformLegacyCommandArguments(args as LegacyCommandArguments)) .then((reply: RedisCommandRawReply) => { if (!callback) return; diff --git a/packages/client/lib/client/multi-command.ts b/packages/client/lib/client/multi-command.ts index e4b2c165c8f..9c19d3d0687 100644 --- a/packages/client/lib/client/multi-command.ts +++ b/packages/client/lib/client/multi-command.ts @@ -1,7 +1,7 @@ import COMMANDS from './commands'; import { RedisCommand, RedisCommandArguments, RedisCommandRawReply, RedisModules, RedisPlugins, RedisScript, RedisScripts } from '../commands'; import RedisMultiCommand, { RedisMultiQueuedCommand } from '../multi-command'; -import { extendWithCommands, extendWithModulesAndScripts } from '../commander'; +import { extendWithCommands, extendWithModulesAndScripts, LegacyCommandArguments, transformLegacyCommandArguments } from '../commander'; type RedisClientMultiCommandSignature = (...args: Parameters) => RedisClientMultiCommandType; @@ -52,8 +52,8 @@ export default class RedisClientMultiCommand { #legacyMode(): void { this.v4.addCommand = this.addCommand.bind(this); - (this as any).addCommand = (...args: Array>): this => { - this.#multi.addCommand(args.flat()); + (this as any).addCommand = (...args: LegacyCommandArguments): this => { + this.#multi.addCommand(transformLegacyCommandArguments(args)); return this; }; this.v4.exec = this.exec.bind(this); diff --git a/packages/client/lib/commander.ts b/packages/client/lib/commander.ts index 5871c2f235b..50d416f5b5c 100644 --- a/packages/client/lib/commander.ts +++ b/packages/client/lib/commander.ts @@ -113,3 +113,18 @@ export function transformCommandReply( return command.transformReply(rawReply, preserved); } + +export type LegacyCommandArguments = Array; + +export function transformLegacyCommandArguments(args: LegacyCommandArguments, flat: RedisCommandArguments = []): RedisCommandArguments { + for (const arg of args) { + if (Array.isArray(arg)) { + transformLegacyCommandArguments(arg, flat); + continue; + } + + flat.push(typeof arg === 'number' ? arg.toString() : arg); + } + + return flat; +} From d4f63219af829a7f8bdcb683fa375989cd1e4f81 Mon Sep 17 00:00:00 2001 From: Da-Jin Chu Date: Wed, 10 Nov 2021 23:44:22 -0500 Subject: [PATCH 088/112] Add rejectedUnauthorized and other TLS options (#1708) --- packages/client/lib/client/socket.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/lib/client/socket.ts b/packages/client/lib/client/socket.ts index 3a816604718..630d0c7b411 100644 --- a/packages/client/lib/client/socket.ts +++ b/packages/client/lib/client/socket.ts @@ -22,7 +22,7 @@ export interface RedisUnixSocketOptions extends RedisSocketCommonOptions { path: string; } -export interface RedisTlsSocketOptions extends RedisNetSocketOptions, tls.SecureContextOptions { +export interface RedisTlsSocketOptions extends RedisNetSocketOptions, tls.SecureContextOptions, tls.CommonConnectionOption { tls: true; } From a6a1637686a9ef3804e7c588e82299e542277ad7 Mon Sep 17 00:00:00 2001 From: Leibale Eidelman Date: Thu, 11 Nov 2021 00:45:34 -0500 Subject: [PATCH 089/112] Update socket.ts --- packages/client/lib/client/socket.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/lib/client/socket.ts b/packages/client/lib/client/socket.ts index 630d0c7b411..81a3aa098a2 100644 --- a/packages/client/lib/client/socket.ts +++ b/packages/client/lib/client/socket.ts @@ -22,7 +22,7 @@ export interface RedisUnixSocketOptions extends RedisSocketCommonOptions { path: string; } -export interface RedisTlsSocketOptions extends RedisNetSocketOptions, tls.SecureContextOptions, tls.CommonConnectionOption { +export interface RedisTlsSocketOptions extends RedisNetSocketOptions, tls.SecureContextOptions, tls.CommonConnectionOptions { tls: true; } From 41423fe8aa71cc9da34e1b6e3c80fa5675093ae0 Mon Sep 17 00:00:00 2001 From: leibale Date: Thu, 11 Nov 2021 17:43:17 -0500 Subject: [PATCH 090/112] fix #1716 - decode username and password from url --- packages/client/lib/client/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/client/lib/client/index.ts b/packages/client/lib/client/index.ts index dd1bf833344..05c219ca524 100644 --- a/packages/client/lib/client/index.ts +++ b/packages/client/lib/client/index.ts @@ -101,11 +101,11 @@ export default class RedisClient } if (username) { - parsed.username = username; + parsed.username = decodeURIComponent(username); } if (password) { - parsed.password = password; + parsed.password = decodeURIComponent(password); } if (pathname.length > 1) { From ba66892b7c317a5ce696b7910685c8dd0728a22b Mon Sep 17 00:00:00 2001 From: leibale Date: Thu, 11 Nov 2021 18:50:32 -0500 Subject: [PATCH 091/112] fix some Z (sorted list) commands, increase commands test coverage --- .../client/lib/commands/COMMAND_INFO.spec.ts | 17 ++++++++++++++--- packages/client/lib/commands/HSET.ts | 2 +- packages/client/lib/commands/ZCOUNT.ts | 8 ++++---- packages/client/lib/commands/ZRANGE.spec.ts | 7 ------- packages/client/lib/commands/ZRANGE.ts | 6 +++--- packages/client/lib/commands/ZRANGEBYLEX.ts | 6 +++--- packages/client/lib/commands/ZRANGEBYSCORE.ts | 6 +++--- packages/client/lib/commands/ZRANGESTORE.ts | 14 ++++++++++---- .../lib/commands/generic-transformers.spec.ts | 17 +++++++++++++++++ .../client/lib/commands/generic-transformers.ts | 6 ++++++ 10 files changed, 61 insertions(+), 28 deletions(-) diff --git a/packages/client/lib/commands/COMMAND_INFO.spec.ts b/packages/client/lib/commands/COMMAND_INFO.spec.ts index 3b2672dcb6b..8e02409001c 100644 --- a/packages/client/lib/commands/COMMAND_INFO.spec.ts +++ b/packages/client/lib/commands/COMMAND_INFO.spec.ts @@ -30,7 +30,18 @@ describe('COMMAND INFO', () => { ); }); - testUtils.testWithClient('client.commandInfo', async client => { - assertPingCommand((await client.commandInfo(['PING']))[0]); - }, GLOBAL.SERVERS.OPEN); + describe('client.commandInfo', () => { + testUtils.testWithClient('PING', async client => { + assertPingCommand((await client.commandInfo(['PING']))[0]); + }, GLOBAL.SERVERS.OPEN); + + testUtils.testWithClient('DOSE_NOT_EXISTS', async client => { + assert.deepEqual( + await client.commandInfo(['DOSE_NOT_EXISTS']), + [null] + ); + }, GLOBAL.SERVERS.OPEN); + }); + + }); diff --git a/packages/client/lib/commands/HSET.ts b/packages/client/lib/commands/HSET.ts index 4c60b91ad89..f7c56c5768d 100644 --- a/packages/client/lib/commands/HSET.ts +++ b/packages/client/lib/commands/HSET.ts @@ -23,7 +23,7 @@ export function transformArguments(...[ key, value, fieldValue ]: SingleFieldArg pushMap(args, value); } else if (Array.isArray(value)) { pushTuples(args, value); - } else if (typeof value === 'object' && value !== null) { + } else { pushObject(args, value); } diff --git a/packages/client/lib/commands/ZCOUNT.ts b/packages/client/lib/commands/ZCOUNT.ts index a18ba0fd790..83a0710fa11 100644 --- a/packages/client/lib/commands/ZCOUNT.ts +++ b/packages/client/lib/commands/ZCOUNT.ts @@ -1,15 +1,15 @@ -import { transformArgumentNumberInfinity } from './generic-transformers'; +import { transformArgumentStringNumberInfinity } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; export const IS_READ_ONLY = true; -export function transformArguments(key: string, min: number, max: number): Array { +export function transformArguments(key: string, min: string | number, max: string | number): Array { return [ 'ZCOUNT', key, - transformArgumentNumberInfinity(min), - transformArgumentNumberInfinity(max) + transformArgumentStringNumberInfinity(min), + transformArgumentStringNumberInfinity(max) ]; } diff --git a/packages/client/lib/commands/ZRANGE.spec.ts b/packages/client/lib/commands/ZRANGE.spec.ts index 03687c2ba9d..a280aff0033 100644 --- a/packages/client/lib/commands/ZRANGE.spec.ts +++ b/packages/client/lib/commands/ZRANGE.spec.ts @@ -11,13 +11,6 @@ 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/packages/client/lib/commands/ZRANGE.ts b/packages/client/lib/commands/ZRANGE.ts index 391c5ca893e..3d30e0f8dd2 100644 --- a/packages/client/lib/commands/ZRANGE.ts +++ b/packages/client/lib/commands/ZRANGE.ts @@ -1,4 +1,4 @@ -import { transformArgumentNumberInfinity } from './generic-transformers'; +import { transformArgumentStringNumberInfinity } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -17,8 +17,8 @@ export function transformArguments(key: string, min: string | number, max: strin const args = [ 'ZRANGE', key, - typeof min === 'string' ? min : transformArgumentNumberInfinity(min), - typeof max === 'string' ? max : transformArgumentNumberInfinity(max) + transformArgumentStringNumberInfinity(min), + transformArgumentStringNumberInfinity(max) ]; switch (options?.BY) { diff --git a/packages/client/lib/commands/ZRANGEBYLEX.ts b/packages/client/lib/commands/ZRANGEBYLEX.ts index 7e2e7613b00..214d796da0a 100644 --- a/packages/client/lib/commands/ZRANGEBYLEX.ts +++ b/packages/client/lib/commands/ZRANGEBYLEX.ts @@ -1,5 +1,5 @@ import { RedisCommandArguments } from '.'; -import { transformArgumentNumberInfinity } from './generic-transformers'; +import { transformArgumentStringNumberInfinity } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -21,8 +21,8 @@ export function transformArguments( const args = [ 'ZRANGEBYLEX', key, - typeof min === 'string' ? min : transformArgumentNumberInfinity(min), - typeof max === 'string' ? max : transformArgumentNumberInfinity(max) + transformArgumentStringNumberInfinity(min), + transformArgumentStringNumberInfinity(max) ]; if (options?.LIMIT) { diff --git a/packages/client/lib/commands/ZRANGEBYSCORE.ts b/packages/client/lib/commands/ZRANGEBYSCORE.ts index 48dd8a415c6..f6097fad581 100644 --- a/packages/client/lib/commands/ZRANGEBYSCORE.ts +++ b/packages/client/lib/commands/ZRANGEBYSCORE.ts @@ -1,5 +1,5 @@ import { RedisCommandArguments } from '.'; -import { transformArgumentNumberInfinity } from './generic-transformers'; +import { transformArgumentStringNumberInfinity } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -21,8 +21,8 @@ export function transformArguments( const args = [ 'ZRANGEBYSCORE', key, - typeof min === 'string' ? min : transformArgumentNumberInfinity(min), - typeof max === 'string' ? max : transformArgumentNumberInfinity(max) + transformArgumentStringNumberInfinity(min), + transformArgumentStringNumberInfinity(max) ]; if (options?.LIMIT) { diff --git a/packages/client/lib/commands/ZRANGESTORE.ts b/packages/client/lib/commands/ZRANGESTORE.ts index 6ad75661668..c76afe61029 100644 --- a/packages/client/lib/commands/ZRANGESTORE.ts +++ b/packages/client/lib/commands/ZRANGESTORE.ts @@ -1,4 +1,4 @@ -import { transformArgumentNumberInfinity } from './generic-transformers'; +import { transformArgumentStringNumberInfinity } from './generic-transformers'; export const FIRST_KEY_INDEX = 1; @@ -12,13 +12,19 @@ interface ZRangeStoreOptions { WITHSCORES?: true; } -export function transformArguments(dst: string, src: string, min: number, max: number, options?: ZRangeStoreOptions): Array { +export function transformArguments( + dst: string, + src: string, + min: string | number, + max: string | number, + options?: ZRangeStoreOptions +): Array { const args = [ 'ZRANGESTORE', dst, src, - transformArgumentNumberInfinity(min), - transformArgumentNumberInfinity(max) + transformArgumentStringNumberInfinity(min), + transformArgumentStringNumberInfinity(max) ]; switch (options?.BY) { diff --git a/packages/client/lib/commands/generic-transformers.spec.ts b/packages/client/lib/commands/generic-transformers.spec.ts index 887d8720def..fa5c5086136 100644 --- a/packages/client/lib/commands/generic-transformers.spec.ts +++ b/packages/client/lib/commands/generic-transformers.spec.ts @@ -7,6 +7,7 @@ import { transformReplyNumberInfinityArray, transformReplyNumberInfinityNull, transformArgumentNumberInfinity, + transformArgumentStringNumberInfinity, transformReplyTuples, transformReplyStreamMessages, transformReplyStreamsMessages, @@ -175,6 +176,22 @@ describe('Generic Transformers', () => { }); }); + describe('transformArgumentStringNumberInfinity', () => { + it("'0.5'", () => { + assert.equal( + transformArgumentStringNumberInfinity('0.5'), + '0.5' + ); + }); + + it('0.5', () => { + assert.equal( + transformArgumentStringNumberInfinity(0.5), + '0.5' + ); + }); + }); + it('transformReplyTuples', () => { assert.deepEqual( transformReplyTuples(['key1', 'value1', 'key2', 'value2']), diff --git a/packages/client/lib/commands/generic-transformers.ts b/packages/client/lib/commands/generic-transformers.ts index a531e86b432..3075636e756 100644 --- a/packages/client/lib/commands/generic-transformers.ts +++ b/packages/client/lib/commands/generic-transformers.ts @@ -69,6 +69,12 @@ export function transformArgumentNumberInfinity(num: number): string { } } +export function transformArgumentStringNumberInfinity(num: string | number): string { + if (typeof num === 'string') return num; + + return transformArgumentNumberInfinity(num); +} + export interface TuplesObject { [field: string]: string; } From f93e28f8f2439a19bade4491903f5227848fd3bc Mon Sep 17 00:00:00 2001 From: leibale Date: Thu, 11 Nov 2021 18:52:31 -0500 Subject: [PATCH 092/112] remove empty lines --- packages/client/lib/commands/COMMAND_INFO.spec.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/client/lib/commands/COMMAND_INFO.spec.ts b/packages/client/lib/commands/COMMAND_INFO.spec.ts index 8e02409001c..d6488460484 100644 --- a/packages/client/lib/commands/COMMAND_INFO.spec.ts +++ b/packages/client/lib/commands/COMMAND_INFO.spec.ts @@ -42,6 +42,4 @@ describe('COMMAND INFO', () => { ); }, GLOBAL.SERVERS.OPEN); }); - - }); From a9337b414f84d89ab39e8cf361f73914eed14c9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrique=20Corr=C3=AAa?= <75134774+HeCorr@users.noreply.github.com> Date: Sun, 14 Nov 2021 17:52:59 -0300 Subject: [PATCH 093/112] fix 'Scenario' typo (#1720) --- docs/isolated-execution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/isolated-execution.md b/docs/isolated-execution.md index 78b34252a0f..1fd16b8f462 100644 --- a/docs/isolated-execution.md +++ b/docs/isolated-execution.md @@ -10,7 +10,7 @@ Below are several examples of how to use isolated execution. > NOTE: Behind the scences we're using [`generic-pool`](https://www.npmjs.com/package/generic-pool) to provide a pool of connections that can be isolated. Go there to learn more. -## The Simple Secnario +## The Simple Scenario This just isolates execution on a single connection. Do what you want with that connection: From 994d8dcbe1300aa9096676b171c1ce7e739320f3 Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 15 Nov 2021 16:00:28 -0500 Subject: [PATCH 094/112] update readmes, add createCluster to the `redis` package --- .github/README.md | 317 ++++++++++++++++++++++++++++++++++ README.md | 319 +---------------------------------- index.ts | 14 +- packages/client/README.md | 2 + packages/client/package.json | 2 +- packages/json/.npmignore | 5 + packages/json/README.md | 2 + packages/search/.npmignore | 5 + packages/search/README.md | 2 + 9 files changed, 349 insertions(+), 319 deletions(-) create mode 100644 .github/README.md create mode 100644 packages/client/README.md create mode 100644 packages/json/.npmignore create mode 100644 packages/json/README.md create mode 100644 packages/search/.npmignore create mode 100644 packages/search/README.md diff --git a/.github/README.md b/.github/README.md new file mode 100644 index 00000000000..b5894f6f708 --- /dev/null +++ b/.github/README.md @@ -0,0 +1,317 @@ +

+ + + +

Node Redis

+

+ + + +--- + +## Installation + +```bash +npm install redis@next +``` + +> :warning: The new interface is clean and cool, but if you have an existing code base, you'll want to read the [migration guide](./docs/v3-to-v4.md). + +## Usage + +### Basic Example + +```typescript +import { createClient } from 'redis'; + +(async () => { + const client = createClient(); + + client.on('error', (err) => console.log('Redis Client Error', err)); + + await client.connect(); + + await client.set('key', 'value'); + const value = await client.get('key'); +})(); +``` + +The above code connects to localhost on port 6379. To connect to a different host or port, use a connection string in the format `redis[s]://[[username][:password]@][host][:port][/db-number]`: + +```typescript +createClient({ + url: 'redis://alice:foobared@awesome.redis.server:6380' +}); +``` + +You can also use discrete parameters, UNIX sockets, and even TLS to connect. Details can be found in the [client configuration guide](./docs/client-configuration.md). + +### Redis Commands + +There is built-in support for all of the [out-of-the-box Redis commands](https://redis.io/commands). They are exposed using the raw Redis command names (`HSET`, `HGETALL`, etc.) and a friendlier camel-cased version (`hSet`, `hGetAll`, etc.): + +```typescript +// raw Redis commands +await client.HSET('key', 'field', 'value'); +await client.HGETALL('key'); + +// friendly JavaScript commands +await client.hSet('key', 'field', 'value'); +await client.hGetAll('key'); +``` + +Modifiers to commands are specified using a JavaScript object: + +```typescript +await client.set('key', 'value', { + EX: 10, + NX: true +}); +``` + +Replies will be transformed into useful data structures: + +```typescript +await client.hGetAll('key'); // { field1: 'value1', field2: 'value2' } +await client.hVals('key'); // ['value1', 'value2'] +``` + +### Unsupported Redis Commands + +If you want to run commands and/or use arguments that Node Redis doesn't know about (yet!) use `.sendCommand()`: + +```typescript +await client.sendCommand(['SET', 'key', 'value', 'NX']); // 'OK' + +await client.sendCommand(['HGETALL', 'key']); // ['key1', 'field1', 'key2', 'field2'] +``` + +### Transactions (Multi/Exec) + +Start a [transaction](https://redis.io/topics/transactions) by calling `.multi()`, then chaining your commands. When you're done, call `.exec()` and you'll get an array back with your results: + +```typescript +await client.set('another-key', 'another-value'); + +const [setKeyReply, otherKeyValue] = await client + .multi() + .set('key', 'value') + .get('another-key') + .exec(); // ['OK', 'another-value'] +``` + +You can also [watch](https://redis.io/topics/transactions#optimistic-locking-using-check-and-set) keys by calling `.watch()`. Your transaction will abort if any of the watched keys change. + +To dig deeper into transactions, check out the [Isolated Execution Guide](./docs/isolated-execution.md). + +### Blocking Commands + +Any command can be run on a new connection by specifying the `isolated` option. The newly created connection is closed when the command's `Promise` is fulfilled. + +This pattern works especially well for blocking commands—such as `BLPOP` and `BLMOVE`: + +```typescript +import { commandOptions } from 'redis'; + +const blPopPromise = client.blPop(commandOptions({ isolated: true }), 'key', 0); + +await client.lPush('key', ['1', '2']); + +await blPopPromise; // '2' +``` + +To learn more about isolated execution, check out the [guide](./docs/isolated-execution.md). + +### Pub/Sub + +Subscribing to a channel requires a dedicated stand-alone connection. You can easily get one by `.duplicate()`ing an existing Redis connection. + +```typescript +const subscriber = client.duplicate(); + +await subscriber.connect(); +``` + +Once you have one, simply subscribe and unsubscribe as needed: + +```typescript +await subscriber.subscribe('channel', (message) => { + console.log(message); // 'message' +}); + +await subscriber.pSubscribe('channe*', (message, channel) => { + console.log(message, channel); // 'message', 'channel' +}); + +await subscriber.unsubscribe('channel'); + +await subscriber.pUnsubscribe('channe*'); +``` + +Publish a message on a channel: + +```typescript +await publisher.publish('channel', 'message'); +``` + +### Scan Iterator + +[`SCAN`](https://redis.io/commands/scan) results can be looped over using [async iterators](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator): + +```typescript +for await (const key of client.scanIterator()) { + // use the key! + await client.get(key); +} +``` + +This works with `HSCAN`, `SSCAN`, and `ZSCAN` too: + +```typescript +for await (const { field, value } of client.hScanIterator('hash')) {} +for await (const member of client.sScanIterator('set')) {} +for await (const { score, member } of client.zScanIterator('sorted-set')) {} +``` + +You can override the default options by providing a configuration object: + +```typescript +client.scanIterator({ + TYPE: 'string', // `SCAN` only + MATCH: 'patter*', + COUNT: 100 +}); +``` + +### Lua Scripts + +Define new functions using [Lua scripts](https://redis.io/commands/eval) which execute on the Redis server: + +```typescript +import { createClient, defineScript } from 'redis'; + +(async () => { + const client = createClient({ + scripts: { + add: defineScript({ + NUMBER_OF_KEYS: 1, + SCRIPT: + 'local val = redis.pcall("GET", KEYS[1]);' + + 'return val + ARGV[1];', + transformArguments(key: string, toAdd: number): Array { + return [key, toAdd.toString()]; + }, + transformReply(reply: number): number { + return reply; + } + }) + } + }); + + await client.connect(); + + await client.set('key', '1'); + await client.add('key', 2); // 3 +})(); +``` + +### Disconnecting + +There are two functions that disconnect a client from the Redis server. In most scenarios you should use `.quit()` to ensure that pending commands are sent to Redis before closing a connection. + +#### `.QUIT()`/`.quit()` + +Gracefully close a client's connection to Redis, by sending the [`QUIT`](https://redis.io/commands/quit) command to the server. Before quitting, the client executes any remaining commands in its queue, and will receive replies from Redis for each of them. + +```typescript +const [ping, get, quit] = await Promise.all([ + client.ping(), + client.get('key'), + client.quit() +]); // ['PONG', null, 'OK'] + +try { + await client.get('key'); +} catch (err) { + // ClosedClient Error +} +``` + +#### `.disconnect()` + +Forcibly close a client's connection to Redis immediately. Calling `disconnect` will not send further pending commands to the Redis server, or wait for or parse outstanding responses. + +```typescript +await client.disconnect(); +``` + +### Auto-Pipelining + +Node Redis will automatically pipeline requests that are made during the same "tick". + +```typescript +client.set('Tm9kZSBSZWRpcw==', 'users:1'); +client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw=='); +``` + +Of course, if you don't do something with your Promises you're certain to get [unhandled Promise exceptions](https://nodejs.org/api/process.html#process_event_unhandledrejection). To take advantage of auto-pipelining and handle your Promises, use `Promise.all()`. + +```typescript +await Promise.all([ + client.set('Tm9kZSBSZWRpcw==', 'users:1'), + client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw==') +]); +``` + +### Clustering + +Check out the [Clustering Guide](./docs/clustering.md) when using Node Redis to connect to a Redis Cluster. + +## Supported Redis versions + +Node Redis is supported with the following versions of Redis: + +| Version | Supported | +|---------|--------------------| +| 6.2.z | :heavy_check_mark: | +| 6.0.z | :heavy_check_mark: | +| 5.y.z | :heavy_check_mark: | +| < 5.0 | :x: | + +> Node Redis should work with older versions of Redis, but it is not fully tested and we cannot offer support. + +## Packages + +| Name | Description | +|------------------------------------|------------------------------------------------------------| +| [redis](./packages/all-in-one) | | +| [@redis/client](./packages/client) | | +| [@redis/json](./packages/json) | [Redis JSON](https://oss.redis.com/redisjson/) commands | +| [@redis/search](./packages/search) | [Redis Search](https://oss.redis.com/redisearch/) commands | + +## Contributing + +If you'd like to contribute, check out the [contributing guide](CONTRIBUTING.md). + +Thank you to all the people who already contributed to Node Redis! + + + + + +## License + +This repository is licensed under the "MIT" license. See [LICENSE](LICENSE). diff --git a/README.md b/README.md index b5894f6f708..a98e6a261b2 100644 --- a/README.md +++ b/README.md @@ -1,317 +1,2 @@ -

- - - -

Node Redis

-

- - - ---- - -## Installation - -```bash -npm install redis@next -``` - -> :warning: The new interface is clean and cool, but if you have an existing code base, you'll want to read the [migration guide](./docs/v3-to-v4.md). - -## Usage - -### Basic Example - -```typescript -import { createClient } from 'redis'; - -(async () => { - const client = createClient(); - - client.on('error', (err) => console.log('Redis Client Error', err)); - - await client.connect(); - - await client.set('key', 'value'); - const value = await client.get('key'); -})(); -``` - -The above code connects to localhost on port 6379. To connect to a different host or port, use a connection string in the format `redis[s]://[[username][:password]@][host][:port][/db-number]`: - -```typescript -createClient({ - url: 'redis://alice:foobared@awesome.redis.server:6380' -}); -``` - -You can also use discrete parameters, UNIX sockets, and even TLS to connect. Details can be found in the [client configuration guide](./docs/client-configuration.md). - -### Redis Commands - -There is built-in support for all of the [out-of-the-box Redis commands](https://redis.io/commands). They are exposed using the raw Redis command names (`HSET`, `HGETALL`, etc.) and a friendlier camel-cased version (`hSet`, `hGetAll`, etc.): - -```typescript -// raw Redis commands -await client.HSET('key', 'field', 'value'); -await client.HGETALL('key'); - -// friendly JavaScript commands -await client.hSet('key', 'field', 'value'); -await client.hGetAll('key'); -``` - -Modifiers to commands are specified using a JavaScript object: - -```typescript -await client.set('key', 'value', { - EX: 10, - NX: true -}); -``` - -Replies will be transformed into useful data structures: - -```typescript -await client.hGetAll('key'); // { field1: 'value1', field2: 'value2' } -await client.hVals('key'); // ['value1', 'value2'] -``` - -### Unsupported Redis Commands - -If you want to run commands and/or use arguments that Node Redis doesn't know about (yet!) use `.sendCommand()`: - -```typescript -await client.sendCommand(['SET', 'key', 'value', 'NX']); // 'OK' - -await client.sendCommand(['HGETALL', 'key']); // ['key1', 'field1', 'key2', 'field2'] -``` - -### Transactions (Multi/Exec) - -Start a [transaction](https://redis.io/topics/transactions) by calling `.multi()`, then chaining your commands. When you're done, call `.exec()` and you'll get an array back with your results: - -```typescript -await client.set('another-key', 'another-value'); - -const [setKeyReply, otherKeyValue] = await client - .multi() - .set('key', 'value') - .get('another-key') - .exec(); // ['OK', 'another-value'] -``` - -You can also [watch](https://redis.io/topics/transactions#optimistic-locking-using-check-and-set) keys by calling `.watch()`. Your transaction will abort if any of the watched keys change. - -To dig deeper into transactions, check out the [Isolated Execution Guide](./docs/isolated-execution.md). - -### Blocking Commands - -Any command can be run on a new connection by specifying the `isolated` option. The newly created connection is closed when the command's `Promise` is fulfilled. - -This pattern works especially well for blocking commands—such as `BLPOP` and `BLMOVE`: - -```typescript -import { commandOptions } from 'redis'; - -const blPopPromise = client.blPop(commandOptions({ isolated: true }), 'key', 0); - -await client.lPush('key', ['1', '2']); - -await blPopPromise; // '2' -``` - -To learn more about isolated execution, check out the [guide](./docs/isolated-execution.md). - -### Pub/Sub - -Subscribing to a channel requires a dedicated stand-alone connection. You can easily get one by `.duplicate()`ing an existing Redis connection. - -```typescript -const subscriber = client.duplicate(); - -await subscriber.connect(); -``` - -Once you have one, simply subscribe and unsubscribe as needed: - -```typescript -await subscriber.subscribe('channel', (message) => { - console.log(message); // 'message' -}); - -await subscriber.pSubscribe('channe*', (message, channel) => { - console.log(message, channel); // 'message', 'channel' -}); - -await subscriber.unsubscribe('channel'); - -await subscriber.pUnsubscribe('channe*'); -``` - -Publish a message on a channel: - -```typescript -await publisher.publish('channel', 'message'); -``` - -### Scan Iterator - -[`SCAN`](https://redis.io/commands/scan) results can be looped over using [async iterators](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/asyncIterator): - -```typescript -for await (const key of client.scanIterator()) { - // use the key! - await client.get(key); -} -``` - -This works with `HSCAN`, `SSCAN`, and `ZSCAN` too: - -```typescript -for await (const { field, value } of client.hScanIterator('hash')) {} -for await (const member of client.sScanIterator('set')) {} -for await (const { score, member } of client.zScanIterator('sorted-set')) {} -``` - -You can override the default options by providing a configuration object: - -```typescript -client.scanIterator({ - TYPE: 'string', // `SCAN` only - MATCH: 'patter*', - COUNT: 100 -}); -``` - -### Lua Scripts - -Define new functions using [Lua scripts](https://redis.io/commands/eval) which execute on the Redis server: - -```typescript -import { createClient, defineScript } from 'redis'; - -(async () => { - const client = createClient({ - scripts: { - add: defineScript({ - NUMBER_OF_KEYS: 1, - SCRIPT: - 'local val = redis.pcall("GET", KEYS[1]);' + - 'return val + ARGV[1];', - transformArguments(key: string, toAdd: number): Array { - return [key, toAdd.toString()]; - }, - transformReply(reply: number): number { - return reply; - } - }) - } - }); - - await client.connect(); - - await client.set('key', '1'); - await client.add('key', 2); // 3 -})(); -``` - -### Disconnecting - -There are two functions that disconnect a client from the Redis server. In most scenarios you should use `.quit()` to ensure that pending commands are sent to Redis before closing a connection. - -#### `.QUIT()`/`.quit()` - -Gracefully close a client's connection to Redis, by sending the [`QUIT`](https://redis.io/commands/quit) command to the server. Before quitting, the client executes any remaining commands in its queue, and will receive replies from Redis for each of them. - -```typescript -const [ping, get, quit] = await Promise.all([ - client.ping(), - client.get('key'), - client.quit() -]); // ['PONG', null, 'OK'] - -try { - await client.get('key'); -} catch (err) { - // ClosedClient Error -} -``` - -#### `.disconnect()` - -Forcibly close a client's connection to Redis immediately. Calling `disconnect` will not send further pending commands to the Redis server, or wait for or parse outstanding responses. - -```typescript -await client.disconnect(); -``` - -### Auto-Pipelining - -Node Redis will automatically pipeline requests that are made during the same "tick". - -```typescript -client.set('Tm9kZSBSZWRpcw==', 'users:1'); -client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw=='); -``` - -Of course, if you don't do something with your Promises you're certain to get [unhandled Promise exceptions](https://nodejs.org/api/process.html#process_event_unhandledrejection). To take advantage of auto-pipelining and handle your Promises, use `Promise.all()`. - -```typescript -await Promise.all([ - client.set('Tm9kZSBSZWRpcw==', 'users:1'), - client.sAdd('users:1:tokens', 'Tm9kZSBSZWRpcw==') -]); -``` - -### Clustering - -Check out the [Clustering Guide](./docs/clustering.md) when using Node Redis to connect to a Redis Cluster. - -## Supported Redis versions - -Node Redis is supported with the following versions of Redis: - -| Version | Supported | -|---------|--------------------| -| 6.2.z | :heavy_check_mark: | -| 6.0.z | :heavy_check_mark: | -| 5.y.z | :heavy_check_mark: | -| < 5.0 | :x: | - -> Node Redis should work with older versions of Redis, but it is not fully tested and we cannot offer support. - -## Packages - -| Name | Description | -|------------------------------------|------------------------------------------------------------| -| [redis](./packages/all-in-one) | | -| [@redis/client](./packages/client) | | -| [@redis/json](./packages/json) | [Redis JSON](https://oss.redis.com/redisjson/) commands | -| [@redis/search](./packages/search) | [Redis Search](https://oss.redis.com/redisearch/) commands | - -## Contributing - -If you'd like to contribute, check out the [contributing guide](CONTRIBUTING.md). - -Thank you to all the people who already contributed to Node Redis! - - - - - -## License - -This repository is licensed under the "MIT" license. See [LICENSE](LICENSE). +# redis +The sources and docs for this package are in the main [node-redis](https://github.com/redis/node-redis) repo. diff --git a/index.ts b/index.ts index 3bbb4c9d943..610da7c2bdf 100644 --- a/index.ts +++ b/index.ts @@ -1,9 +1,12 @@ -import { createClient as _createClient } from '@redis/client'; +import { createClient as _createClient, createCluster as _createCluster } from '@redis/client'; import { RedisScripts } from '@redis/client/dist/lib/commands'; import { RedisClientOptions, RedisClientType } from '@redis/client/dist/lib/client'; +import { RedisClusterOptions, RedisClusterType } from '@redis/client/dist/lib/cluster'; import RedisJSON from '@redis/json'; import RediSearch from '@redis/search'; +export * from '@redis/client'; +export * from '@redis/json'; export * from '@redis/search'; const modules = { @@ -19,3 +22,12 @@ export function createClient>( modules }); } + +export function createCluster>( + options: Omit, 'modules'> +): RedisClusterType { + return _createCluster({ + ...options, + modules + }); +} diff --git a/packages/client/README.md b/packages/client/README.md new file mode 100644 index 00000000000..d9c8f80f2f3 --- /dev/null +++ b/packages/client/README.md @@ -0,0 +1,2 @@ +# @redis/client +The sources and docs for this package are in the main [node-redis](https://github.com/redis/node-redis) repo. diff --git a/packages/client/package.json b/packages/client/package.json index 0288ed25644..88f40a4b19d 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -45,5 +45,5 @@ "bugs": { "url": "https://github.com/redis/node-redis/issues" }, - "homepage": "https://github.com/redis/node-redis" + "homepage": "https://github.com/redis/node-redis/tree/master/packages/client" } diff --git a/packages/json/.npmignore b/packages/json/.npmignore new file mode 100644 index 00000000000..6b24efa5953 --- /dev/null +++ b/packages/json/.npmignore @@ -0,0 +1,5 @@ +.nyc_output/ +coverage/ +lib/ +.nycrc.json +tsconfig.json diff --git a/packages/json/README.md b/packages/json/README.md new file mode 100644 index 00000000000..45264d671b4 --- /dev/null +++ b/packages/json/README.md @@ -0,0 +1,2 @@ +# @redis/json +The sources and docs for this package are in the main [node-redis](https://github.com/redis/node-redis) repo. diff --git a/packages/search/.npmignore b/packages/search/.npmignore new file mode 100644 index 00000000000..6b24efa5953 --- /dev/null +++ b/packages/search/.npmignore @@ -0,0 +1,5 @@ +.nyc_output/ +coverage/ +lib/ +.nycrc.json +tsconfig.json diff --git a/packages/search/README.md b/packages/search/README.md new file mode 100644 index 00000000000..08db1a72dcf --- /dev/null +++ b/packages/search/README.md @@ -0,0 +1,2 @@ +# @redis/search +The sources and docs for this package are in the main [node-redis](https://github.com/redis/node-redis) repo. From 3979e30222bbb00c60d1129f14fb5fc722e48832 Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 15 Nov 2021 16:42:34 -0500 Subject: [PATCH 095/112] add .release-it.json files, update some md files --- .github/README.md | 28 +++++++++++----------------- .release-it.json | 5 +++++ docs/client-configuration.md | 2 +- packages/client/.release-it.json | 5 +++++ packages/json/.release-it.json | 5 +++++ packages/search/.release-it.json | 5 +++++ 6 files changed, 32 insertions(+), 18 deletions(-) create mode 100644 .release-it.json create mode 100644 packages/client/.release-it.json create mode 100644 packages/json/.release-it.json create mode 100644 packages/search/.release-it.json diff --git a/.github/README.md b/.github/README.md index b5894f6f708..6bc4458828d 100644 --- a/.github/README.md +++ b/.github/README.md @@ -9,12 +9,6 @@ Coverage - - Downloads - - - Version - Chat @@ -28,7 +22,7 @@ npm install redis@next ``` -> :warning: The new interface is clean and cool, but if you have an existing code base, you'll want to read the [migration guide](./docs/v3-to-v4.md). +> :warning: The new interface is clean and cool, but if you have an existing code base, you'll want to read the [migration guide](../docs/v3-to-v4.md). ## Usage @@ -57,7 +51,7 @@ createClient({ }); ``` -You can also use discrete parameters, UNIX sockets, and even TLS to connect. Details can be found in the [client configuration guide](./docs/client-configuration.md). +You can also use discrete parameters, UNIX sockets, and even TLS to connect. Details can be found in the [client configuration guide](../docs/client-configuration.md). ### Redis Commands @@ -115,7 +109,7 @@ const [setKeyReply, otherKeyValue] = await client You can also [watch](https://redis.io/topics/transactions#optimistic-locking-using-check-and-set) keys by calling `.watch()`. Your transaction will abort if any of the watched keys change. -To dig deeper into transactions, check out the [Isolated Execution Guide](./docs/isolated-execution.md). +To dig deeper into transactions, check out the [Isolated Execution Guide](../docs/isolated-execution.md). ### Blocking Commands @@ -133,7 +127,7 @@ await client.lPush('key', ['1', '2']); await blPopPromise; // '2' ``` -To learn more about isolated execution, check out the [guide](./docs/isolated-execution.md). +To learn more about isolated execution, check out the [guide](../docs/isolated-execution.md). ### Pub/Sub @@ -278,7 +272,7 @@ await Promise.all([ ### Clustering -Check out the [Clustering Guide](./docs/clustering.md) when using Node Redis to connect to a Redis Cluster. +Check out the [Clustering Guide](../docs/clustering.md) when using Node Redis to connect to a Redis Cluster. ## Supported Redis versions @@ -295,12 +289,12 @@ Node Redis is supported with the following versions of Redis: ## Packages -| Name | Description | -|------------------------------------|------------------------------------------------------------| -| [redis](./packages/all-in-one) | | -| [@redis/client](./packages/client) | | -| [@redis/json](./packages/json) | [Redis JSON](https://oss.redis.com/redisjson/) commands | -| [@redis/search](./packages/search) | [Redis Search](https://oss.redis.com/redisearch/) commands | +| Name | Description | +|-------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [redis](../) | [![Downloads](https://img.shields.io/npm/dm/redis.svg)](https://www.npmjs.com/package/redis/v/next) [![Version](https://img.shields.io/npm/v/redis/next.svg)](https://www.npmjs.com/package/redis/v/next) | +| [@redis/client](../packages/client) | [![Downloads](https://img.shields.io/npm/dm/@redis/client.svg)](https://www.npmjs.com/package/@redis/client/v/next) [![Version](https://img.shields.io/npm/v/@redis/client/next.svg)](https://www.npmjs.com/package/@redis/client/v/next) | +| [@redis/json](../packages/json) | [![Downloads](https://img.shields.io/npm/dm/@redis/json.svg)](https://www.npmjs.com/package/@redis/json/v/next) [![Version](https://img.shields.io/npm/v/@redis/json/next.svg)](https://www.npmjs.com/package/@redis/json/v/next) [Redis JSON](https://oss.redis.com/redisjson/) commands | +| [@redis/search](../packages/search) | [![Downloads](https://img.shields.io/npm/dm/@redis/search.svg)](https://www.npmjs.com/package/@redis/search/v/next) [![Version](https://img.shields.io/npm/v/@redis/search/next.svg)](https://www.npmjs.com/package/@redis/search/v/next) [Redis Search](https://oss.redis.com/redisearch/) commands | ## Contributing diff --git a/.release-it.json b/.release-it.json new file mode 100644 index 00000000000..984af58564a --- /dev/null +++ b/.release-it.json @@ -0,0 +1,5 @@ +{ + "git": { + "tagName": "redis@${version}" + } +} \ No newline at end of file diff --git a/docs/client-configuration.md b/docs/client-configuration.md index 3b6b7dcad73..1dbbdd8cba2 100644 --- a/docs/client-configuration.md +++ b/docs/client-configuration.md @@ -15,7 +15,7 @@ | username | | ACL username ([see ACL guide](https://redis.io/topics/acl)) | | password | | ACL password or the old "--requirepass" password | | database | | Database number to connect to (see [`SELECT`](https://redis.io/commands/select) command) | -| modules | | Object defining which [Redis Modules](../../README.md#modules) to include | +| modules | | Object defining which [Redis Modules](../.github/README.md#packages) to include | | scripts | | Object defining Lua Scripts to use with this client (see [Lua Scripts](../README.md#lua-scripts)) | | commandsQueueMaxLength | | Maximum length of the client's internal command queue | | readonly | `false` | Connect in [`READONLY`](https://redis.io/commands/readonly) mode | diff --git a/packages/client/.release-it.json b/packages/client/.release-it.json new file mode 100644 index 00000000000..d8e2b65186a --- /dev/null +++ b/packages/client/.release-it.json @@ -0,0 +1,5 @@ +{ + "git": { + "tagName": "client@${version}" + } +} \ No newline at end of file diff --git a/packages/json/.release-it.json b/packages/json/.release-it.json new file mode 100644 index 00000000000..3486f4456ad --- /dev/null +++ b/packages/json/.release-it.json @@ -0,0 +1,5 @@ +{ + "git": { + "tagName": "json@${version}" + } +} \ No newline at end of file diff --git a/packages/search/.release-it.json b/packages/search/.release-it.json new file mode 100644 index 00000000000..c181fc970b1 --- /dev/null +++ b/packages/search/.release-it.json @@ -0,0 +1,5 @@ +{ + "git": { + "tagName": "search@${version}" + } +} \ No newline at end of file From ddf539ad5fa9d515d5d0bace33805f73dfa00bdd Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 15 Nov 2021 16:45:10 -0500 Subject: [PATCH 096/112] run tests on pull requests too --- .github/workflows/documentation.yml | 5 ----- .github/workflows/tests.yml | 11 ++++------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 9575d4639b9..861010b7f01 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -9,21 +9,16 @@ on: jobs: documentation: runs-on: ubuntu-latest - steps: - uses: actions/checkout@v2.3.4 with: fetch-depth: 1 - - name: Use Node.js uses: actions/setup-node@v2.3.0 - - name: Install Packages run: npm ci - - name: Generate Documentation run: npm run documentation - - name: Upload Documentation to Wiki uses: SwiftDocOrg/github-wiki-publish-action@v1 with: diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ad34df0b33a..f8e68c0e203 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -5,6 +5,10 @@ on: branches: - master - v4.0 + pull_request: + branches: + - master + - v4.0 jobs: tests: @@ -14,30 +18,23 @@ jobs: matrix: node-version: [12, 14, 16] redis-version: [5, 6.0, 6.2] - steps: - uses: actions/checkout@v2.3.4 with: fetch-depth: 1 - - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v2.3.0 with: node-version: ${{ matrix.node-version }} - - name: Update npm run: npm i -g npm if: ${{ matrix.node-version <= 14 }} - - name: Install Packages run: npm ci - - name: Build tests tools run: npm run build:tests-tools - - name: Run Tests run: npm run test -- --forbid-only --redis-version=${{ matrix.redis-version }} - - name: Upload to Codecov run: | curl https://keybase.io/codecovsecurity/pgp_keys.asc | gpg --no-default-keyring --keyring trustedkeys.gpg --import From 7d2629f083b6067c8986162cba48f5d5349e66d7 Mon Sep 17 00:00:00 2001 From: Evert Pot Date: Mon, 15 Nov 2021 16:52:48 -0500 Subject: [PATCH 097/112] Support esModuleInterop set to false. (#1717) * Support esModuleInterop set to false. When testing the upcoming 4.x release, we got a bunch of typescript errors emitted from this project. We quickly realized this is because the library uses the esModuleInterop flag. This makes some imports _slightly_ easier to write, but it comes at a cost: it forces any application or library using this library to *also* have esModuleInterop on. The `esModuleInterop` flag is a bit of a holdover from an earlier time, and I would not recommend using it in libraries. The main issue is that if it's set to true, you are forcing any users of the library to also have `esModuleInterop`, where if you keep have it set to `false` (the default), you leave the decision to the user. This change should have no rammifications to users with `esModuleInterop` on, but it will enable support for those that have it off. This is especially good for library authors such as myself, because I would also like to keep this flag off to not force *my* users into this feature. * All tests now pass! * Move @types/redis-parser into client sub-package and removed a comma --- package-lock.json | 116 ++++++++++++------ packages/client/lib/client/commands-queue.ts | 8 +- packages/client/lib/client/index.ts | 2 +- packages/client/lib/client/socket.ts | 6 +- packages/client/lib/cluster/cluster-slots.ts | 6 +- packages/client/lib/cluster/index.spec.ts | 6 +- .../lib/ts-declarations/redis-parser.d.ts | 15 --- packages/client/package.json | 1 + packages/test-utils/lib/dockers.ts | 2 +- tsconfig.base.json | 6 +- 10 files changed, 104 insertions(+), 64 deletions(-) delete mode 100644 packages/client/lib/ts-declarations/redis-parser.d.ts diff --git a/package-lock.json b/package-lock.json index 2b4d4be9c61..22f8983cac2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -836,10 +836,6 @@ "resolved": "packages/test-utils", "link": true }, - "node_modules/@redis/time-series": { - "resolved": "packages/time-series", - "link": true - }, "node_modules/@sindresorhus/is": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", @@ -974,6 +970,22 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "node_modules/@types/redis-errors": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/redis-errors/-/redis-errors-1.2.1.tgz", + "integrity": "sha512-9p6SQPeDAIR4z3ZdrPsRH/sSRMeIA2fdRKqZ3Y1thQOLeDH4aLY+J4Ze32zjg4Dq7655Y0LonCoRrH5O7vtr4w==", + "dev": true + }, + "node_modules/@types/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-TH9NnE980dXWKjFRkck6FIv9akrD6G+vX9XXONoBgG9+NfP4iZ+SbGkaN7S15c6+JeZ+zBN62bHt2lNyUYwqoA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/redis-errors": "*" + } + }, "node_modules/@types/responselike": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", @@ -5556,13 +5568,13 @@ "dev": true }, "node_modules/sinon": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", - "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-12.0.1.tgz", + "integrity": "sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg==", "dev": true, "dependencies": { "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^7.1.2", + "@sinonjs/fake-timers": "^8.1.0", "@sinonjs/samsam": "^6.0.2", "diff": "^5.0.0", "nise": "^5.1.0", @@ -5573,6 +5585,15 @@ "url": "https://opencollective.com/sinon" } }, + "node_modules/sinon/node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -6390,6 +6411,7 @@ } }, "packages/client": { + "name": "@redis/client", "version": "1.0.0-rc", "license": "MIT", "dependencies": { @@ -6401,18 +6423,19 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@redis/test-utils": "*", - "@types/node": "^16.11.6", + "@types/node": "^16.11.7", + "@types/redis-parser": "^3.0.0", "@types/sinon": "^10.0.6", "@types/yallist": "^4.0.1", - "@typescript-eslint/eslint-plugin": "^5.2.0", - "@typescript-eslint/parser": "^5.2.0", - "eslint": "^8.1.0", + "@typescript-eslint/eslint-plugin": "^5.3.1", + "@typescript-eslint/parser": "^5.3.1", + "eslint": "^8.2.0", "nyc": "^15.1.0", "release-it": "^14.11.6", - "sinon": "^11.1.2", + "sinon": "^12.0.1", "source-map-support": "^0.5.20", "ts-node": "^10.4.0", - "typedoc": "^0.22.7", + "typedoc": "^0.22.8", "typedoc-github-wiki-theme": "^0.6.0", "typedoc-plugin-markdown": "^3.11.3", "typescript": "^4.4.4" @@ -6422,6 +6445,7 @@ } }, "packages/json": { + "name": "@redis/json", "version": "1.0.0-rc.0", "license": "MIT", "devDependencies": { @@ -6439,6 +6463,7 @@ } }, "packages/search": { + "name": "@redis/search", "version": "1.0.0-rc.0", "license": "MIT", "devDependencies": { @@ -6456,6 +6481,7 @@ } }, "packages/test-utils": { + "name": "@redis/test-utils", "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@tsconfig/node12": "^1.0.9", @@ -6476,6 +6502,7 @@ }, "packages/time-series": { "version": "1.0.0", + "extraneous": true, "license": "ISC", "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", @@ -7129,21 +7156,22 @@ "requires": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@redis/test-utils": "*", - "@types/node": "^16.11.6", + "@types/node": "^16.11.7", + "@types/redis-parser": "*", "@types/sinon": "^10.0.6", "@types/yallist": "^4.0.1", - "@typescript-eslint/eslint-plugin": "^5.2.0", - "@typescript-eslint/parser": "^5.2.0", + "@typescript-eslint/eslint-plugin": "^5.3.1", + "@typescript-eslint/parser": "^5.3.1", "cluster-key-slot": "1.1.0", - "eslint": "^8.1.0", + "eslint": "^8.2.0", "generic-pool": "3.8.2", "nyc": "^15.1.0", "redis-parser": "3.0.0", "release-it": "^14.11.6", - "sinon": "^11.1.2", + "sinon": "^12.0.1", "source-map-support": "^0.5.20", "ts-node": "^10.4.0", - "typedoc": "^0.22.7", + "typedoc": "^0.22.8", "typedoc-github-wiki-theme": "^0.6.0", "typedoc-plugin-markdown": "^3.11.3", "typescript": "^4.4.4", @@ -7193,19 +7221,6 @@ "yargs": "^17.2.1" } }, - "@redis/time-series": { - "version": "file:packages/time-series", - "requires": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@redis/test-utils": "*", - "@types/node": "^16.11.6", - "nyc": "^15.1.0", - "release-it": "^14.11.6", - "source-map-support": "^0.5.20", - "ts-node": "^10.4.0", - "typescript": "^4.4.4" - } - }, "@sindresorhus/is": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", @@ -7331,6 +7346,22 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "@types/redis-errors": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/redis-errors/-/redis-errors-1.2.1.tgz", + "integrity": "sha512-9p6SQPeDAIR4z3ZdrPsRH/sSRMeIA2fdRKqZ3Y1thQOLeDH4aLY+J4Ze32zjg4Dq7655Y0LonCoRrH5O7vtr4w==", + "dev": true + }, + "@types/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-TH9NnE980dXWKjFRkck6FIv9akrD6G+vX9XXONoBgG9+NfP4iZ+SbGkaN7S15c6+JeZ+zBN62bHt2lNyUYwqoA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/redis-errors": "*" + } + }, "@types/responselike": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", @@ -10719,17 +10750,28 @@ "dev": true }, "sinon": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", - "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-12.0.1.tgz", + "integrity": "sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg==", "dev": true, "requires": { "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^7.1.2", + "@sinonjs/fake-timers": "^8.1.0", "@sinonjs/samsam": "^6.0.2", "diff": "^5.0.0", "nise": "^5.1.0", "supports-color": "^7.2.0" + }, + "dependencies": { + "@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + } } }, "slash": { diff --git a/packages/client/lib/client/commands-queue.ts b/packages/client/lib/client/commands-queue.ts index 4e2a66c606e..4fcae1e8b63 100644 --- a/packages/client/lib/client/commands-queue.ts +++ b/packages/client/lib/client/commands-queue.ts @@ -1,8 +1,12 @@ -import LinkedList from 'yallist'; -import RedisParser from 'redis-parser'; +import * as LinkedList from 'yallist'; import { AbortError } from '../errors'; import { RedisCommandArguments, RedisCommandRawReply } from '../commands'; +// We need to use 'require', because it's not possible with Typescript to import +// classes that are exported as 'module.exports = class`, without esModuleInterop +// set to true. +const RedisParser = require('redis-parser'); + export interface QueueCommandOptions { asap?: boolean; chainId?: symbol; diff --git a/packages/client/lib/client/index.ts b/packages/client/lib/client/index.ts index 05c219ca524..8802631eda1 100644 --- a/packages/client/lib/client/index.ts +++ b/packages/client/lib/client/index.ts @@ -4,7 +4,7 @@ import RedisSocket, { RedisSocketOptions, RedisNetSocketOptions, RedisTlsSocketO import RedisCommandsQueue, { PubSubListener, PubSubSubscribeCommands, PubSubUnsubscribeCommands, QueueCommandOptions } from './commands-queue'; import RedisClientMultiCommand, { RedisClientMultiCommandType } from './multi-command'; import { RedisMultiQueuedCommand } from '../multi-command'; -import EventEmitter from 'events'; +import { EventEmitter } from 'events'; import { CommandOptions, commandOptions, isCommandOptions } from '../command-options'; import { ScanOptions, ZMember } from '../commands/generic-transformers'; import { ScanCommandOptions } from '../commands/SCAN'; diff --git a/packages/client/lib/client/socket.ts b/packages/client/lib/client/socket.ts index 81a3aa098a2..d42b42d64d6 100644 --- a/packages/client/lib/client/socket.ts +++ b/packages/client/lib/client/socket.ts @@ -1,6 +1,6 @@ -import EventEmitter from 'events'; -import net from 'net'; -import tls from 'tls'; +import { EventEmitter } from 'events'; +import * as net from 'net'; +import * as tls from 'tls'; import { encodeCommand } from '../commander'; import { RedisCommandArguments } from '../commands'; import { ConnectionTimeoutError, ClientClosedError, SocketClosedUnexpectedlyError } from '../errors'; diff --git a/packages/client/lib/cluster/cluster-slots.ts b/packages/client/lib/cluster/cluster-slots.ts index 4c53445b680..ff4c79b4d36 100644 --- a/packages/client/lib/cluster/cluster-slots.ts +++ b/packages/client/lib/cluster/cluster-slots.ts @@ -1,9 +1,13 @@ -import calculateSlot from 'cluster-key-slot'; import RedisClient, { InstantiableRedisClient, RedisClientType } from '../client'; import { RedisClusterMasterNode, RedisClusterReplicaNode } from '../commands/CLUSTER_NODES'; import { RedisClusterClientOptions, RedisClusterOptions } from '.'; import { RedisModules, RedisScripts } from '../commands'; +// We need to use 'require', because it's not possible with Typescript to import +// function that are exported as 'module.exports = function`, without esModuleInterop +// set to true. +const calculateSlot = require('cluster-key-slot'); + export interface ClusterNode { id: string; client: RedisClientType; diff --git a/packages/client/lib/cluster/index.spec.ts b/packages/client/lib/cluster/index.spec.ts index c926c02d03a..66d458522e4 100644 --- a/packages/client/lib/cluster/index.spec.ts +++ b/packages/client/lib/cluster/index.spec.ts @@ -1,9 +1,13 @@ import { strict as assert } from 'assert'; import testUtils, { GLOBAL } from '../test-utils'; -import calculateSlot from 'cluster-key-slot'; import { ClusterSlotStates } from '../commands/CLUSTER_SETSLOT'; import { SQUARE_SCRIPT } from '../client/index.spec'; +// We need to use 'require', because it's not possible with Typescript to import +// function that are exported as 'module.exports = function`, without esModuleInterop +// set to true. +const calculateSlot = require('cluster-key-slot'); + describe('Cluster', () => { testUtils.testWithCluster('sendCommand', async cluster => { await cluster.connect(); diff --git a/packages/client/lib/ts-declarations/redis-parser.d.ts b/packages/client/lib/ts-declarations/redis-parser.d.ts deleted file mode 100644 index 7ec129ed8cd..00000000000 --- a/packages/client/lib/ts-declarations/redis-parser.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -declare module 'redis-parser' { - interface RedisParserCallbacks { - returnReply(reply: unknown): void; - returnError(err: Error): void; - returnFatalError?(err: Error): void; - } - - export default class RedisParser { - constructor(callbacks: RedisParserCallbacks); - - setReturnBuffers(returnBuffers?: boolean): void; - - execute(buffer: Buffer): void; - } -} diff --git a/packages/client/package.json b/packages/client/package.json index 88f40a4b19d..1f8226cc987 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -20,6 +20,7 @@ "@istanbuljs/nyc-config-typescript": "^1.0.1", "@redis/test-utils": "*", "@types/node": "^16.11.7", + "@types/redis-parser": "^3.0.0", "@types/sinon": "^10.0.6", "@types/yallist": "^4.0.1", "@typescript-eslint/eslint-plugin": "^5.3.1", diff --git a/packages/test-utils/lib/dockers.ts b/packages/test-utils/lib/dockers.ts index 28bd1e49057..052388970ec 100644 --- a/packages/test-utils/lib/dockers.ts +++ b/packages/test-utils/lib/dockers.ts @@ -3,7 +3,7 @@ import { once } from 'events'; import { RedisModules, RedisScripts } from '@redis/client/lib/commands'; import RedisClient, { RedisClientType } from '@redis/client/lib/client'; import { promiseTimeout } from '@redis/client/lib/utils'; -import path from 'path'; +import * as path from 'path'; import { promisify } from 'util'; import { exec } from 'child_process'; const execAsync = promisify(exec); diff --git a/tsconfig.base.json b/tsconfig.base.json index d6cd971b01d..7df81029664 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -3,11 +3,11 @@ "compilerOptions": { "declaration": true, "allowJs": true, - "useDefineForClassFields": true + "useDefineForClassFields": true, + "esModuleInterop": false }, "files": [ - "./packages/client/lib/ts-declarations/cluster-key-slot.d.ts", - "./packages/client/lib/ts-declarations/redis-parser.d.ts" + "./packages/client/lib/ts-declarations/cluster-key-slot.d.ts" ], "ts-node": { "files": true From 93e7c908af57c0c4669dc3af0d38321875b10271 Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 15 Nov 2021 17:11:39 -0500 Subject: [PATCH 098/112] npm update, remove html from readme --- .github/README.md | 25 +-- package-lock.json | 297 ++++++++++++++----------------- package.json | 2 +- packages/client/package.json | 10 +- packages/json/package.json | 4 +- packages/search/package.json | 4 +- packages/test-utils/package.json | 5 +- 7 files changed, 155 insertions(+), 192 deletions(-) diff --git a/.github/README.md b/.github/README.md index 6bc4458828d..171850fd2dd 100644 --- a/.github/README.md +++ b/.github/README.md @@ -1,20 +1,7 @@ -

- - - -

Node Redis

-

- - - ---- +# Node-Redis + +[![Coverage](https://codecov.io/gh/redis/node-redis/branch/master/graph/badge.svg?token=xcfqHhJC37)](https://codecov.io/gh/redis/node-redis) +[![Chat](https://img.shields.io/discord/697882427875393627)](https://discord.gg/XMMVgxUm) ## Installation @@ -302,9 +289,7 @@ If you'd like to contribute, check out the [contributing guide](CONTRIBUTING.md) Thank you to all the people who already contributed to Node Redis! - - - +[![Contributors](https://contrib.rocks/image?repo=redis/node-redis)](https://github.com/redis/node-redis/graphs/contributors) ## License diff --git a/package-lock.json b/package-lock.json index 22f8983cac2..2732b2d9a16 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ }, "devDependencies": { "@tsconfig/node12": "^1.0.9", - "release-it": "^14.11.6", + "release-it": "^14.11.7", "typescript": "^4.4.4" } }, @@ -1026,13 +1026,13 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.3.1.tgz", - "integrity": "sha512-cFImaoIr5Ojj358xI/SDhjog57OK2NqlpxwdcgyxDA3bJlZcJq5CPzUXtpD7CxI2Hm6ATU7w5fQnnkVnmwpHqw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.4.0.tgz", + "integrity": "sha512-9/yPSBlwzsetCsGEn9j24D8vGQgJkOTr4oMLas/w886ZtzKIs1iyoqFrwsX2fqYEeUwsdBpC21gcjRGo57u0eg==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "5.3.1", - "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/experimental-utils": "5.4.0", + "@typescript-eslint/scope-manager": "5.4.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -1058,15 +1058,15 @@ } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.1.tgz", - "integrity": "sha512-RgFn5asjZ5daUhbK5Sp0peq0SSMytqcrkNfU4pnDma2D8P3ElZ6JbYjY8IMSFfZAJ0f3x3tnO3vXHweYg0g59w==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.4.0.tgz", + "integrity": "sha512-Nz2JDIQUdmIGd6p33A+naQmwfkU5KVTLb/5lTk+tLVTDacZKoGQisj8UCxk7onJcrgjIvr8xWqkYI+DbI3TfXg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.3.1", - "@typescript-eslint/types": "5.3.1", - "@typescript-eslint/typescript-estree": "5.3.1", + "@typescript-eslint/scope-manager": "5.4.0", + "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/typescript-estree": "5.4.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -1082,14 +1082,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.3.1.tgz", - "integrity": "sha512-TD+ONlx5c+Qhk21x9gsJAMRohWAUMavSOmJgv3JGy9dgPhuBd5Wok0lmMClZDyJNLLZK1JRKiATzCKZNUmoyfw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.4.0.tgz", + "integrity": "sha512-JoB41EmxiYpaEsRwpZEYAJ9XQURPFer8hpkIW9GiaspVLX8oqbqNM8P4EP8HOZg96yaALiLEVWllA2E8vwsIKw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.3.1", - "@typescript-eslint/types": "5.3.1", - "@typescript-eslint/typescript-estree": "5.3.1", + "@typescript-eslint/scope-manager": "5.4.0", + "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/typescript-estree": "5.4.0", "debug": "^4.3.2" }, "engines": { @@ -1109,13 +1109,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.3.1.tgz", - "integrity": "sha512-XksFVBgAq0Y9H40BDbuPOTUIp7dn4u8oOuhcgGq7EoDP50eqcafkMVGrypyVGvDYHzjhdUCUwuwVUK4JhkMAMg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.4.0.tgz", + "integrity": "sha512-pRxFjYwoi8R+n+sibjgF9iUiAELU9ihPBtHzocyW8v8D8G8KeQvXTsW7+CBYIyTYsmhtNk50QPGLE3vrvhM5KA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.3.1", - "@typescript-eslint/visitor-keys": "5.3.1" + "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/visitor-keys": "5.4.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1126,9 +1126,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.1.tgz", - "integrity": "sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.4.0.tgz", + "integrity": "sha512-GjXNpmn+n1LvnttarX+sPD6+S7giO+9LxDIGlRl4wK3a7qMWALOHYuVSZpPTfEIklYjaWuMtfKdeByx0AcaThA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1139,13 +1139,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.3.1.tgz", - "integrity": "sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.4.0.tgz", + "integrity": "sha512-nhlNoBdhKuwiLMx6GrybPT3SFILm5Gij2YBdPEPFlYNFAXUJWX6QRgvi/lwVoadaQEFsizohs6aFRMqsXI2ewA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.3.1", - "@typescript-eslint/visitor-keys": "5.3.1", + "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/visitor-keys": "5.4.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -1166,12 +1166,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.1.tgz", - "integrity": "sha512-3cHUzUuVTuNHx0Gjjt5pEHa87+lzyqOiHXy/Gz+SJOCW1mpw9xQHIIEwnKn+Thph1mgWyZ90nboOcSuZr/jTTQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.4.0.tgz", + "integrity": "sha512-PVbax7MeE7tdLfW5SA0fs8NGVVr+buMPrcj+CWYWPXsZCH8qZ1THufDzbXm1xrZ2b2PA1iENJ0sRq5fuUtvsJg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/types": "5.4.0", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -1486,13 +1486,13 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz", - "integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", + "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", "dev": true, "dependencies": { - "caniuse-lite": "^1.0.30001274", - "electron-to-chromium": "^1.3.886", + "caniuse-lite": "^1.0.30001280", + "electron-to-chromium": "^1.3.896", "escalade": "^3.1.1", "node-releases": "^2.0.1", "picocolors": "^1.0.0" @@ -1618,9 +1618,9 @@ } }, "node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", + "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", "dev": true, "engines": { "node": ">=10" @@ -1630,9 +1630,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001279", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001279.tgz", - "integrity": "sha512-VfEHpzHEXj6/CxggTwSFoZBBYGQfQv9Cf42KPlO79sWXCD1QNKWKsKzFeWL7QpZHJQYAvocqV6Rty1yJMkqWLQ==", + "version": "1.0.30001280", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001280.tgz", + "integrity": "sha512-kFXwYvHe5rix25uwueBxC569o53J6TpnGu0BEEn+6Lhl2vsnAumRFWEBhDft1fwyo6m1r4i+RqA4+163FpeFcA==", "dev": true, "funding": { "type": "opencollective", @@ -2085,9 +2085,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.3.893", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.893.tgz", - "integrity": "sha512-ChtwF7qB03INq1SyMpue08wc6cve+ktj2UC/Y7se9vB+JryfzziJeYwsgb8jLaCA5GMkHCdn5M62PfSMWhifZg==", + "version": "1.3.897", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.897.tgz", + "integrity": "sha512-nRNZhAZ7hVCe75jrCUG7xLOqHMwloJMj6GEXEzY4OMahRGgwerAo+ls/qbqUwFH+E20eaSncKkQ4W8KP5SOiAg==", "dev": true }, "node_modules/emoji-regex": { @@ -5227,9 +5227,9 @@ } }, "node_modules/release-it": { - "version": "14.11.6", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.11.6.tgz", - "integrity": "sha512-6BNcuzFZHThBUBJ/xYw/bxZ+58CAwrwf1zgmjq2Ibl3nlDZbjphHG6iqxkJu7mZ8TIWs6NjloEAhqpjeXoN//Q==", + "version": "14.11.7", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.11.7.tgz", + "integrity": "sha512-m4p9+x6AEQPczc96Jyg6dGFeovpJVgRCtA1lxeIgTmQVt9dutYPkkjZeJngZgUJ17/Lb1bx6ZzW2qsKmopKnbQ==", "dev": true, "dependencies": { "@iarna/toml": "2.2.5", @@ -5940,9 +5940,9 @@ } }, "node_modules/typedoc": { - "version": "0.22.8", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.8.tgz", - "integrity": "sha512-92S+YzyhospdXN5rnkYUTgirdTYqNWY7NP9vco+IqQQoiSXzVSUsawVro+tMyEEsWUS7EMaJ2YOjB9uE0CBi6A==", + "version": "0.22.9", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.9.tgz", + "integrity": "sha512-84PjudoXVcap6bwdZFbYIUWlgdz/iLV09ZHwrCzhtHWXaDQG6mlosJ8te6DSThuRkRvQjp46HO+qY/P7Gpm78g==", "dev": true, "dependencies": { "glob": "^7.2.0", @@ -5972,9 +5972,9 @@ } }, "node_modules/typedoc-plugin-markdown": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.11.3.tgz", - "integrity": "sha512-rWiHbEIe0oZetDIsBR24XJVxGOJ91kDcHoj2KhFKxCLoJGX659EKBQkHne9QJ4W2stGhu1fRgFyQaouSBnxukA==", + "version": "3.11.6", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.11.6.tgz", + "integrity": "sha512-CV1BuxL7HR/EE1ctnPXOWzf4/Exl0FzkwtFVYaKTVWTnD/dkFLgABOfWuOL4lPmzLUOsAL85pmq+/PB6cdRppw==", "dev": true, "dependencies": { "handlebars": "^4.7.7" @@ -6411,7 +6411,6 @@ } }, "packages/client": { - "name": "@redis/client", "version": "1.0.0-rc", "license": "MIT", "dependencies": { @@ -6427,17 +6426,17 @@ "@types/redis-parser": "^3.0.0", "@types/sinon": "^10.0.6", "@types/yallist": "^4.0.1", - "@typescript-eslint/eslint-plugin": "^5.3.1", - "@typescript-eslint/parser": "^5.3.1", + "@typescript-eslint/eslint-plugin": "^5.4.0", + "@typescript-eslint/parser": "^5.4.0", "eslint": "^8.2.0", "nyc": "^15.1.0", - "release-it": "^14.11.6", + "release-it": "^14.11.7", "sinon": "^12.0.1", "source-map-support": "^0.5.20", "ts-node": "^10.4.0", - "typedoc": "^0.22.8", + "typedoc": "^0.22.9", "typedoc-github-wiki-theme": "^0.6.0", - "typedoc-plugin-markdown": "^3.11.3", + "typedoc-plugin-markdown": "^3.11.6", "typescript": "^4.4.4" }, "engines": { @@ -6445,15 +6444,14 @@ } }, "packages/json": { - "name": "@redis/json", "version": "1.0.0-rc.0", "license": "MIT", "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@redis/test-utils": "*", - "@types/node": "^16.11.6", + "@types/node": "^16.11.7", "nyc": "^15.1.0", - "release-it": "^14.11.6", + "release-it": "^14.11.7", "source-map-support": "^0.5.20", "ts-node": "^10.4.0", "typescript": "^4.4.4" @@ -6463,15 +6461,14 @@ } }, "packages/search": { - "name": "@redis/search", "version": "1.0.0-rc.0", "license": "MIT", "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@redis/test-utils": "*", - "@types/node": "^16.11.6", + "@types/node": "^16.11.7", "nyc": "^15.1.0", - "release-it": "^14.11.6", + "release-it": "^14.11.7", "source-map-support": "^0.5.20", "ts-node": "^10.4.0", "typescript": "^4.4.4" @@ -6481,16 +6478,14 @@ } }, "packages/test-utils": { - "name": "@redis/test-utils", "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@tsconfig/node12": "^1.0.9", "@types/mocha": "^9.0.0", - "@types/node": "^16.11.6", + "@types/node": "^16.11.7", "@types/yargs": "^17.0.5", "mocha": "^9.1.3", "nyc": "^15.1.0", - "release-it": "^14.11.6", + "release-it": "^14.11.7", "source-map-support": "^0.5.20", "ts-node": "^10.4.0", "typescript": "^4.4.4", @@ -6499,21 +6494,6 @@ "peerDependencies": { "@redis/client": "^1.0.0-rc" } - }, - "packages/time-series": { - "version": "1.0.0", - "extraneous": true, - "license": "ISC", - "devDependencies": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@redis/test-utils": "*", - "@types/node": "^16.11.6", - "nyc": "^15.1.0", - "release-it": "^14.11.6", - "source-map-support": "^0.5.20", - "ts-node": "^10.4.0", - "typescript": "^4.4.4" - } } }, "dependencies": { @@ -7157,23 +7137,23 @@ "@istanbuljs/nyc-config-typescript": "^1.0.1", "@redis/test-utils": "*", "@types/node": "^16.11.7", - "@types/redis-parser": "*", + "@types/redis-parser": "^3.0.0", "@types/sinon": "^10.0.6", "@types/yallist": "^4.0.1", - "@typescript-eslint/eslint-plugin": "^5.3.1", - "@typescript-eslint/parser": "^5.3.1", + "@typescript-eslint/eslint-plugin": "^5.4.0", + "@typescript-eslint/parser": "^5.4.0", "cluster-key-slot": "1.1.0", "eslint": "^8.2.0", "generic-pool": "3.8.2", "nyc": "^15.1.0", "redis-parser": "3.0.0", - "release-it": "^14.11.6", + "release-it": "^14.11.7", "sinon": "^12.0.1", "source-map-support": "^0.5.20", "ts-node": "^10.4.0", - "typedoc": "^0.22.8", + "typedoc": "^0.22.9", "typedoc-github-wiki-theme": "^0.6.0", - "typedoc-plugin-markdown": "^3.11.3", + "typedoc-plugin-markdown": "^3.11.6", "typescript": "^4.4.4", "yallist": "4.0.0" } @@ -7183,9 +7163,9 @@ "requires": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@redis/test-utils": "*", - "@types/node": "^16.11.6", + "@types/node": "^16.11.7", "nyc": "^15.1.0", - "release-it": "^14.11.6", + "release-it": "^14.11.7", "source-map-support": "^0.5.20", "ts-node": "^10.4.0", "typescript": "^4.4.4" @@ -7196,9 +7176,9 @@ "requires": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@redis/test-utils": "*", - "@types/node": "^16.11.6", + "@types/node": "^16.11.7", "nyc": "^15.1.0", - "release-it": "^14.11.6", + "release-it": "^14.11.7", "source-map-support": "^0.5.20", "ts-node": "^10.4.0", "typescript": "^4.4.4" @@ -7208,13 +7188,12 @@ "version": "file:packages/test-utils", "requires": { "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@tsconfig/node12": "^1.0.9", "@types/mocha": "^9.0.0", - "@types/node": "^16.11.6", + "@types/node": "^16.11.7", "@types/yargs": "^17.0.5", "mocha": "^9.1.3", "nyc": "^15.1.0", - "release-it": "^14.11.6", + "release-it": "^14.11.7", "source-map-support": "^0.5.20", "ts-node": "^10.4.0", "typescript": "^4.4.4", @@ -7402,13 +7381,13 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.3.1.tgz", - "integrity": "sha512-cFImaoIr5Ojj358xI/SDhjog57OK2NqlpxwdcgyxDA3bJlZcJq5CPzUXtpD7CxI2Hm6ATU7w5fQnnkVnmwpHqw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.4.0.tgz", + "integrity": "sha512-9/yPSBlwzsetCsGEn9j24D8vGQgJkOTr4oMLas/w886ZtzKIs1iyoqFrwsX2fqYEeUwsdBpC21gcjRGo57u0eg==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "5.3.1", - "@typescript-eslint/scope-manager": "5.3.1", + "@typescript-eslint/experimental-utils": "5.4.0", + "@typescript-eslint/scope-manager": "5.4.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -7418,55 +7397,55 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.1.tgz", - "integrity": "sha512-RgFn5asjZ5daUhbK5Sp0peq0SSMytqcrkNfU4pnDma2D8P3ElZ6JbYjY8IMSFfZAJ0f3x3tnO3vXHweYg0g59w==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.4.0.tgz", + "integrity": "sha512-Nz2JDIQUdmIGd6p33A+naQmwfkU5KVTLb/5lTk+tLVTDacZKoGQisj8UCxk7onJcrgjIvr8xWqkYI+DbI3TfXg==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.3.1", - "@typescript-eslint/types": "5.3.1", - "@typescript-eslint/typescript-estree": "5.3.1", + "@typescript-eslint/scope-manager": "5.4.0", + "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/typescript-estree": "5.4.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/parser": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.3.1.tgz", - "integrity": "sha512-TD+ONlx5c+Qhk21x9gsJAMRohWAUMavSOmJgv3JGy9dgPhuBd5Wok0lmMClZDyJNLLZK1JRKiATzCKZNUmoyfw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.4.0.tgz", + "integrity": "sha512-JoB41EmxiYpaEsRwpZEYAJ9XQURPFer8hpkIW9GiaspVLX8oqbqNM8P4EP8HOZg96yaALiLEVWllA2E8vwsIKw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.3.1", - "@typescript-eslint/types": "5.3.1", - "@typescript-eslint/typescript-estree": "5.3.1", + "@typescript-eslint/scope-manager": "5.4.0", + "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/typescript-estree": "5.4.0", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.3.1.tgz", - "integrity": "sha512-XksFVBgAq0Y9H40BDbuPOTUIp7dn4u8oOuhcgGq7EoDP50eqcafkMVGrypyVGvDYHzjhdUCUwuwVUK4JhkMAMg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.4.0.tgz", + "integrity": "sha512-pRxFjYwoi8R+n+sibjgF9iUiAELU9ihPBtHzocyW8v8D8G8KeQvXTsW7+CBYIyTYsmhtNk50QPGLE3vrvhM5KA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.3.1", - "@typescript-eslint/visitor-keys": "5.3.1" + "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/visitor-keys": "5.4.0" } }, "@typescript-eslint/types": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.1.tgz", - "integrity": "sha512-bG7HeBLolxKHtdHG54Uac750eXuQQPpdJfCYuw4ZI3bZ7+GgKClMWM8jExBtp7NSP4m8PmLRM8+lhzkYnSmSxQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.4.0.tgz", + "integrity": "sha512-GjXNpmn+n1LvnttarX+sPD6+S7giO+9LxDIGlRl4wK3a7qMWALOHYuVSZpPTfEIklYjaWuMtfKdeByx0AcaThA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.3.1.tgz", - "integrity": "sha512-PwFbh/PKDVo/Wct6N3w+E4rLZxUDgsoII/GrWM2A62ETOzJd4M6s0Mu7w4CWsZraTbaC5UQI+dLeyOIFF1PquQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.4.0.tgz", + "integrity": "sha512-nhlNoBdhKuwiLMx6GrybPT3SFILm5Gij2YBdPEPFlYNFAXUJWX6QRgvi/lwVoadaQEFsizohs6aFRMqsXI2ewA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.3.1", - "@typescript-eslint/visitor-keys": "5.3.1", + "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/visitor-keys": "5.4.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -7475,12 +7454,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.1.tgz", - "integrity": "sha512-3cHUzUuVTuNHx0Gjjt5pEHa87+lzyqOiHXy/Gz+SJOCW1mpw9xQHIIEwnKn+Thph1mgWyZ90nboOcSuZr/jTTQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.4.0.tgz", + "integrity": "sha512-PVbax7MeE7tdLfW5SA0fs8NGVVr+buMPrcj+CWYWPXsZCH8qZ1THufDzbXm1xrZ2b2PA1iENJ0sRq5fuUtvsJg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.3.1", + "@typescript-eslint/types": "5.4.0", "eslint-visitor-keys": "^3.0.0" } }, @@ -7713,13 +7692,13 @@ "dev": true }, "browserslist": { - "version": "4.17.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz", - "integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", + "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001274", - "electron-to-chromium": "^1.3.886", + "caniuse-lite": "^1.0.30001280", + "electron-to-chromium": "^1.3.896", "escalade": "^3.1.1", "node-releases": "^2.0.1", "picocolors": "^1.0.0" @@ -7802,15 +7781,15 @@ "dev": true }, "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", + "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", "dev": true }, "caniuse-lite": { - "version": "1.0.30001279", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001279.tgz", - "integrity": "sha512-VfEHpzHEXj6/CxggTwSFoZBBYGQfQv9Cf42KPlO79sWXCD1QNKWKsKzFeWL7QpZHJQYAvocqV6Rty1yJMkqWLQ==", + "version": "1.0.30001280", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001280.tgz", + "integrity": "sha512-kFXwYvHe5rix25uwueBxC569o53J6TpnGu0BEEn+6Lhl2vsnAumRFWEBhDft1fwyo6m1r4i+RqA4+163FpeFcA==", "dev": true }, "chalk": { @@ -8154,9 +8133,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.893", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.893.tgz", - "integrity": "sha512-ChtwF7qB03INq1SyMpue08wc6cve+ktj2UC/Y7se9vB+JryfzziJeYwsgb8jLaCA5GMkHCdn5M62PfSMWhifZg==", + "version": "1.3.897", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.897.tgz", + "integrity": "sha512-nRNZhAZ7hVCe75jrCUG7xLOqHMwloJMj6GEXEzY4OMahRGgwerAo+ls/qbqUwFH+E20eaSncKkQ4W8KP5SOiAg==", "dev": true }, "emoji-regex": { @@ -10499,9 +10478,9 @@ } }, "release-it": { - "version": "14.11.6", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.11.6.tgz", - "integrity": "sha512-6BNcuzFZHThBUBJ/xYw/bxZ+58CAwrwf1zgmjq2Ibl3nlDZbjphHG6iqxkJu7mZ8TIWs6NjloEAhqpjeXoN//Q==", + "version": "14.11.7", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-14.11.7.tgz", + "integrity": "sha512-m4p9+x6AEQPczc96Jyg6dGFeovpJVgRCtA1lxeIgTmQVt9dutYPkkjZeJngZgUJ17/Lb1bx6ZzW2qsKmopKnbQ==", "dev": true, "requires": { "@iarna/toml": "2.2.5", @@ -11033,9 +11012,9 @@ } }, "typedoc": { - "version": "0.22.8", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.8.tgz", - "integrity": "sha512-92S+YzyhospdXN5rnkYUTgirdTYqNWY7NP9vco+IqQQoiSXzVSUsawVro+tMyEEsWUS7EMaJ2YOjB9uE0CBi6A==", + "version": "0.22.9", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.9.tgz", + "integrity": "sha512-84PjudoXVcap6bwdZFbYIUWlgdz/iLV09ZHwrCzhtHWXaDQG6mlosJ8te6DSThuRkRvQjp46HO+qY/P7Gpm78g==", "dev": true, "requires": { "glob": "^7.2.0", @@ -11053,9 +11032,9 @@ "requires": {} }, "typedoc-plugin-markdown": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.11.3.tgz", - "integrity": "sha512-rWiHbEIe0oZetDIsBR24XJVxGOJ91kDcHoj2KhFKxCLoJGX659EKBQkHne9QJ4W2stGhu1fRgFyQaouSBnxukA==", + "version": "3.11.6", + "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.11.6.tgz", + "integrity": "sha512-CV1BuxL7HR/EE1ctnPXOWzf4/Exl0FzkwtFVYaKTVWTnD/dkFLgABOfWuOL4lPmzLUOsAL85pmq+/PB6cdRppw==", "dev": true, "requires": { "handlebars": "^4.7.7" diff --git a/package.json b/package.json index 051abd3a75d..d576c3232b7 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ }, "devDependencies": { "@tsconfig/node12": "^1.0.9", - "release-it": "^14.11.6", + "release-it": "^14.11.7", "typescript": "^4.4.4" }, "repository": { diff --git a/packages/client/package.json b/packages/client/package.json index 1f8226cc987..3e874af1afc 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -23,17 +23,17 @@ "@types/redis-parser": "^3.0.0", "@types/sinon": "^10.0.6", "@types/yallist": "^4.0.1", - "@typescript-eslint/eslint-plugin": "^5.3.1", - "@typescript-eslint/parser": "^5.3.1", + "@typescript-eslint/eslint-plugin": "^5.4.0", + "@typescript-eslint/parser": "^5.4.0", "eslint": "^8.2.0", "nyc": "^15.1.0", - "release-it": "^14.11.6", + "release-it": "^14.11.7", "sinon": "^12.0.1", "source-map-support": "^0.5.20", "ts-node": "^10.4.0", - "typedoc": "^0.22.8", + "typedoc": "^0.22.9", "typedoc-github-wiki-theme": "^0.6.0", - "typedoc-plugin-markdown": "^3.11.3", + "typedoc-plugin-markdown": "^3.11.6", "typescript": "^4.4.4" }, "engines": { diff --git a/packages/json/package.json b/packages/json/package.json index 1dcf907ea0e..41f1ec3064d 100644 --- a/packages/json/package.json +++ b/packages/json/package.json @@ -14,9 +14,9 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@redis/test-utils": "*", - "@types/node": "^16.11.6", + "@types/node": "^16.11.7", "nyc": "^15.1.0", - "release-it": "^14.11.6", + "release-it": "^14.11.7", "source-map-support": "^0.5.20", "ts-node": "^10.4.0", "typescript": "^4.4.4" diff --git a/packages/search/package.json b/packages/search/package.json index 5f8e9e550db..33bf7fffe4a 100644 --- a/packages/search/package.json +++ b/packages/search/package.json @@ -14,9 +14,9 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@redis/test-utils": "*", - "@types/node": "^16.11.6", + "@types/node": "^16.11.7", "nyc": "^15.1.0", - "release-it": "^14.11.6", + "release-it": "^14.11.7", "source-map-support": "^0.5.20", "ts-node": "^10.4.0", "typescript": "^4.4.4" diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index fba6744136a..a1b7c4d4166 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -12,13 +12,12 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@tsconfig/node12": "^1.0.9", "@types/mocha": "^9.0.0", - "@types/node": "^16.11.6", + "@types/node": "^16.11.7", "@types/yargs": "^17.0.5", "mocha": "^9.1.3", "nyc": "^15.1.0", - "release-it": "^14.11.6", + "release-it": "^14.11.7", "source-map-support": "^0.5.20", "ts-node": "^10.4.0", "typescript": "^4.4.4", From 397f14cee1894b1a01b5ed609d244669553b848f Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 15 Nov 2021 17:25:23 -0500 Subject: [PATCH 099/112] add tests and licence badges --- .github/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/README.md b/.github/README.md index 171850fd2dd..f14b71d9f27 100644 --- a/.github/README.md +++ b/.github/README.md @@ -1,7 +1,9 @@ # Node-Redis +[![Tests](https://img.shields.io/github/workflow/status/redis/node-redis/Tests/master.svg?label=tests)](https://codecov.io/gh/redis/node-redis) [![Coverage](https://codecov.io/gh/redis/node-redis/branch/master/graph/badge.svg?token=xcfqHhJC37)](https://codecov.io/gh/redis/node-redis) -[![Chat](https://img.shields.io/discord/697882427875393627)](https://discord.gg/XMMVgxUm) +[![License](https://img.shields.io/github/license/redis/node-redis.svg)](https://codecov.io/gh/redis/node-redis) +[![Chat](https://img.shields.io/discord/697882427875393627.svg)](https://discord.gg/XMMVgxUm) ## Installation From d79a815b294d795c69c1ea0fe4051664f684a07c Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 15 Nov 2021 17:47:06 -0500 Subject: [PATCH 100/112] update changelog.md --- packages/client/CHANGELOG.md | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/packages/client/CHANGELOG.md b/packages/client/CHANGELOG.md index d0095714010..21b7177e8b6 100644 --- a/packages/client/CHANGELOG.md +++ b/packages/client/CHANGELOG.md @@ -2,7 +2,7 @@ ## v4.0.0 -This version is a major change and refactor, adding modern JavaScript capabilities and multiple breaking changes. See the [migration guide](./docs/v3-to-v4.md) for tips on how to upgrade. +This version is a major change and refactor, adding modern JavaScript capabilities and multiple breaking changes. See the [migration guide](../../docs/v3-to-v4.md) for tips on how to upgrade. ### Breaking Changes @@ -17,12 +17,35 @@ This version is a major change and refactor, adding modern JavaScript capabiliti - Added support for Promises - Added built-in TypeScript declaration files enabling code completion -- Added support for [clustering](./README.md#cluster) -- Added idiomatic arguments and responses to [Redis commands](./README.md#redis-commands) -- Added full support for [Lua Scripts](./README.md#lua-scripts) -- Added support for [SCAN iterators](./README.md#scan-iterator) +- Added support for [clustering](../../.github/README.md#cluster) +- Added idiomatic arguments and responses to [Redis commands](../../.github/README.md#redis-commands) +- Added full support for [Lua Scripts](../../.github/README.md#lua-scripts) +- Added support for [SCAN iterators](../../.github/README.md#scan-iterator) - Added the ability to extend Node Redis with Redis Module commands +## v3.1.2 + +### Fixes + +- Exclude unnecessary files from tarball + +## v3.1.1 + +### Enhancements + +- Upgrade node and dependencies + +### Fixes + +- Fix a potential exponential regex in monitor mode + +## v3.1.0 - 31 Mar, 2021 + +### Enhancements + +- Upgrade node and dependencies and redis-commands to support Redis 6 +- Add support for Redis 6 `auth pass [user]` + ## v3.0.0 - 09 Feb, 2020 This version is mainly a release to distribute all the unreleased changes on master since 2017 and additionally removes From 95400322832d1b42e72c125d275d580e4d47e3ff Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 15 Nov 2021 17:56:27 -0500 Subject: [PATCH 101/112] update .npmignore and .release-it.json --- .npmignore | 3 +++ .release-it.json | 4 +++- packages/client/.npmignore | 2 ++ packages/client/.release-it.json | 4 +++- packages/json/.npmignore | 1 + packages/json/.release-it.json | 4 +++- packages/search/.npmignore | 1 + packages/search/.release-it.json | 4 +++- 8 files changed, 19 insertions(+), 4 deletions(-) diff --git a/.npmignore b/.npmignore index 0689fb63fe4..a36c5e83cf2 100644 --- a/.npmignore +++ b/.npmignore @@ -4,6 +4,9 @@ docs/ examples/ packages/ .deepsource.toml +.release-it.json +CONTRIBUTING.md +SECURITY.md index.ts tsconfig.base.json tsconfig.json diff --git a/.release-it.json b/.release-it.json index 984af58564a..7fd2ef2991e 100644 --- a/.release-it.json +++ b/.release-it.json @@ -1,5 +1,7 @@ { "git": { - "tagName": "redis@${version}" + "tagName": "redis@${version}", + "commitMessage": "Release ${tagName}", + "tagAnnotation": "Release ${tagName}" } } \ No newline at end of file diff --git a/packages/client/.npmignore b/packages/client/.npmignore index 9f9e21d98b8..d064e1d0db6 100644 --- a/packages/client/.npmignore +++ b/packages/client/.npmignore @@ -2,7 +2,9 @@ coverage/ documentation/ lib/ +.eslintrc.json .nycrc.json +.release-it.json dump.rdb index.ts tsconfig.json diff --git a/packages/client/.release-it.json b/packages/client/.release-it.json index d8e2b65186a..7e3b1cc5950 100644 --- a/packages/client/.release-it.json +++ b/packages/client/.release-it.json @@ -1,5 +1,7 @@ { "git": { - "tagName": "client@${version}" + "tagName": "client@${version}", + "commitMessage": "Release ${tagName}", + "tagAnnotation": "Release ${tagName}" } } \ No newline at end of file diff --git a/packages/json/.npmignore b/packages/json/.npmignore index 6b24efa5953..2b5908aef84 100644 --- a/packages/json/.npmignore +++ b/packages/json/.npmignore @@ -2,4 +2,5 @@ coverage/ lib/ .nycrc.json +.release-it tsconfig.json diff --git a/packages/json/.release-it.json b/packages/json/.release-it.json index 3486f4456ad..d31e16c3414 100644 --- a/packages/json/.release-it.json +++ b/packages/json/.release-it.json @@ -1,5 +1,7 @@ { "git": { - "tagName": "json@${version}" + "tagName": "json@${version}", + "commitMessage": "Release ${tagName}", + "tagAnnotation": "Release ${tagName}" } } \ No newline at end of file diff --git a/packages/search/.npmignore b/packages/search/.npmignore index 6b24efa5953..2b5908aef84 100644 --- a/packages/search/.npmignore +++ b/packages/search/.npmignore @@ -2,4 +2,5 @@ coverage/ lib/ .nycrc.json +.release-it tsconfig.json diff --git a/packages/search/.release-it.json b/packages/search/.release-it.json index c181fc970b1..f1c81dab939 100644 --- a/packages/search/.release-it.json +++ b/packages/search/.release-it.json @@ -1,5 +1,7 @@ { "git": { - "tagName": "search@${version}" + "tagName": "search@${version}", + "commitMessage": "Release ${tagName}", + "tagAnnotation": "Release ${tagName}" } } \ No newline at end of file From 4f1af43b5f504d0fb1f680de1172dee41d6fbfb1 Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 15 Nov 2021 18:01:03 -0500 Subject: [PATCH 102/112] update .release-it.json --- packages/client/.release-it.json | 3 +++ packages/json/.release-it.json | 3 +++ packages/search/.release-it.json | 3 +++ 3 files changed, 9 insertions(+) diff --git a/packages/client/.release-it.json b/packages/client/.release-it.json index 7e3b1cc5950..60235ee23ea 100644 --- a/packages/client/.release-it.json +++ b/packages/client/.release-it.json @@ -3,5 +3,8 @@ "tagName": "client@${version}", "commitMessage": "Release ${tagName}", "tagAnnotation": "Release ${tagName}" + }, + "npm": { + "publishArgs": ["--access", "public"] } } \ No newline at end of file diff --git a/packages/json/.release-it.json b/packages/json/.release-it.json index d31e16c3414..68337fbd5cd 100644 --- a/packages/json/.release-it.json +++ b/packages/json/.release-it.json @@ -3,5 +3,8 @@ "tagName": "json@${version}", "commitMessage": "Release ${tagName}", "tagAnnotation": "Release ${tagName}" + }, + "npm": { + "publishArgs": ["--access", "public"] } } \ No newline at end of file diff --git a/packages/search/.release-it.json b/packages/search/.release-it.json index f1c81dab939..9abec2264c4 100644 --- a/packages/search/.release-it.json +++ b/packages/search/.release-it.json @@ -3,5 +3,8 @@ "tagName": "search@${version}", "commitMessage": "Release ${tagName}", "tagAnnotation": "Release ${tagName}" + }, + "npm": { + "publishArgs": ["--access", "public"] } } \ No newline at end of file From d32f1edf8a8ede15ede5654168e345ebd95c3ac6 Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 15 Nov 2021 18:03:13 -0500 Subject: [PATCH 103/112] Release client@1.0.0-rc.0 --- packages/client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/package.json b/packages/client/package.json index 3e874af1afc..ea2ce116256 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@redis/client", - "version": "1.0.0-rc", + "version": "1.0.0-rc.0", "license": "MIT", "main": "./dist/index.js", "types": "./dist/index.d.ts", From 9e15472d90b1f778c435af1211cd448e9ca591fb Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 15 Nov 2021 18:07:19 -0500 Subject: [PATCH 104/112] revert d32f1edf8a8ede15ede5654168e345ebd95c3ac6 --- packages/client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/package.json b/packages/client/package.json index ea2ce116256..3e874af1afc 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@redis/client", - "version": "1.0.0-rc.0", + "version": "1.0.0-rc", "license": "MIT", "main": "./dist/index.js", "types": "./dist/index.d.ts", From 7fc1d2d7cf2a1bde225444b9cd94a7e1170d18f1 Mon Sep 17 00:00:00 2001 From: leibale Date: Mon, 15 Nov 2021 18:27:09 -0500 Subject: [PATCH 105/112] fix .npmignore --- packages/json/.npmignore | 2 +- packages/search/.npmignore | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/json/.npmignore b/packages/json/.npmignore index 2b5908aef84..bbef2b404fb 100644 --- a/packages/json/.npmignore +++ b/packages/json/.npmignore @@ -2,5 +2,5 @@ coverage/ lib/ .nycrc.json -.release-it +.release-it.json tsconfig.json diff --git a/packages/search/.npmignore b/packages/search/.npmignore index 2b5908aef84..bbef2b404fb 100644 --- a/packages/search/.npmignore +++ b/packages/search/.npmignore @@ -2,5 +2,5 @@ coverage/ lib/ .nycrc.json -.release-it +.release-it.json tsconfig.json From 0cabe71cf846dead6abb56c33a23d13990ce8a08 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 16 Nov 2021 02:35:24 -0500 Subject: [PATCH 106/112] replace @redis with @node-redis --- .github/README.md | 6 +- .release-it.json | 2 +- index.ts | 18 +- package-lock.json | 192 +++++++++++----------- package.json | 6 +- packages/client/.release-it.json | 2 +- packages/client/README.md | 2 +- packages/client/lib/test-utils.ts | 2 +- packages/client/package.json | 4 +- packages/json/.release-it.json | 2 +- packages/json/README.md | 2 +- packages/json/lib/commands/GET.ts | 2 +- packages/json/lib/test-utils.ts | 2 +- packages/json/package.json | 6 +- packages/search/.release-it.json | 2 +- packages/search/README.md | 2 +- packages/search/lib/commands/AGGREGATE.ts | 4 +- packages/search/lib/commands/CREATE.ts | 2 +- packages/search/lib/commands/DICTADD.ts | 4 +- packages/search/lib/commands/DICTDEL.ts | 4 +- packages/search/lib/commands/SEARCH.ts | 4 +- packages/search/lib/commands/SUGDEL.ts | 2 +- packages/search/lib/commands/SYNUPDATE.ts | 4 +- packages/search/lib/commands/index.ts | 2 +- packages/search/lib/test-utils.ts | 2 +- packages/search/package.json | 6 +- packages/test-utils/lib/dockers.ts | 6 +- packages/test-utils/lib/index.ts | 6 +- packages/test-utils/package.json | 4 +- 29 files changed, 153 insertions(+), 149 deletions(-) diff --git a/.github/README.md b/.github/README.md index f14b71d9f27..c7046805107 100644 --- a/.github/README.md +++ b/.github/README.md @@ -281,9 +281,9 @@ Node Redis is supported with the following versions of Redis: | Name | Description | |-------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | [redis](../) | [![Downloads](https://img.shields.io/npm/dm/redis.svg)](https://www.npmjs.com/package/redis/v/next) [![Version](https://img.shields.io/npm/v/redis/next.svg)](https://www.npmjs.com/package/redis/v/next) | -| [@redis/client](../packages/client) | [![Downloads](https://img.shields.io/npm/dm/@redis/client.svg)](https://www.npmjs.com/package/@redis/client/v/next) [![Version](https://img.shields.io/npm/v/@redis/client/next.svg)](https://www.npmjs.com/package/@redis/client/v/next) | -| [@redis/json](../packages/json) | [![Downloads](https://img.shields.io/npm/dm/@redis/json.svg)](https://www.npmjs.com/package/@redis/json/v/next) [![Version](https://img.shields.io/npm/v/@redis/json/next.svg)](https://www.npmjs.com/package/@redis/json/v/next) [Redis JSON](https://oss.redis.com/redisjson/) commands | -| [@redis/search](../packages/search) | [![Downloads](https://img.shields.io/npm/dm/@redis/search.svg)](https://www.npmjs.com/package/@redis/search/v/next) [![Version](https://img.shields.io/npm/v/@redis/search/next.svg)](https://www.npmjs.com/package/@redis/search/v/next) [Redis Search](https://oss.redis.com/redisearch/) commands | +| [@node-redis/client](../packages/client) | [![Downloads](https://img.shields.io/npm/dm/@node-redis/client.svg)](https://www.npmjs.com/package/@node-redis/client/v/next) [![Version](https://img.shields.io/npm/v/@node-redis/client/next.svg)](https://www.npmjs.com/package/@node-redis/client/v/next) | +| [@node-redis/json](../packages/json) | [![Downloads](https://img.shields.io/npm/dm/@node-redis/json.svg)](https://www.npmjs.com/package/@node-redis/json/v/next) [![Version](https://img.shields.io/npm/v/@node-redis/json/next.svg)](https://www.npmjs.com/package/@node-redis/json/v/next) [Redis JSON](https://oss.redis.com/redisjson/) commands | +| [@node-redis/search](../packages/search) | [![Downloads](https://img.shields.io/npm/dm/@node-redis/search.svg)](https://www.npmjs.com/package/@node-redis/search/v/next) [![Version](https://img.shields.io/npm/v/@node-redis/search/next.svg)](https://www.npmjs.com/package/@node-redis/search/v/next) [Redis Search](https://oss.redis.com/redisearch/) commands | ## Contributing diff --git a/.release-it.json b/.release-it.json index 7fd2ef2991e..982b4ac6cbe 100644 --- a/.release-it.json +++ b/.release-it.json @@ -4,4 +4,4 @@ "commitMessage": "Release ${tagName}", "tagAnnotation": "Release ${tagName}" } -} \ No newline at end of file +} diff --git a/index.ts b/index.ts index 610da7c2bdf..8fb31edb08a 100644 --- a/index.ts +++ b/index.ts @@ -1,13 +1,13 @@ -import { createClient as _createClient, createCluster as _createCluster } from '@redis/client'; -import { RedisScripts } from '@redis/client/dist/lib/commands'; -import { RedisClientOptions, RedisClientType } from '@redis/client/dist/lib/client'; -import { RedisClusterOptions, RedisClusterType } from '@redis/client/dist/lib/cluster'; -import RedisJSON from '@redis/json'; -import RediSearch from '@redis/search'; +import { createClient as _createClient, createCluster as _createCluster } from '@node-redis/client'; +import { RedisScripts } from '@node-redis/client/dist/lib/commands'; +import { RedisClientOptions, RedisClientType } from '@node-redis/client/dist/lib/client'; +import { RedisClusterOptions, RedisClusterType } from '@node-redis/client/dist/lib/cluster'; +import RedisJSON from '@node-redis/json'; +import RediSearch from '@node-redis/search'; -export * from '@redis/client'; -export * from '@redis/json'; -export * from '@redis/search'; +export * from '@node-redis/client'; +export * from '@node-redis/json'; +export * from '@node-redis/search'; const modules = { json: RedisJSON, diff --git a/package-lock.json b/package-lock.json index 2732b2d9a16..5af35d6badb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,9 +12,9 @@ "./packages/*" ], "dependencies": { - "@redis/client": "^1.0.0-rc", - "@redis/json": "^1.0.0-rc", - "@redis/search": "^1.0.0-rc" + "@node-redis/client": "^1.0.0-rc", + "@node-redis/json": "^1.0.0-rc", + "@node-redis/search": "^1.0.0-rc" }, "devDependencies": { "@tsconfig/node12": "^1.0.9", @@ -653,6 +653,22 @@ "node": ">=8" } }, + "node_modules/@node-redis/client": { + "resolved": "packages/client", + "link": true + }, + "node_modules/@node-redis/json": { + "resolved": "packages/json", + "link": true + }, + "node_modules/@node-redis/search": { + "resolved": "packages/search", + "link": true + }, + "node_modules/@node-redis/test-utils": { + "resolved": "packages/test-utils", + "link": true + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -820,22 +836,6 @@ "@octokit/openapi-types": "^11.2.0" } }, - "node_modules/@redis/client": { - "resolved": "packages/client", - "link": true - }, - "node_modules/@redis/json": { - "resolved": "packages/json", - "link": true - }, - "node_modules/@redis/search": { - "resolved": "packages/search", - "link": true - }, - "node_modules/@redis/test-utils": { - "resolved": "packages/test-utils", - "link": true - }, "node_modules/@sindresorhus/is": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", @@ -6411,6 +6411,7 @@ } }, "packages/client": { + "name": "@node-redis/client", "version": "1.0.0-rc", "license": "MIT", "dependencies": { @@ -6421,7 +6422,7 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@redis/test-utils": "*", + "@node-redis/test-utils": "*", "@types/node": "^16.11.7", "@types/redis-parser": "^3.0.0", "@types/sinon": "^10.0.6", @@ -6444,11 +6445,12 @@ } }, "packages/json": { + "name": "@node-redis/json", "version": "1.0.0-rc.0", "license": "MIT", "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@redis/test-utils": "*", + "@node-redis/test-utils": "*", "@types/node": "^16.11.7", "nyc": "^15.1.0", "release-it": "^14.11.7", @@ -6457,15 +6459,16 @@ "typescript": "^4.4.4" }, "peerDependencies": { - "@redis/client": "^1.0.0-rc" + "@node-redis/client": "^1.0.0-rc" } }, "packages/search": { + "name": "@node-redis/search", "version": "1.0.0-rc.0", "license": "MIT", "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@redis/test-utils": "*", + "@node-redis/test-utils": "*", "@types/node": "^16.11.7", "nyc": "^15.1.0", "release-it": "^14.11.7", @@ -6474,10 +6477,11 @@ "typescript": "^4.4.4" }, "peerDependencies": { - "@redis/client": "^1.0.0-rc" + "@node-redis/client": "^1.0.0-rc" } }, "packages/test-utils": { + "name": "@node-redis/test-utils", "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", "@types/mocha": "^9.0.0", @@ -6492,7 +6496,7 @@ "yargs": "^17.2.1" }, "peerDependencies": { - "@redis/client": "^1.0.0-rc" + "@node-redis/client": "^1.0.0-rc" } } }, @@ -6981,6 +6985,75 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@node-redis/client": { + "version": "file:packages/client", + "requires": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@node-redis/test-utils": "*", + "@types/node": "^16.11.7", + "@types/redis-parser": "^3.0.0", + "@types/sinon": "^10.0.6", + "@types/yallist": "^4.0.1", + "@typescript-eslint/eslint-plugin": "^5.4.0", + "@typescript-eslint/parser": "^5.4.0", + "cluster-key-slot": "1.1.0", + "eslint": "^8.2.0", + "generic-pool": "3.8.2", + "nyc": "^15.1.0", + "redis-parser": "3.0.0", + "release-it": "^14.11.7", + "sinon": "^12.0.1", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typedoc": "^0.22.9", + "typedoc-github-wiki-theme": "^0.6.0", + "typedoc-plugin-markdown": "^3.11.6", + "typescript": "^4.4.4", + "yallist": "4.0.0" + } + }, + "@node-redis/json": { + "version": "file:packages/json", + "requires": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@node-redis/test-utils": "*", + "@types/node": "^16.11.7", + "nyc": "^15.1.0", + "release-it": "^14.11.7", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4" + } + }, + "@node-redis/search": { + "version": "file:packages/search", + "requires": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@node-redis/test-utils": "*", + "@types/node": "^16.11.7", + "nyc": "^15.1.0", + "release-it": "^14.11.7", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4" + } + }, + "@node-redis/test-utils": { + "version": "file:packages/test-utils", + "requires": { + "@istanbuljs/nyc-config-typescript": "^1.0.1", + "@types/mocha": "^9.0.0", + "@types/node": "^16.11.7", + "@types/yargs": "^17.0.5", + "mocha": "^9.1.3", + "nyc": "^15.1.0", + "release-it": "^14.11.7", + "source-map-support": "^0.5.20", + "ts-node": "^10.4.0", + "typescript": "^4.4.4", + "yargs": "^17.2.1" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -7131,75 +7204,6 @@ "@octokit/openapi-types": "^11.2.0" } }, - "@redis/client": { - "version": "file:packages/client", - "requires": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@redis/test-utils": "*", - "@types/node": "^16.11.7", - "@types/redis-parser": "^3.0.0", - "@types/sinon": "^10.0.6", - "@types/yallist": "^4.0.1", - "@typescript-eslint/eslint-plugin": "^5.4.0", - "@typescript-eslint/parser": "^5.4.0", - "cluster-key-slot": "1.1.0", - "eslint": "^8.2.0", - "generic-pool": "3.8.2", - "nyc": "^15.1.0", - "redis-parser": "3.0.0", - "release-it": "^14.11.7", - "sinon": "^12.0.1", - "source-map-support": "^0.5.20", - "ts-node": "^10.4.0", - "typedoc": "^0.22.9", - "typedoc-github-wiki-theme": "^0.6.0", - "typedoc-plugin-markdown": "^3.11.6", - "typescript": "^4.4.4", - "yallist": "4.0.0" - } - }, - "@redis/json": { - "version": "file:packages/json", - "requires": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@redis/test-utils": "*", - "@types/node": "^16.11.7", - "nyc": "^15.1.0", - "release-it": "^14.11.7", - "source-map-support": "^0.5.20", - "ts-node": "^10.4.0", - "typescript": "^4.4.4" - } - }, - "@redis/search": { - "version": "file:packages/search", - "requires": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@redis/test-utils": "*", - "@types/node": "^16.11.7", - "nyc": "^15.1.0", - "release-it": "^14.11.7", - "source-map-support": "^0.5.20", - "ts-node": "^10.4.0", - "typescript": "^4.4.4" - } - }, - "@redis/test-utils": { - "version": "file:packages/test-utils", - "requires": { - "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@types/mocha": "^9.0.0", - "@types/node": "^16.11.7", - "@types/yargs": "^17.0.5", - "mocha": "^9.1.3", - "nyc": "^15.1.0", - "release-it": "^14.11.7", - "source-map-support": "^0.5.20", - "ts-node": "^10.4.0", - "typescript": "^4.4.4", - "yargs": "^17.2.1" - } - }, "@sindresorhus/is": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", diff --git a/package.json b/package.json index d576c3232b7..5986f0f0683 100644 --- a/package.json +++ b/package.json @@ -17,9 +17,9 @@ "build-all": "npm run build:client && npm run build:test-utils && npm run build:modules && npm run build" }, "dependencies": { - "@redis/client": "^1.0.0-rc", - "@redis/json": "^1.0.0-rc", - "@redis/search": "^1.0.0-rc" + "@node-redis/client": "^1.0.0-rc", + "@node-redis/json": "^1.0.0-rc", + "@node-redis/search": "^1.0.0-rc" }, "devDependencies": { "@tsconfig/node12": "^1.0.9", diff --git a/packages/client/.release-it.json b/packages/client/.release-it.json index 60235ee23ea..035124348ca 100644 --- a/packages/client/.release-it.json +++ b/packages/client/.release-it.json @@ -7,4 +7,4 @@ "npm": { "publishArgs": ["--access", "public"] } -} \ No newline at end of file +} diff --git a/packages/client/README.md b/packages/client/README.md index d9c8f80f2f3..37c326fc42e 100644 --- a/packages/client/README.md +++ b/packages/client/README.md @@ -1,2 +1,2 @@ -# @redis/client +# @node-redis/client The sources and docs for this package are in the main [node-redis](https://github.com/redis/node-redis) repo. diff --git a/packages/client/lib/test-utils.ts b/packages/client/lib/test-utils.ts index 85057da841e..321a9da63d5 100644 --- a/packages/client/lib/test-utils.ts +++ b/packages/client/lib/test-utils.ts @@ -1,4 +1,4 @@ -import TestUtils from '@redis/test-utils'; +import TestUtils from '@node-redis/test-utils'; import { SinonSpy } from 'sinon'; import { promiseTimeout } from './utils'; diff --git a/packages/client/package.json b/packages/client/package.json index 3e874af1afc..8a2e2ed7251 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,5 +1,5 @@ { - "name": "@redis/client", + "name": "@node-redis/client", "version": "1.0.0-rc", "license": "MIT", "main": "./dist/index.js", @@ -18,7 +18,7 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@redis/test-utils": "*", + "@node-redis/test-utils": "*", "@types/node": "^16.11.7", "@types/redis-parser": "^3.0.0", "@types/sinon": "^10.0.6", diff --git a/packages/json/.release-it.json b/packages/json/.release-it.json index 68337fbd5cd..ab495a49b13 100644 --- a/packages/json/.release-it.json +++ b/packages/json/.release-it.json @@ -7,4 +7,4 @@ "npm": { "publishArgs": ["--access", "public"] } -} \ No newline at end of file +} diff --git a/packages/json/README.md b/packages/json/README.md index 45264d671b4..1cd599d5ea8 100644 --- a/packages/json/README.md +++ b/packages/json/README.md @@ -1,2 +1,2 @@ -# @redis/json +# @node-redis/json The sources and docs for this package are in the main [node-redis](https://github.com/redis/node-redis) repo. diff --git a/packages/json/lib/commands/GET.ts b/packages/json/lib/commands/GET.ts index 36bb9bc4e4c..8e897bb67d2 100644 --- a/packages/json/lib/commands/GET.ts +++ b/packages/json/lib/commands/GET.ts @@ -1,4 +1,4 @@ -import { pushVerdictArguments } from '@redis/client/dist/lib/commands/generic-transformers'; +import { pushVerdictArguments } from '@node-redis/client/dist/lib/commands/generic-transformers'; export const FIRST_KEY_INDEX = 1; diff --git a/packages/json/lib/test-utils.ts b/packages/json/lib/test-utils.ts index 140e781d91e..eeee3c77c9d 100644 --- a/packages/json/lib/test-utils.ts +++ b/packages/json/lib/test-utils.ts @@ -1,4 +1,4 @@ -import TestUtils from '@redis/test-utils'; +import TestUtils from '@node-redis/test-utils'; import RedisJSON from '.'; export default new TestUtils({ diff --git a/packages/json/package.json b/packages/json/package.json index 41f1ec3064d..7e5f6e10c1f 100644 --- a/packages/json/package.json +++ b/packages/json/package.json @@ -1,5 +1,5 @@ { - "name": "@redis/json", + "name": "@node-redis/json", "version": "1.0.0-rc.0", "license": "MIT", "main": "./dist/index.js", @@ -9,11 +9,11 @@ "build": "tsc" }, "peerDependencies": { - "@redis/client": "^1.0.0-rc" + "@node-redis/client": "^1.0.0-rc" }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@redis/test-utils": "*", + "@node-redis/test-utils": "*", "@types/node": "^16.11.7", "nyc": "^15.1.0", "release-it": "^14.11.7", diff --git a/packages/search/.release-it.json b/packages/search/.release-it.json index 9abec2264c4..72cb1016ef4 100644 --- a/packages/search/.release-it.json +++ b/packages/search/.release-it.json @@ -7,4 +7,4 @@ "npm": { "publishArgs": ["--access", "public"] } -} \ No newline at end of file +} diff --git a/packages/search/README.md b/packages/search/README.md index 08db1a72dcf..856a75fbb5a 100644 --- a/packages/search/README.md +++ b/packages/search/README.md @@ -1,2 +1,2 @@ -# @redis/search +# @node-redis/search The sources and docs for this package are in the main [node-redis](https://github.com/redis/node-redis) repo. diff --git a/packages/search/lib/commands/AGGREGATE.ts b/packages/search/lib/commands/AGGREGATE.ts index affc98b51d7..c81dcfef4dd 100644 --- a/packages/search/lib/commands/AGGREGATE.ts +++ b/packages/search/lib/commands/AGGREGATE.ts @@ -1,5 +1,5 @@ -import { RedisCommandArguments } from '@redis/client/dist/lib/commands'; -import { pushVerdictArgument, transformReplyTuples, TuplesObject } from '@redis/client/dist/lib/commands/generic-transformers'; +import { RedisCommandArguments } from '@node-redis/client/dist/lib/commands'; +import { pushVerdictArgument, transformReplyTuples, TuplesObject } from '@node-redis/client/dist/lib/commands/generic-transformers'; import { PropertyName, pushArgumentsWithLength, pushSortByArguments, SortByOptions } from '.'; export enum AggregateSteps { diff --git a/packages/search/lib/commands/CREATE.ts b/packages/search/lib/commands/CREATE.ts index b67896cd64c..1a5e45a4a88 100644 --- a/packages/search/lib/commands/CREATE.ts +++ b/packages/search/lib/commands/CREATE.ts @@ -1,4 +1,4 @@ -import { pushOptionalVerdictArgument } from '@redis/client/dist/lib/commands/generic-transformers'; +import { pushOptionalVerdictArgument } from '@node-redis/client/dist/lib/commands/generic-transformers'; import { RedisSearchLanguages, PropertyName } from '.'; export enum SchemaFieldTypes { diff --git a/packages/search/lib/commands/DICTADD.ts b/packages/search/lib/commands/DICTADD.ts index 60af11fd41f..b3f993395fa 100644 --- a/packages/search/lib/commands/DICTADD.ts +++ b/packages/search/lib/commands/DICTADD.ts @@ -1,5 +1,5 @@ -import { RedisCommandArguments } from '@redis/client/dist/lib/commands'; -import { pushVerdictArguments } from '@redis/client/dist/lib/commands/generic-transformers'; +import { RedisCommandArguments } from '@node-redis/client/dist/lib/commands'; +import { pushVerdictArguments } from '@node-redis/client/dist/lib/commands/generic-transformers'; export function transformArguments(dictionary: string, term: string | Array): RedisCommandArguments { return pushVerdictArguments(['FT.DICTADD', dictionary], term); diff --git a/packages/search/lib/commands/DICTDEL.ts b/packages/search/lib/commands/DICTDEL.ts index a1b728f1926..bd047a5031d 100644 --- a/packages/search/lib/commands/DICTDEL.ts +++ b/packages/search/lib/commands/DICTDEL.ts @@ -1,5 +1,5 @@ -import { RedisCommandArguments } from '@redis/client/dist/lib/commands'; -import { pushVerdictArguments } from '@redis/client/dist/lib/commands/generic-transformers'; +import { RedisCommandArguments } from '@node-redis/client/dist/lib/commands'; +import { pushVerdictArguments } from '@node-redis/client/dist/lib/commands/generic-transformers'; export function transformArguments(dictionary: string, term: string | Array): RedisCommandArguments { return pushVerdictArguments(['FT.DICTDEL', dictionary], term); diff --git a/packages/search/lib/commands/SEARCH.ts b/packages/search/lib/commands/SEARCH.ts index a773514a738..9616bfa0bee 100644 --- a/packages/search/lib/commands/SEARCH.ts +++ b/packages/search/lib/commands/SEARCH.ts @@ -1,5 +1,5 @@ -import { RedisCommandArguments } from '@redis/client/dist/lib/commands'; -import { pushOptionalVerdictArgument, pushVerdictArgument, transformReplyTuples } from '@redis/client/dist/lib/commands/generic-transformers'; +import { RedisCommandArguments } from '@node-redis/client/dist/lib/commands'; +import { pushOptionalVerdictArgument, pushVerdictArgument, transformReplyTuples } from '@node-redis/client/dist/lib/commands/generic-transformers'; import { RedisSearchLanguages, PropertyName, pushSortByArguments, SortByOptions } from '.'; export const FIRST_KEY_INDEX = 1; diff --git a/packages/search/lib/commands/SUGDEL.ts b/packages/search/lib/commands/SUGDEL.ts index be2d4262caa..43f4744c00d 100644 --- a/packages/search/lib/commands/SUGDEL.ts +++ b/packages/search/lib/commands/SUGDEL.ts @@ -2,4 +2,4 @@ export function transformArguments(key: string, string: string): Array { return ['FT.SUGDEL', key, string]; } -export { transformReplyBoolean as transformReply } from '@redis/client/dist/lib/commands/generic-transformers'; +export { transformReplyBoolean as transformReply } from '@node-redis/client/dist/lib/commands/generic-transformers'; diff --git a/packages/search/lib/commands/SYNUPDATE.ts b/packages/search/lib/commands/SYNUPDATE.ts index 3384ea59d94..b59d35617fa 100644 --- a/packages/search/lib/commands/SYNUPDATE.ts +++ b/packages/search/lib/commands/SYNUPDATE.ts @@ -1,5 +1,5 @@ -import { pushVerdictArguments } from '@redis/client/dist/lib/commands/generic-transformers'; -import { RedisCommandArguments } from '@redis/client/dist/lib/commands'; +import { pushVerdictArguments } from '@node-redis/client/dist/lib/commands/generic-transformers'; +import { RedisCommandArguments } from '@node-redis/client/dist/lib/commands'; interface SynUpdateOptions { SKIPINITIALSCAN?: true; diff --git a/packages/search/lib/commands/index.ts b/packages/search/lib/commands/index.ts index c10a10774b7..70626c00df0 100644 --- a/packages/search/lib/commands/index.ts +++ b/packages/search/lib/commands/index.ts @@ -26,7 +26,7 @@ import * as SUGLEN from './SUGLEN'; import * as SYNDUMP from './SYNDUMP'; import * as SYNUPDATE from './SYNUPDATE'; import * as TAGVALS from './TAGVALS'; -import { RedisCommandArguments } from '@redis/client/dist/lib/commands'; +import { RedisCommandArguments } from '@node-redis/client/dist/lib/commands'; export default { _LIST, diff --git a/packages/search/lib/test-utils.ts b/packages/search/lib/test-utils.ts index c68504c21d7..4af05e10623 100644 --- a/packages/search/lib/test-utils.ts +++ b/packages/search/lib/test-utils.ts @@ -1,4 +1,4 @@ -import TestUtils from '@redis/test-utils'; +import TestUtils from '@node-redis/test-utils'; import RediSearch from '.'; export default new TestUtils({ diff --git a/packages/search/package.json b/packages/search/package.json index 33bf7fffe4a..a72678c2add 100644 --- a/packages/search/package.json +++ b/packages/search/package.json @@ -1,5 +1,5 @@ { - "name": "@redis/search", + "name": "@node-redis/search", "version": "1.0.0-rc.0", "license": "MIT", "main": "./dist/index.js", @@ -9,11 +9,11 @@ "build": "tsc" }, "peerDependencies": { - "@redis/client": "^1.0.0-rc" + "@node-redis/client": "^1.0.0-rc" }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", - "@redis/test-utils": "*", + "@node-redis/test-utils": "*", "@types/node": "^16.11.7", "nyc": "^15.1.0", "release-it": "^14.11.7", diff --git a/packages/test-utils/lib/dockers.ts b/packages/test-utils/lib/dockers.ts index 052388970ec..3dd6dcf3ebf 100644 --- a/packages/test-utils/lib/dockers.ts +++ b/packages/test-utils/lib/dockers.ts @@ -1,8 +1,8 @@ import { createConnection } from 'net'; import { once } from 'events'; -import { RedisModules, RedisScripts } from '@redis/client/lib/commands'; -import RedisClient, { RedisClientType } from '@redis/client/lib/client'; -import { promiseTimeout } from '@redis/client/lib/utils'; +import { RedisModules, RedisScripts } from '@node-redis/client/lib/commands'; +import RedisClient, { RedisClientType } from '@node-redis/client/lib/client'; +import { promiseTimeout } from '@node-redis/client/lib/utils'; import * as path from 'path'; import { promisify } from 'util'; import { exec } from 'child_process'; diff --git a/packages/test-utils/lib/index.ts b/packages/test-utils/lib/index.ts index f9a1fc1dbd9..8e20df75818 100644 --- a/packages/test-utils/lib/index.ts +++ b/packages/test-utils/lib/index.ts @@ -1,6 +1,6 @@ -import { RedisModules, RedisScripts } from '@redis/client/lib/commands'; -import RedisClient, { RedisClientOptions, RedisClientType } from '@redis/client/lib/client'; -import RedisCluster, { RedisClusterOptions, RedisClusterType } from '@redis/client/lib/cluster'; +import { RedisModules, RedisScripts } from '@node-redis/client/lib/commands'; +import RedisClient, { RedisClientOptions, RedisClientType } from '@node-redis/client/lib/client'; +import RedisCluster, { RedisClusterOptions, RedisClusterType } from '@node-redis/client/lib/cluster'; import { RedisServerDockerConfig, spawnRedisServer, spawnRedisCluster } from './dockers'; import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index a1b7c4d4166..47ddc25acff 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,5 +1,5 @@ { - "name": "@redis/test-utils", + "name": "@node-redis/test-utils", "private": true, "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -8,7 +8,7 @@ "test": "echo \"TODO\"" }, "peerDependencies": { - "@redis/client": "^1.0.0-rc" + "@node-redis/client": "^1.0.0-rc" }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "^1.0.1", From b2aacb6d3e004a26ffc4b8ea8dc0aaad10f25d7b Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 16 Nov 2021 02:36:10 -0500 Subject: [PATCH 107/112] Release client@1.0.0-rc.0 --- packages/client/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/package.json b/packages/client/package.json index 8a2e2ed7251..7a6d23f5ff9 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@node-redis/client", - "version": "1.0.0-rc", + "version": "1.0.0-rc.0", "license": "MIT", "main": "./dist/index.js", "types": "./dist/index.d.ts", From 4bca55afff38fe24bf513e58efa430a6c60833ce Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 16 Nov 2021 02:37:37 -0500 Subject: [PATCH 108/112] update json & search version --- packages/json/package.json | 2 +- packages/search/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/json/package.json b/packages/json/package.json index 7e5f6e10c1f..69950442b29 100644 --- a/packages/json/package.json +++ b/packages/json/package.json @@ -1,6 +1,6 @@ { "name": "@node-redis/json", - "version": "1.0.0-rc.0", + "version": "1.0.0-rc", "license": "MIT", "main": "./dist/index.js", "types": "./dist/index.d.ts", diff --git a/packages/search/package.json b/packages/search/package.json index a72678c2add..1b7f3c9fbe2 100644 --- a/packages/search/package.json +++ b/packages/search/package.json @@ -1,6 +1,6 @@ { "name": "@node-redis/search", - "version": "1.0.0-rc.0", + "version": "1.0.0-rc", "license": "MIT", "main": "./dist/index.js", "types": "./dist/index.d.ts", From be063d1a368934b8c3eff2289ff57425528cf317 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 16 Nov 2021 02:37:55 -0500 Subject: [PATCH 109/112] Release json@1.0.0-rc.0 --- packages/json/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/json/package.json b/packages/json/package.json index 69950442b29..7e5f6e10c1f 100644 --- a/packages/json/package.json +++ b/packages/json/package.json @@ -1,6 +1,6 @@ { "name": "@node-redis/json", - "version": "1.0.0-rc", + "version": "1.0.0-rc.0", "license": "MIT", "main": "./dist/index.js", "types": "./dist/index.d.ts", From f2a3b3fb5e20d137edb91cc8a2de4f9f4512ab63 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 16 Nov 2021 02:38:25 -0500 Subject: [PATCH 110/112] Release search@1.0.0-rc.0 --- packages/search/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/search/package.json b/packages/search/package.json index 1b7f3c9fbe2..a72678c2add 100644 --- a/packages/search/package.json +++ b/packages/search/package.json @@ -1,6 +1,6 @@ { "name": "@node-redis/search", - "version": "1.0.0-rc", + "version": "1.0.0-rc.0", "license": "MIT", "main": "./dist/index.js", "types": "./dist/index.d.ts", From b8359fe1839b58733a8e619f307d594149cfd5e9 Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 16 Nov 2021 02:40:07 -0500 Subject: [PATCH 111/112] update dependencies --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 5986f0f0683..2063ee4079b 100644 --- a/package.json +++ b/package.json @@ -17,9 +17,9 @@ "build-all": "npm run build:client && npm run build:test-utils && npm run build:modules && npm run build" }, "dependencies": { - "@node-redis/client": "^1.0.0-rc", - "@node-redis/json": "^1.0.0-rc", - "@node-redis/search": "^1.0.0-rc" + "@node-redis/client": "^1.0.0-rc.0", + "@node-redis/json": "^1.0.0-rc.0", + "@node-redis/search": "^1.0.0-rc.0" }, "devDependencies": { "@tsconfig/node12": "^1.0.9", From 362daf63e4e5eab2a27dadee897ba388a879356b Mon Sep 17 00:00:00 2001 From: leibale Date: Tue, 16 Nov 2021 02:40:26 -0500 Subject: [PATCH 112/112] Release redis@4.0.0-rc.4 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5af35d6badb..5c3ebb5c208 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "redis", - "version": "4.0.0-rc.3", + "version": "4.0.0-rc.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "redis", - "version": "4.0.0-rc.3", + "version": "4.0.0-rc.4", "license": "MIT", "workspaces": [ "./packages/*" diff --git a/package.json b/package.json index 2063ee4079b..49339e44d26 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redis", - "version": "4.0.0-rc.3", + "version": "4.0.0-rc.4", "license": "MIT", "main": "./dist/index.js", "types": "./dist/index.d.ts",