From 0bdd4ace6f4ff42fb4bbec5c697f5e796aeaf95a Mon Sep 17 00:00:00 2001 From: Matthew Oaxaca Date: Mon, 3 Aug 2020 17:35:42 -0700 Subject: [PATCH 1/4] WIP Proxy Implementation --- .env.example | 2 + package.json | 8 +- src/index.d.ts | 40 ++++++++++ src/index.js | 74 ++++++++++--------- src/object-decorator.js | 3 +- src/object-promisify.js | 19 +++++ src/redis-commands.js | 21 ++++++ test/integration/commands.spec.js | 60 +++++++++++++++ test/integration/commands/common.spec.js | 64 ---------------- test/integration/create-client.spec.js | 14 ++-- test/integration/decorate-redis.spec.js | 11 ++- test/setup.js | 1 + ...-decorator.js => object-decorator.spec.js} | 7 +- test/util/getTestRedisConfig.js | 9 +++ yarn.lock | 5 ++ 15 files changed, 217 insertions(+), 121 deletions(-) create mode 100644 .env.example create mode 100644 src/index.d.ts create mode 100644 src/object-promisify.js create mode 100644 src/redis-commands.js create mode 100644 test/integration/commands.spec.js delete mode 100644 test/integration/commands/common.spec.js rename test/unit/{object-decorator.js => object-decorator.spec.js} (84%) create mode 100644 test/util/getTestRedisConfig.js diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..f955ab3 --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +REDIS_HOST=localhost +REDIS_PORT=6379 diff --git a/package.json b/package.json index 0cd5212..8e31c92 100644 --- a/package.json +++ b/package.json @@ -30,20 +30,20 @@ "scripts": { "coveralls": "nyc yarn test && nyc report --reporter=text-lcov | coveralls", "lint": "eslint --fix --ext .js, .", - "test": "mocha", - "test:unit": "mocha", + "test": "mocha test/**/*.spec.js --config test/setup.js --exit", + "test:unit": "mocha test/unit/*.spec.js --config test/setup.js --exit", "version:patch": "npm version patch", "version:minor": "npm version minor", "version:major": "npm version major" }, "dependencies": { - "redis": "^3.0.2", - "redis-commands": "^1.6.0" + "redis": "3.0.2" }, "devDependencies": { "chai": "^4.2.0", "chai-as-promised": "^7.1.1", "coveralls": "^3.1.0", + "dotenv": "^8.2.0", "eslint": "^7.6.0", "mocha": "^8.1.0", "nyc": "^15.1.0" diff --git a/src/index.d.ts b/src/index.d.ts new file mode 100644 index 0000000..91ca5ff --- /dev/null +++ b/src/index.d.ts @@ -0,0 +1,40 @@ +import { Commands, RedisClient, ClientOpts } from 'redis'; + +type Omit = Pick>; +type Omitted = Omit>; + +interface Promisified extends Omitted, Commands> {} + +interface AsyncRedisConstructor { + new (port: number, host?: string, options?: ClientOpts): Promisified; + new (unix_socket: string, options?: ClientOpts): Promisified; + new (redis_url: string, options?: ClientOpts): Promisified; + new (options?: ClientOpts): Promisified; + + createClient(port: number, host?: string, options?: ClientOpts): Promisified; + createClient(unix_socket: string, options?: ClientOpts): Promisified; + createClient(redis_url: string, options?: ClientOpts): Promisified; + createClient(options?: ClientOpts): Promisified; + + decorate: (client: RedisClient) => Promisified; +} + +interface AsyncRedisCommands { + /** + * CRUD Commands + */ + /** + * Set the string value of a key. + */ + set(key: string, value: string): Promise; + set(key: string, value: string, flag: string): Promise; + set(key: string, value: string, mode: string, duration: number): Promise; + set(key: string, value: string, mode: string, duration: number, flag: string): Promise; + SET(key: string, value: string): Promise; + SET(key: string, value: string, flag: string): Promise; + SET(key: string, value: string, mode: string, duration: number): Promise; + SET(key: string, value: string, mode: string, duration: number, flag: string): Promise; +} + +declare const AsyncRedis: AsyncRedisConstructor; +export = AsyncRedis; diff --git a/src/index.js b/src/index.js index e9e3911..bc65979 100644 --- a/src/index.js +++ b/src/index.js @@ -1,47 +1,49 @@ const redis = require('redis'); -const commands = require('redis-commands').list; const objectDecorator = require('./object-decorator'); +const objectPromisify = require('./object-promisify'); +const redisCommands = require('./redis-commands'); -const AsyncRedis = function (args) { - const client = Array.isArray(args) ? redis.createClient(...args) : redis.createClient(args); - return AsyncRedis.decorate(client); -}; - -AsyncRedis.createClient = (...args) => new AsyncRedis(args); +const redisClients = new Map(); -const commandsToSkipSet = new Set(['multi']); -const commandSet = new Set(commands.filter(c => !commandsToSkipSet.has(c))); -const queueCommandSet = new Set(['batch', 'multi']); -const multiCommandSet = new Set(['exec', 'exec_atomic']); +/** + * @return RedisClient + */ +const AsyncRedis = function (args=null) { + if (args) { + const serializedArgs = JSON.stringify(args); + if (!redisClients.has(serializedArgs)) { + redisClients.set(serializedArgs, Array.isArray(args) ? redis.createClient(...args) : redis.createClient(args)); + } + this.setup(redisClients.get(serializedArgs)); + } +}; -const promisify = function (object, method) { - return (...args) => new Promise((resolve, reject) => { - args.push((error, ...results) => { - if (error) { - reject(error, ...results); - } else { - resolve(...results); +AsyncRedis.prototype.setup = function(redisClient) { + this.__redisClient = redisClient; + const commandConfigs = redisCommands(redisClient); + objectDecorator(redisClient, (name, method) => { + if (commandConfigs.commands.has(name)) { + objectPromisify(this, method); + } else if (commandConfigs.queueCommands.has(name)) { + return (...args) => { + const multi = method.apply(redisClient, args); + return objectDecorator(multi, (multiName, multiMethod) => { + if (commandConfigs.multiCommands.has(multiName)) { + return objectPromisify(multi, multiMethod); + } + return multiMethod; + }); } - }); - method.apply(object, args); + } }); }; -AsyncRedis.decorate = redisClient => objectDecorator(redisClient, (name, method) => { - if (commandSet.has(name)) { - return promisify(redisClient, method); - } else if (queueCommandSet.has(name)) { - return (...args) => { - const multi = method.apply(redisClient, args); - return objectDecorator(multi, (multiName, multiMethod) => { - if (multiCommandSet.has(multiName)) { - return promisify(multi, multiMethod); - } - return multiMethod; - }); - } - } - return method; -}); +AsyncRedis.createClient = (...args) => new AsyncRedis(args); + +AsyncRedis.decorate = (redisClient) => { + const asyncClient = new AsyncRedis(); + asyncClient.setup(redisClient); + return asyncClient; +}; module.exports = AsyncRedis; diff --git a/src/object-decorator.js b/src/object-decorator.js index ecf44eb..f67622a 100644 --- a/src/object-decorator.js +++ b/src/object-decorator.js @@ -4,12 +4,11 @@ * @returns {*} */ module.exports = (object, decorator) => { - /* eslint-disable */ for (const prop in object) { + console.log(prop); if (typeof object[prop] === 'function') { object[prop] = decorator(prop, object[prop]); } } - /* eslint-enable */ return object; }; diff --git a/src/object-promisify.js b/src/object-promisify.js new file mode 100644 index 0000000..d733669 --- /dev/null +++ b/src/object-promisify.js @@ -0,0 +1,19 @@ +/** + * @param object + * @param method + * @returns {*} + */ +module.exports = (object, method) => { + return (...args) => new Promise((resolve, reject) => { + args.push((error, ...results) => { + console.log(results); + if (error) { + reject(error, ...results); + } else { + resolve(...results); + } + }); + objects. + method.apply(object, args); + }); +}; diff --git a/src/redis-commands.js b/src/redis-commands.js new file mode 100644 index 0000000..2e638e9 --- /dev/null +++ b/src/redis-commands.js @@ -0,0 +1,21 @@ +const commandsToSkipSet = new Set(['multi']); +const queueCommands = new Set(['batch', 'multi']); +const multiCommands = new Set(['exec', 'exec_atomic']); + +/** + * @param redisClient + * @returns {{queueCommands: Set, multiCommands: Set, commands: Set}} + */ +module.exports = (redisClient) => { + const commands = []; + for (const prop in redisClient) { + if (typeof redisClient[prop] === 'function') { + commands.push(prop); + } + } + return { + commands: new Set(commands.filter(c => !commandsToSkipSet.has(c))), + queueCommands, + multiCommands, + } +}; diff --git a/test/integration/commands.spec.js b/test/integration/commands.spec.js new file mode 100644 index 0000000..7b8f14f --- /dev/null +++ b/test/integration/commands.spec.js @@ -0,0 +1,60 @@ +const { assert } = require('chai'); + +const AsyncRedis = require('../../src'); +const getTestRedisConfig = require('../util/getTestRedisConfig'); + +describe('Commands', () => { + let redis; + + beforeEach(async () => { + redis = new AsyncRedis(getTestRedisConfig()); + }); + + afterEach(async () => { + redis.flushall(); + }); + + xdescribe('APPEND Commands', () => { + it('should execute append', async () => { + const status = await redis.append('SETUSER', 'hello'); + assert.equal(status, 'OK'); + }); + + it('should execute exists', async () => { + const status = await redis.append('SETUSER', 'world'); + assert.equal(status, 'OK'); + }); + }); + + describe('CRUD (set, get, del)', () => { + it('should return ok', async () => { + const status = await redis.set('hello', 'world'); + assert.equal(status, "OK"); + }); + + it('should return true', async () => { + await redis.set('hello', 'world'); + const status = await redis.del('hello'); + assert.equal(status, true); + }); + + it('should return false', async () => { + const status = await redis.del('hello'); + assert.equal(status, false); + }); + }); + + xdescribe('test rejection', () => { + it('should reject promise on throw', async () => { + const promise = redis.set('hello'); + assert.isRejected(promise, Error); + }); + }); + + xdescribe('test multi not a promise', () => { + it('should be not equal', async () => { + const notAPromise = redis.multi(); + assert.notEqual(Promise.resolve(notAPromise), notAPromise); + }); + }); +}); diff --git a/test/integration/commands/common.spec.js b/test/integration/commands/common.spec.js deleted file mode 100644 index 806abca..0000000 --- a/test/integration/commands/common.spec.js +++ /dev/null @@ -1,64 +0,0 @@ -const { assert } = require('chai'); -const AsyncRedis = require('../../../src'); - -describe('Commands - Common', () => { - let redisClient; - - beforeEach(async () => { - redisClient = new AsyncRedis(); - }); - - afterEach(async () => { - redisClient.flushall(); - }); - - describe('test set method', () => { - it('should return ok', async () => { - const status = await redisClient.set('hello', 'world'); - assert.equal(status, 'OK'); - }); - }); - - describe('test get method', () => { - it('should return value', async () => { - await redisClient.set('hello', 'world'); - const value = await redisClient.get('hello'); - assert.equal(value, 'world'); - }); - }); - - describe('test del method', () => { - it('should return true', async () => { - await redisClient.set('hello', 'world'); - const status = await redisClient.del('hello'); - assert.equal(status, true); - }); - - it('should return false', async () => { - const status = await redisClient.del('hello'); - assert.equal(status, false); - }); - }); - - describe('test del method', () => { - it('should return true', async () => { - await redisClient.set('hello', 'world'); - const status = await redisClient.del('hello'); - assert.equal(status, true); - }); - }); - - describe('test rejection', () => { - it('should reject promise on throw', async () => { - const promise = redisClient.set('hello'); - assert.isRejected(promise, Error); - }); - }); - - describe('test multi not a promise', () => { - it('should be not equal', async () => { - const notAPromise = redisClient.multi(); - assert.notEqual(Promise.resolve(notAPromise), notAPromise); - }); - }); -}); diff --git a/test/integration/create-client.spec.js b/test/integration/create-client.spec.js index b364cf9..19ae045 100644 --- a/test/integration/create-client.spec.js +++ b/test/integration/create-client.spec.js @@ -1,26 +1,24 @@ const { assert } = require('chai'); -const { RedisClient } = require('redis'); + const AsyncRedis = require('../../src'); +const getTestRedisConfig = require('../util/getTestRedisConfig'); describe('AsyncRedis.createClient', () => { - const options = { - host: '127.0.0.1', - port: 6379, - }; + const options = getTestRedisConfig(); const url = `redis://${options.host}:${options.port}`; it('should create using constructor syntax', async () => { const asyncRedisClient = new AsyncRedis(options); - assert.instanceOf(asyncRedisClient, RedisClient); + assert.instanceOf(asyncRedisClient, AsyncRedis); }); it('should create using url syntax', async () => { const asyncRedisClient = AsyncRedis.createClient(url); - assert.instanceOf(asyncRedisClient, RedisClient); + assert.instanceOf(asyncRedisClient, AsyncRedis); }); it('should create using options', async () => { const asyncRedisClient = AsyncRedis.createClient(options); - assert.instanceOf(asyncRedisClient, RedisClient); + assert.instanceOf(asyncRedisClient, AsyncRedis); }); }); diff --git a/test/integration/decorate-redis.spec.js b/test/integration/decorate-redis.spec.js index 1751684..21e1cd6 100644 --- a/test/integration/decorate-redis.spec.js +++ b/test/integration/decorate-redis.spec.js @@ -1,14 +1,17 @@ const { assert } = require('chai'); const redis = require('redis'); -const redisCommands = require('redis-commands'); + const AsyncRedis = require('../../src'); +const getRedisCommands = require('../../src/redis-commands'); +const getTestRedisConfig = require('../util/getTestRedisConfig'); describe('AsyncRedis.decorate', () => { - const client = redis.createClient(); - const asyncRedisClient = AsyncRedis.decorate(client); + const options = getTestRedisConfig(); + const redisClient = redis.createClient(options); + const asyncRedisClient = AsyncRedis.decorate(redisClient); it('should have decorated every command', async () => { - const commands = redisCommands.list; + const commands = getRedisCommands(redisClient).commands; commands.forEach((command) => { assert.isFunction(asyncRedisClient[command], `redis.${command} isn't decorated`); }); diff --git a/test/setup.js b/test/setup.js index ae04a44..7969ad1 100644 --- a/test/setup.js +++ b/test/setup.js @@ -1,3 +1,4 @@ +require('dotenv').config(); const chai = require('chai'); const chaiAsPromise = require('chai-as-promised'); diff --git a/test/unit/object-decorator.js b/test/unit/object-decorator.spec.js similarity index 84% rename from test/unit/object-decorator.js rename to test/unit/object-decorator.spec.js index 6bba4cc..fcbafdc 100644 --- a/test/unit/object-decorator.js +++ b/test/unit/object-decorator.spec.js @@ -1,7 +1,8 @@ const { assert } = require('chai'); -const objectDecorator = require('../../src/object-decorator'); -const Mock = () => { +const objectDecoratorSpec = require('../../src/object-decorator'); + +const Mock = function() { this.add = (a, b) => a + b; this.subtract = (a, b) => a - b; }; @@ -10,7 +11,7 @@ describe('Object Decorator', () => { it('should decorate a method', async () => { const mock = new Mock(); const mockTwo = new Mock(); - objectDecorator(mock, (name, method) => { + objectDecoratorSpec(mock, (name, method) => { switch (name) { case 'add': return (...args) => { diff --git a/test/util/getTestRedisConfig.js b/test/util/getTestRedisConfig.js new file mode 100644 index 0000000..92689e8 --- /dev/null +++ b/test/util/getTestRedisConfig.js @@ -0,0 +1,9 @@ +const redisHost = process.env.REDIS_HOST || 'localhost'; +const redisPost = process.env.REDIS_PORT || '6379'; + +module.exports = () => { + return { + host: redisHost, + port: redisPost, + } +}; diff --git a/yarn.lock b/yarn.lock index 53df66a..771ae9a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -623,6 +623,11 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dotenv@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" + integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" From 603229d475cfe7123b121a19cd2f6d32e86eb49c Mon Sep 17 00:00:00 2001 From: Matthew Oaxaca Date: Wed, 12 Aug 2020 08:32:57 -0700 Subject: [PATCH 2/4] WIP Test Coverage --- package.json | 4 +- src/index.d.ts | 128 +++++++++++++++++++++++++++++- src/index.js | 2 +- src/object-decorator.js | 3 +- src/object-promisify.js | 29 +++---- test/integration/commands.spec.js | 118 +++++++++++++++++++++++---- yarn.lock | 19 +++-- 7 files changed, 260 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index 8e31c92..b8aaed8 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "private": false, "author": "Matthew Oaxaca", "license": "MIT", - "version": "1.1.8", + "version": "2.0.0", "name": "async-redis", "keywords": [ "redis", @@ -40,6 +40,8 @@ "redis": "3.0.2" }, "devDependencies": { + "@types/node": "^14.0.27", + "@types/redis": "^2.8.25", "chai": "^4.2.0", "chai-as-promised": "^7.1.1", "coveralls": "^3.1.0", diff --git a/src/index.d.ts b/src/index.d.ts index 91ca5ff..305a34b 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -1,7 +1,21 @@ -import { Commands, RedisClient, ClientOpts } from 'redis'; +import { Commands, RedisClient, ClientOpts, ServerInfo } from 'redis'; +import {EventEmitter} from "events"; + +type Callback = (err: Error | null, reply: T) => void; type Omit = Pick>; type Omitted = Omit>; +type OkOrError = 'OK'|Error + +interface OverloadedCommand { + (arg1: T, arg2: T, arg3: T, arg4: T, arg5: T, arg6: T): R; + (arg1: T, arg2: T, arg3: T, arg4: T, arg5: T): R; + (arg1: T, arg2: T, arg3: T, arg4: T): R; + (arg1: T, arg2: T, arg3: T): R; + (arg1: T, arg2: T | T[]): R; + (arg1: T | T[]): R; + (...args: Array): R; +} interface Promisified extends Omitted, Commands> {} @@ -19,10 +33,117 @@ interface AsyncRedisConstructor { decorate: (client: RedisClient) => Promisified; } -interface AsyncRedisCommands { +interface AsyncRedisEventHandlers extends EventEmitter { + on(event: 'message' | 'message_buffer', listener: (channel: string, message: string) => void): this; + on(event: 'pmessage' | 'pmessage_buffer', listener: (pattern: string, channel: string, message: string) => void): this; + on(event: 'subscribe' | 'unsubscribe', listener: (channel: string, count: number) => void): this; + on(event: 'psubscribe' | 'punsubscribe', listener: (pattern: string, count: number) => void): this; + on(event: string, listener: (...args: any[]) => void): this; +} + +interface AsyncRedisCommands { + /** + * Listen for all requests received by the server in real time. + */ + monitor(cb?: Callback): any; + MONITOR(cb?: Callback): any; + + /** + * Get information and statistics about the server. + */ + info(): Promise; + info(section?: string | string[]): Promise; + INFO(): Promise; + INFO(section?: string | string[]): Promise; + + /** + * Ping the server. + */ + ping(): Promise; + ping(message: string): Promise; + PING(): Promise; + PING(message: string): Promise; + + /** + * Authenticate to the server. + */ + auth(password: string): Promise; + AUTH(password: string): Promise; + + /** + * Get array of Redis command details. + * + * COUNT - Get total number of Redis commands. + * GETKEYS - Extract keys given a full Redis command. + * INFO - Get array of specific REdis command details. + */ + command(cb?: Callback>): R; + COMMAND(cb?: Callback>): R; + + /** + * Get array of Redis command details. + * + * COUNT - Get array of Redis command details. + * GETKEYS - Extract keys given a full Redis command. + * INFO - Get array of specific Redis command details. + * GET - Get the value of a configuration parameter. + * REWRITE - Rewrite the configuration file with the in memory configuration. + * SET - Set a configuration parameter to the given value. + * RESETSTAT - Reset the stats returned by INFO. + */ + config: OverloadedCommand; + CONFIG: OverloadedCommand; + + /** + * Return the number of keys in the selected database. + */ + dbsize(): Promise; + DBSIZE(): Promise; + + /** + * OBJECT - Get debugging information about a key. + * SEGFAULT - Make the server crash. + */ + debug: OverloadedCommand; + DEBUG: OverloadedCommand; + + /** + * PubSub Commands + */ + /** + * Post a message to a channel. + */ + publish(channel: string, value: string): Promise; + PUBLISH(channel: string, value: string): Promise; + /** * CRUD Commands */ + + /** + * Append a value to a key. + */ + append(key: string, value: string): Promise; + APPEND(key: string, value: string): Promise; + + /** + * Asynchronously rewrite the append-only file. + */ + bgrewriteaof(): Promise; + BGREWRITEAOF(): Promise; + + /** + * Asynchronously save the dataset to disk. + */ + bgsave(): Promise; + BGSAVE(): Promise; + + /** + * Determine if a key exists. + */ + exists: OverloadedCommand; + EXISTS: OverloadedCommand; + /** * Set the string value of a key. */ @@ -36,5 +157,6 @@ interface AsyncRedisCommands { SET(key: string, value: string, mode: string, duration: number, flag: string): Promise; } -declare const AsyncRedis: AsyncRedisConstructor; +interface AsyncRedisInterface extends AsyncRedisConstructor, AsyncRedisEventHandlers, AsyncRedisCommands {} +declare const AsyncRedis: AsyncRedisInterface; export = AsyncRedis; diff --git a/src/index.js b/src/index.js index bc65979..40e4253 100644 --- a/src/index.js +++ b/src/index.js @@ -23,7 +23,7 @@ AsyncRedis.prototype.setup = function(redisClient) { const commandConfigs = redisCommands(redisClient); objectDecorator(redisClient, (name, method) => { if (commandConfigs.commands.has(name)) { - objectPromisify(this, method); + objectPromisify(this, redisClient, name); } else if (commandConfigs.queueCommands.has(name)) { return (...args) => { const multi = method.apply(redisClient, args); diff --git a/src/object-decorator.js b/src/object-decorator.js index f67622a..4b018ac 100644 --- a/src/object-decorator.js +++ b/src/object-decorator.js @@ -5,9 +5,8 @@ */ module.exports = (object, decorator) => { for (const prop in object) { - console.log(prop); if (typeof object[prop] === 'function') { - object[prop] = decorator(prop, object[prop]); + decorator(prop, object[prop]); } } return object; diff --git a/src/object-promisify.js b/src/object-promisify.js index d733669..7e54f1e 100644 --- a/src/object-promisify.js +++ b/src/object-promisify.js @@ -1,19 +1,20 @@ /** + * @param proxy * @param object - * @param method - * @returns {*} + * @param name + * @returns void */ -module.exports = (object, method) => { - return (...args) => new Promise((resolve, reject) => { - args.push((error, ...results) => { - console.log(results); - if (error) { - reject(error, ...results); - } else { - resolve(...results); - } +module.exports = (proxy, object, name) => { + proxy[name] = (...args) => { + return new Promise((resolve, reject) => { + args.push((error, ...results) => { + if (error) { + reject(error, ...results); + } else { + resolve(...results); + } + }); + object[name](...args); }); - objects. - method.apply(object, args); - }); + }; }; diff --git a/test/integration/commands.spec.js b/test/integration/commands.spec.js index 7b8f14f..de393a9 100644 --- a/test/integration/commands.spec.js +++ b/test/integration/commands.spec.js @@ -1,5 +1,9 @@ +require('../setup'); const { assert } = require('chai'); +/** + * @type {AsyncRedis} + */ const AsyncRedis = require('../../src'); const getTestRedisConfig = require('../util/getTestRedisConfig'); @@ -14,25 +18,59 @@ describe('Commands', () => { redis.flushall(); }); - xdescribe('APPEND Commands', () => { - it('should execute append', async () => { - const status = await redis.append('SETUSER', 'hello'); - assert.equal(status, 'OK'); + describe('Auth', () => { + it('should check decoration', async () => { + assert.equal(typeof redis.auth, 'function'); }); - it('should execute exists', async () => { - const status = await redis.append('SETUSER', 'world'); + it('should test rejection', async () => { + const promise = redis.auth('bad_password'); + assert.isRejected(promise, Error); + }); + }); + + describe('CRUD - AOF (Append Only File)', () => { + it('should work with AOF', async () => { + await redis.config('set', 'appendonly', 'no'); + await redis.config('rewrite'); + let status = await redis.bgrewriteaof(); + assert.equal(status, 'Background append only file rewriting started'); + status = await redis.set('test', 'value'); assert.equal(status, 'OK'); + status = await redis.bgsave(); + await redis.bgrewriteaof(); + assert.equal(status, 'Background saving started'); }); }); - describe('CRUD (set, get, del)', () => { - it('should return ok', async () => { + describe('CRUD (append, set, get, del, exists)', () => { + it('should execute append', async () => { + let status = await redis.append('KEY', 'hello'); + assert.equal(status, 5); + status = await redis.append('KEY', 'world'); + assert.equal(status, 10); + }); + + it('should execute exists', async () => { + let status = await redis.exists('KEY'); + assert.equal(status, 0); + await redis.set('KEY', ''); + status = await redis.exists('KEY'); + assert.equal(status, 1); + }); + + it('should set and return ok', async () => { const status = await redis.set('hello', 'world'); assert.equal(status, "OK"); }); - it('should return true', async () => { + it('should get value', async () => { + await redis.set('hello', 'world'); + const value = await redis.get('hello'); + assert.equal(value, "world"); + }); + + it('should del and return true', async () => { await redis.set('hello', 'world'); const status = await redis.del('hello'); assert.equal(status, true); @@ -44,17 +82,65 @@ describe('Commands', () => { }); }); - xdescribe('test rejection', () => { - it('should reject promise on throw', async () => { - const promise = redis.set('hello'); - assert.isRejected(promise, Error); - }); - }); - xdescribe('test multi not a promise', () => { it('should be not equal', async () => { const notAPromise = redis.multi(); assert.notEqual(Promise.resolve(notAPromise), notAPromise); }); }); + + describe('PubSub', () => { + + }); + + describe('Utility', () => { + it('should return server info', async () => { + let info = await redis.info(); + assert.equal(info.slice(0, 8), '# Server'); + }); + + it('should ping', async () => { + let reply = await redis.ping(); + assert.equal(reply, 'PONG'); + }); + + it('should return db size', async () => { + let status = await redis.set('test', 'value'); + assert.equal(status, 'OK'); + status = await redis.dbsize(); + assert.equal(status, 1); + }); + + it('should execute debug', async () => { + let status = await redis.set('test', 'value'); + assert.equal(status, 'OK'); + status = await redis.debug('object', 'test'); + assert(status); + }); + + it('should execute monitor', async () => { + const promises = []; + promises.push(new Promise((resolve, reject) => { + redis.monitor((error, status) => { + if (error) { + reject(error) + } else { + assert.equal(status, 'OK'); + resolve(); + } + }); + })); + promises.push(new Promise((resolve) => { + redis.on('monitor', function(time, args) { + assert.equal(args.length, 3); + assert.equal(args[0], 'set'); + assert.equal(args[1], 'hello'); + assert.equal(args[2], 'world'); + resolve(); + }); + })); + promises.push(redis.set('hello', 'world')); + await Promise.all(promises); + }); + }); }); diff --git a/yarn.lock b/yarn.lock index 771ae9a..b20d9ee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -197,6 +197,18 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== +"@types/node@*", "@types/node@^14.0.27": + version "14.0.27" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.27.tgz#a151873af5a5e851b51b3b065c9e63390a9e0eb1" + integrity sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g== + +"@types/redis@^2.8.25": + version "2.8.25" + resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.25.tgz#046bfff24b82effa59d74744c6fcf8995be17479" + integrity sha512-e5N5Dg712aZ1CPi1Li0XalukPSWd2RTLYzmrMsQ84NkYQ7cqKHC+HroXM1WP65O1zRGfzld72/u9ikumEe+ylA== + dependencies: + "@types/node" "*" + acorn-jsx@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" @@ -1739,11 +1751,6 @@ redis-commands@^1.5.0: resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.5.0.tgz#80d2e20698fe688f227127ff9e5164a7dd17e785" integrity sha512-6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg== -redis-commands@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.6.0.tgz#36d4ca42ae9ed29815cdb30ad9f97982eba1ce23" - integrity sha512-2jnZ0IkjZxvguITjFTrGiLyzQZcTvaw8DAaCXxZq/dsHXz7KfMQ3OUJy7Tz9vnRtZRVz6VRCPDvruvU8Ts44wQ== - redis-errors@^1.0.0, redis-errors@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" @@ -1756,7 +1763,7 @@ redis-parser@^3.0.0: dependencies: redis-errors "^1.0.0" -redis@^3.0.2: +redis@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/redis/-/redis-3.0.2.tgz#bd47067b8a4a3e6a2e556e57f71cc82c7360150a" integrity sha512-PNhLCrjU6vKVuMOyFu7oSP296mwBkcE6lrAjruBYG5LgdSqtRBoVQIylrMyVZD/lkF24RSNNatzvYag6HRBHjQ== From f6b0752cb7dbcedc323e39dab8adbfb4a8ce0960 Mon Sep 17 00:00:00 2001 From: Matthew Oaxaca Date: Tue, 18 Aug 2020 09:53:55 -0700 Subject: [PATCH 3/4] Fixing Tests --- src/object-decorator.js | 5 +++- test/integration/commands.spec.js | 46 ++++++++++++++++++++++++------ test/unit/object-decorator.spec.js | 4 +-- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/object-decorator.js b/src/object-decorator.js index 4b018ac..ff6673c 100644 --- a/src/object-decorator.js +++ b/src/object-decorator.js @@ -6,7 +6,10 @@ module.exports = (object, decorator) => { for (const prop in object) { if (typeof object[prop] === 'function') { - decorator(prop, object[prop]); + const returned = decorator(prop, object[prop]); + if (typeof returned === 'function') { + object[prop] = returned; + } } } return object; diff --git a/test/integration/commands.spec.js b/test/integration/commands.spec.js index de393a9..a0eac98 100644 --- a/test/integration/commands.spec.js +++ b/test/integration/commands.spec.js @@ -15,7 +15,7 @@ describe('Commands', () => { }); afterEach(async () => { - redis.flushall(); + await redis.flushall(); }); describe('Auth', () => { @@ -30,7 +30,8 @@ describe('Commands', () => { }); describe('CRUD - AOF (Append Only File)', () => { - it('should work with AOF', async () => { + // TODO Figure a better way to clear this state between redis servers + xit('should work with AOF', async () => { await redis.config('set', 'appendonly', 'no'); await redis.config('rewrite'); let status = await redis.bgrewriteaof(); @@ -82,15 +83,44 @@ describe('Commands', () => { }); }); - xdescribe('test multi not a promise', () => { - it('should be not equal', async () => { - const notAPromise = redis.multi(); - assert.notEqual(Promise.resolve(notAPromise), notAPromise); + describe('test multi not a promise', () => { + let multiClient = null; + beforeEach(async () => { + multiClient = redis.multi(); + multiClient.set('test', 'value'); + multiClient.set('foo', 'bar') + .set('hello', 'world') + .del('hello'); + }); + + it('should run multi into exec', async () => { + const results = await multiClient.exec(); + console.log(results); + }); + + it('should run multi into exec_atomic', async () => { + const results = await multiClient.exec_atomic(); + console.log(results); + }); + + it('should run multi into exec_atomic', async () => { + const results = await multiClient.batch(); + console.log(results); }); }); - describe('PubSub', () => { + describe('Increment | Decrement functions', () => { + it('should return server info', async () => { + let info = await redis.info(); + assert.equal(info.slice(0, 8), '# Server'); + }); + }); + describe('PubSub', () => { + it('should return server info', async () => { + let info = await redis.info(); + assert.equal(info.slice(0, 8), '# Server'); + }); }); describe('Utility', () => { @@ -131,7 +161,7 @@ describe('Commands', () => { }); })); promises.push(new Promise((resolve) => { - redis.on('monitor', function(time, args) { + redis.once('monitor', function(time, args) { assert.equal(args.length, 3); assert.equal(args[0], 'set'); assert.equal(args[1], 'hello'); diff --git a/test/unit/object-decorator.spec.js b/test/unit/object-decorator.spec.js index fcbafdc..fb7abd0 100644 --- a/test/unit/object-decorator.spec.js +++ b/test/unit/object-decorator.spec.js @@ -1,6 +1,6 @@ const { assert } = require('chai'); -const objectDecoratorSpec = require('../../src/object-decorator'); +const objectDecorator = require('../../src/object-decorator'); const Mock = function() { this.add = (a, b) => a + b; @@ -11,7 +11,7 @@ describe('Object Decorator', () => { it('should decorate a method', async () => { const mock = new Mock(); const mockTwo = new Mock(); - objectDecoratorSpec(mock, (name, method) => { + objectDecorator(mock, (name, method) => { switch (name) { case 'add': return (...args) => { From a71ace671dcfcc3df823d695292b344ee3635309 Mon Sep 17 00:00:00 2001 From: Matthew Oaxaca Date: Tue, 25 May 2021 15:27:03 -0700 Subject: [PATCH 4/4] Finishing Touches --- .github/workflows/push.yaml | 0 .github/workflows/release.yaml | 0 .travis.yml | 14 - package.json | 15 +- src/index.d.ts | 382 +++++++++-- src/index.js | 17 +- src/redis-commands.js | 3 +- test/integration/commands.spec.js | 40 +- yarn.lock | 1011 ++++++++++++----------------- 9 files changed, 831 insertions(+), 651 deletions(-) create mode 100644 .github/workflows/push.yaml create mode 100644 .github/workflows/release.yaml delete mode 100644 .travis.yml diff --git a/.github/workflows/push.yaml b/.github/workflows/push.yaml new file mode 100644 index 0000000..e69de29 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..e69de29 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 95bc07b..0000000 --- a/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -language: node_js -sudo: false -node_js: - - "node" - - "8" - - "7.6" -services: - - redis-server -install: - - yarn install -script: - - yarn lint - - yarn test - - yarn coveralls diff --git a/package.json b/package.json index b8aaed8..717effb 100644 --- a/package.json +++ b/package.json @@ -31,23 +31,24 @@ "coveralls": "nyc yarn test && nyc report --reporter=text-lcov | coveralls", "lint": "eslint --fix --ext .js, .", "test": "mocha test/**/*.spec.js --config test/setup.js --exit", + "test:integration": "mocha test/integration/*.spec.js --config test/setup.js --exit", "test:unit": "mocha test/unit/*.spec.js --config test/setup.js --exit", "version:patch": "npm version patch", "version:minor": "npm version minor", "version:major": "npm version major" }, "dependencies": { - "redis": "3.0.2" + "redis": "3.1.2" }, "devDependencies": { - "@types/node": "^14.0.27", - "@types/redis": "^2.8.25", - "chai": "^4.2.0", + "@types/node": "^15.6.1", + "@types/redis": "^2.8.28", + "chai": "^4.3.4", "chai-as-promised": "^7.1.1", "coveralls": "^3.1.0", - "dotenv": "^8.2.0", - "eslint": "^7.6.0", - "mocha": "^8.1.0", + "dotenv": "^10.0.0", + "eslint": "^7.27.0", + "mocha": "^8.4.0", "nyc": "^15.1.0" } } diff --git a/src/index.d.ts b/src/index.d.ts index 305a34b..918046f 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -1,36 +1,75 @@ -import { Commands, RedisClient, ClientOpts, ServerInfo } from 'redis'; +import { RedisClient, ClientOpts, ServerInfo } from 'redis'; import {EventEmitter} from "events"; type Callback = (err: Error | null, reply: T) => void; - -type Omit = Pick>; -type Omitted = Omit>; +type AsyncCallback = (err: Error | null, reply: T) => Promise; type OkOrError = 'OK'|Error -interface OverloadedCommand { - (arg1: T, arg2: T, arg3: T, arg4: T, arg5: T, arg6: T): R; - (arg1: T, arg2: T, arg3: T, arg4: T, arg5: T): R; - (arg1: T, arg2: T, arg3: T, arg4: T): R; - (arg1: T, arg2: T, arg3: T): R; - (arg1: T, arg2: T | T[]): R; - (arg1: T | T[]): R; - (...args: Array): R; +export interface OverloadedCommand { + (arg1: T, arg2: T, arg3: T, arg4: T, arg5: T, arg6: T, cb?: Callback): R; + (arg1: T, arg2: T, arg3: T, arg4: T, arg5: T, cb?: Callback): R; + (arg1: T, arg2: T, arg3: T, arg4: T, cb?: Callback): R; + (arg1: T, arg2: T, arg3: T, cb?: Callback): R; + (arg1: T, arg2: T | T[], cb?: Callback): R; + (arg1: T | T[], cb?: Callback): R; + (...args: Array>): R; +} + +export interface OverloadedKeyCommand { + (key: string, arg1: T, arg2: T, arg3: T, arg4: T, arg5: T, arg6: T, cb?: Callback): Promise; + (key: string, arg1: T, arg2: T, arg3: T, arg4: T, arg5: T, cb?: Callback): Promise; + (key: string, arg1: T, arg2: T, arg3: T, arg4: T, cb?: Callback): Promise; + (key: string, arg1: T, arg2: T, arg3: T, cb?: Callback): Promise; + (key: string, arg1: T, arg2: T, cb?: Callback): Promise; + (key: string, arg1: T | T[], cb?: Callback): Promise; + (key: string, ...args: Array>): Promise; + (...args: Array>): Promise; +} + +export interface OverloadedListCommand { + (arg1: T, arg2: T, arg3: T, arg4: T, arg5: T, arg6: T, cb?: Callback): Promise; + (arg1: T, arg2: T, arg3: T, arg4: T, arg5: T, cb?: Callback): Promise; + (arg1: T, arg2: T, arg3: T, arg4: T, cb?: Callback): Promise; + (arg1: T, arg2: T, arg3: T, cb?: Callback): Promise; + (arg1: T, arg2: T, cb?: Callback): Promise; + (arg1: T | T[], cb?: Callback): Promise; + (...args: Array>): Promise; +} + +export interface OverloadedSetCommand { + (key: string, arg1: T, arg2: T, arg3: T, arg4: T, arg5: T, arg6: T, cb?: Callback): Promise; + (key: string, arg1: T, arg2: T, arg3: T, arg4: T, arg5: T, cb?: Callback): Promise; + (key: string, arg1: T, arg2: T, arg3: T, arg4: T, cb?: Callback): Promise; + (key: string, arg1: T, arg2: T, arg3: T, cb?: Callback): Promise; + (key: string, arg1: T, arg2: T, cb?: Callback): Promise; + (key: string, arg1: T | { [key: string]: T } | T[], cb?: Callback): Promise; + (key: string, ...args: Array>): Promise; + (args: [string, ...T[]], cb?: Callback): Promise; +} + +export interface OverloadedLastCommand { + (arg1: T1, arg2: T1, arg3: T1, arg4: T1, arg5: T1, arg6: T2, cb?: Callback): Promise; + (arg1: T1, arg2: T1, arg3: T1, arg4: T1, arg5: T2, cb?: Callback): Promise; + (arg1: T1, arg2: T1, arg3: T1, arg4: T2, cb?: Callback): Promise; + (arg1: T1, arg2: T1, arg3: T2, cb?: Callback): Promise; + (arg1: T1, arg2: T2 | Array, cb?: Callback): Promise; + (args: Array, cb?: Callback): Promise; + (...args: Array>): Promise; } -interface Promisified extends Omitted, Commands> {} interface AsyncRedisConstructor { - new (port: number, host?: string, options?: ClientOpts): Promisified; - new (unix_socket: string, options?: ClientOpts): Promisified; - new (redis_url: string, options?: ClientOpts): Promisified; - new (options?: ClientOpts): Promisified; + new (port: number, host?: string, options?: ClientOpts): AsyncRedis; + new (unix_socket: string, options?: ClientOpts): AsyncRedis; + new (redis_url: string, options?: ClientOpts): AsyncRedis; + new (options?: ClientOpts): AsyncRedis; - createClient(port: number, host?: string, options?: ClientOpts): Promisified; - createClient(unix_socket: string, options?: ClientOpts): Promisified; - createClient(redis_url: string, options?: ClientOpts): Promisified; - createClient(options?: ClientOpts): Promisified; + createClient(port: number, host?: string, options?: ClientOpts): AsyncRedis; + createClient(unix_socket: string, options?: ClientOpts): AsyncRedis; + createClient(redis_url: string, options?: ClientOpts): AsyncRedis; + createClient(options?: ClientOpts): AsyncRedis; - decorate: (client: RedisClient) => Promisified; + decorate: (client: RedisClient) => AsyncRedis; } interface AsyncRedisEventHandlers extends EventEmitter { @@ -70,6 +109,18 @@ interface AsyncRedisCommands { auth(password: string): Promise; AUTH(password: string): Promise; + /** + * Asynchronously rewrite the append-only file. + */ + bgrewriteaof(): Promise; + BGREWRITEAOF(): Promise; + + /** + * Asynchronously save the dataset to disk. + */ + bgsave(): Promise; + BGSAVE(): Promise; + /** * Get array of Redis command details. * @@ -77,8 +128,8 @@ interface AsyncRedisCommands { * GETKEYS - Extract keys given a full Redis command. * INFO - Get array of specific REdis command details. */ - command(cb?: Callback>): R; - COMMAND(cb?: Callback>): R; + command(cb?: Callback>): Promise; + COMMAND(cb?: Callback>): Promise; /** * Get array of Redis command details. @@ -91,8 +142,8 @@ interface AsyncRedisCommands { * SET - Set a configuration parameter to the given value. * RESETSTAT - Reset the stats returned by INFO. */ - config: OverloadedCommand; - CONFIG: OverloadedCommand; + config: OverloadedCommand; + CONFIG: OverloadedCommand; /** * Return the number of keys in the selected database. @@ -104,12 +155,37 @@ interface AsyncRedisCommands { * OBJECT - Get debugging information about a key. * SEGFAULT - Make the server crash. */ - debug: OverloadedCommand; - DEBUG: OverloadedCommand; + debug: OverloadedCommand; + DEBUG: OverloadedCommand; + + /** + * Return a serialized version of the value stored at the specified key. + */ + dump(key: string, cb?: Callback): Promise; + DUMP(key: string, cb?: Callback): Promise; /** - * PubSub Commands + * Echo the given string. */ + echo(message: T, cb?: Callback): Promise; + ECHO(message: T, cb?: Callback): Promise; + + /** + * Execute a Lua script server side. + */ + eval: OverloadedCommand; + EVAL: OverloadedCommand; + + /** + * Execute a Lue script server side. + */ + evalsha: OverloadedCommand; + EVALSHA: OverloadedCommand; + + /** + * PubSub Commands TODO + */ + /** * Post a message to a channel. */ @@ -117,32 +193,56 @@ interface AsyncRedisCommands { PUBLISH(channel: string, value: string): Promise; /** - * CRUD Commands + * Discard all commands issued after MULTI. */ + discard(cb?: Callback<'OK'>): Promise; + DISCARD(cb?: Callback<'OK'>): Promise; +} +interface CountingCommands { /** - * Append a value to a key. + * Decrement the integer value of a key by one. */ - append(key: string, value: string): Promise; - APPEND(key: string, value: string): Promise; + decr(key: string, cb?: Callback): Promise; + DECR(key: string, cb?: Callback): Promise; /** - * Asynchronously rewrite the append-only file. + * Decrement the integer value of a key by the given number. */ - bgrewriteaof(): Promise; - BGREWRITEAOF(): Promise; + decrby(key: string, decrement: number, cb?: Callback): Promise; + DECRBY(key: string, decrement: number, cb?: Callback): Promise; /** - * Asynchronously save the dataset to disk. + * Increment the integer value of a key by one. */ - bgsave(): Promise; - BGSAVE(): Promise; + incr(key: string, cb?: Callback): Promise; + INCR(key: string, cb?: Callback): Promise; + + /** + * Increment the integer value of a key by the given amount. + */ + incrby(key: string, increment: number, cb?: Callback): Promise; + INCRBY(key: string, increment: number, cb?: Callback): Promise; + + /** + * Increment the float value of a key by the given amount. + */ + incrbyfloat(key: string, increment: number, cb?: Callback): Promise; + INCRBYFLOAT(key: string, increment: number, cb?: Callback): Promise; +} + +interface CrudCommands { + /** + * Append a value to a key. + */ + append(key: string, value: string): Promise; + APPEND(key: string, value: string): Promise; /** * Determine if a key exists. */ - exists: OverloadedCommand; - EXISTS: OverloadedCommand; + exists: OverloadedCommand; + EXISTS: OverloadedCommand; /** * Set the string value of a key. @@ -155,8 +255,202 @@ interface AsyncRedisCommands { SET(key: string, value: string, flag: string): Promise; SET(key: string, value: string, mode: string, duration: number): Promise; SET(key: string, value: string, mode: string, duration: number, flag: string): Promise; + + /** + * Set a key's time to live in seconds. + */ + expire(key: string, seconds: number, cb?: Callback): Promise; + EXPIRE(key: string, seconds: number, cb?: Callback): Promise; + + /** + * Set the expiration for a key as a UNIX timestamp. + */ + expireat(key: string, timestamp: number, cb?: Callback): Promise; + EXPIREAT(key: string, timestamp: number, cb?: Callback): Promise; + + /** + * Remove all keys from all databases. + */ + flushall(cb?: Callback): Promise; + flushall(async: "ASYNC", cb?: Callback): Promise; + FLUSHALL(cb?: Callback): Promise; + FLUSHALL(async: 'ASYNC', cb?: Callback): Promise; + + /** + * Remove all keys from the current database. + */ + flushdb(cb?: Callback<'OK'>): Promise; + flushdb(async: "ASYNC", cb?: Callback): Promise; + FLUSHDB(cb?: Callback<'OK'>): Promise; + FLUSHDB(async: 'ASYNC', cb?: Callback): Promise; + + /** + * Get the value of a key. + */ + get(key: string, cb?: Callback): Promise; + GET(key: string, cb?: Callback): Promise; + + /** + * Returns the bit value at offset in the string value stored at key. + */ + getbit(key: string, offset: number, cb?: Callback): Promise; + GETBIT(key: string, offset: number, cb?: Callback): Promise; + + /** + * Get a substring of the string stored at a key. + */ + getrange(key: string, start: number, end: number, cb?: Callback): Promise; + GETRANGE(key: string, start: number, end: number, cb?: Callback): Promise; + + /** + * Set the string value of a key and return its old value. + */ + getset(key: string, value: string, cb?: Callback): Promise; + GETSET(key: string, value: string, cb?: Callback): Promise; + + /** + * Find all keys matching the given pattern. + */ + keys(pattern: string, cb?: Callback): Promise; + KEYS(pattern: string, cb?: Callback): Promise; } -interface AsyncRedisInterface extends AsyncRedisConstructor, AsyncRedisEventHandlers, AsyncRedisCommands {} -declare const AsyncRedis: AsyncRedisInterface; -export = AsyncRedis; +interface HashCrudCommands { + /** + * Delete on or more hash fields. + */ + hdel: OverloadedKeyCommand; + HDEL: OverloadedKeyCommand; + + /** + * Determine if a hash field exists. + */ + hexists(key: string, field: string, cb?: Callback): Promise; + HEXISTS(key: string, field: string, cb?: Callback): Promise; + + /** + * Get the value of a hash field. + */ + hget(key: string, field: string, cb?: Callback): Promise; + HGET(key: string, field: string, cb?: Callback): Promise; + + /** + * Get all fields and values in a hash. + */ + hgetall(key: string, cb?: Callback<{ [key: string]: string } | null>): Promise; + HGETALL(key: string, cb?: Callback<{ [key: string]: string } | null>): Promise; + + /** + * Increment the integer value of a hash field by the given number. + */ + hincrby(key: string, field: string, increment: number, cb?: Callback): Promise; + HINCRBY(key: string, field: string, increment: number, cb?: Callback): Promise; + + /** + * Increment the float value of a hash field by the given amount. + */ + hincrbyfloat(key: string, field: string, increment: number, cb?: Callback): Promise; + HINCRBYFLOAT(key: string, field: string, increment: number, cb?: Callback): Promise; + + /** + * Get all the fields of a hash. + */ + hkeys(key: string, cb?: Callback): Promise; + HKEYS(key: string, cb?: Callback): Promise; + + /** + * Get the number of fields in a hash. + */ + hlen(key: string, cb?: Callback): Promise; + HLEN(key: string, cb?: Callback): Promise; + + /** + * Get the values of all the given hash fields. + */ + hmget: OverloadedKeyCommand; + HMGET: OverloadedKeyCommand; + + /** + * Set the string value of a hash field. + */ + hset: OverloadedSetCommand; + HSET: OverloadedSetCommand; + + /** + * Set the value of a hash field, only if the field does not exist. + */ + hsetnx(key: string, field: string, value: string, cb?: Callback): Promise; + HSETNX(key: string, field: string, value: string, cb?: Callback): Promise; + + /** + * Get the length of the value of a hash field. + */ + hstrlen(key: string, field: string, cb?: Callback): Promise; + HSTRLEN(key: string, field: string, cb?: Callback): Promise; + + /** + * Get all the values of a hash. + */ + hvals(key: string, cb?: Callback): Promise; + HVALS(key: string, cb?: Callback): Promise; +} + +interface GeoCommands { + /** + * Add one or more geospatial items in the geospatial index represented using a sorted set. + */ + geoadd: OverloadedKeyCommand; + GEOADD: OverloadedKeyCommand; + + /** + * Returns members of a geospatial index as standard geohash strings. + */ + geohash: OverloadedKeyCommand; + GEOHASH: OverloadedKeyCommand; + + /** + * Returns longitude and latitude of members of a geospatial index. + */ + geopos: OverloadedKeyCommand, R>; + GEOPOS: OverloadedKeyCommand, R>; + + /** + * Returns the distance between two members of a geospatial index. + */ + geodist: OverloadedKeyCommand; + GEODIST: OverloadedKeyCommand; + + /** + * Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a point. + */ + georadius: OverloadedKeyCommand, R>; + GEORADIUS: OverloadedKeyCommand, R>; + + /** + * Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a member. + */ + georadiusbymember: OverloadedKeyCommand, R>; + GEORADIUSBYMEMBER: OverloadedKeyCommand, R>; +} + +export const AsyncRedis: new (options: ClientOpts) => AsyncRedis; +export interface AsyncRedis extends AsyncRedisConstructor, AsyncRedisEventHandlers, AsyncRedisCommands { + /** + * Mark the start of a transaction block. + */ + multi(args?: Array>>): Multi; + MULTI(args?: Array>>): Multi; + + batch(args?: Array>>): Multi; + BATCH(args?: Array>>): Multi; +} + +export const Multi: new () => Multi; +export interface Multi extends AsyncRedisEventHandlers, AsyncRedisCommands +{ + exec(): Promise; + EXEC(): Promise; + + exec_atomic(): Promise; + EXEC_ATOMIC(): Promise; +} diff --git a/src/index.js b/src/index.js index 40e4253..7117c53 100644 --- a/src/index.js +++ b/src/index.js @@ -18,14 +18,19 @@ const AsyncRedis = function (args=null) { } }; +/** + * @param {*} redisClient + * @returns void + */ AsyncRedis.prototype.setup = function(redisClient) { this.__redisClient = redisClient; const commandConfigs = redisCommands(redisClient); objectDecorator(redisClient, (name, method) => { if (commandConfigs.commands.has(name)) { objectPromisify(this, redisClient, name); - } else if (commandConfigs.queueCommands.has(name)) { - return (...args) => { + } + if (commandConfigs.queueCommands.has(name)) { + this[name] = (...args) => { const multi = method.apply(redisClient, args); return objectDecorator(multi, (multiName, multiMethod) => { if (commandConfigs.multiCommands.has(multiName)) { @@ -38,8 +43,16 @@ AsyncRedis.prototype.setup = function(redisClient) { }); }; +/** + * @param {...any} args + * @returns AsyncRedis + */ AsyncRedis.createClient = (...args) => new AsyncRedis(args); +/** + * @param {Redis} redisClient + * @returns AsyncRedis + */ AsyncRedis.decorate = (redisClient) => { const asyncClient = new AsyncRedis(); asyncClient.setup(redisClient); diff --git a/src/redis-commands.js b/src/redis-commands.js index 2e638e9..c4d1a53 100644 --- a/src/redis-commands.js +++ b/src/redis-commands.js @@ -1,4 +1,3 @@ -const commandsToSkipSet = new Set(['multi']); const queueCommands = new Set(['batch', 'multi']); const multiCommands = new Set(['exec', 'exec_atomic']); @@ -14,7 +13,7 @@ module.exports = (redisClient) => { } } return { - commands: new Set(commands.filter(c => !commandsToSkipSet.has(c))), + commands: new Set(commands.filter(c => !queueCommands.has(c))), queueCommands, multiCommands, } diff --git a/test/integration/commands.spec.js b/test/integration/commands.spec.js index a0eac98..b4a01dc 100644 --- a/test/integration/commands.spec.js +++ b/test/integration/commands.spec.js @@ -93,19 +93,51 @@ describe('Commands', () => { .del('hello'); }); + afterEach(async () => { + await redis.del('test'); + }); + it('should run multi into exec', async () => { const results = await multiClient.exec(); - console.log(results); + assert.equal(results, true); + const value = await redis.get('test'); + assert.equal(value, "value"); }); it('should run multi into exec_atomic', async () => { const results = await multiClient.exec_atomic(); - console.log(results); + assert.equal(results, true); + const value = await redis.get('test'); + assert.equal(value, "value"); + }); + }); + + describe('test batch not a promise', () => { + let multiClient = null; + beforeEach(async () => { + multiClient = redis.batch(); + multiClient.set('test', 'value'); + multiClient.set('foo', 'bar') + .set('hello', 'world') + .del('hello'); + }); + + afterEach(async () => { + await redis.del('test'); + }); + + it('should run multi into exec', async () => { + const results = await multiClient.exec(); + assert.equal(results, true); + const value = await redis.get('test'); + assert.equal(value, "value"); }); it('should run multi into exec_atomic', async () => { - const results = await multiClient.batch(); - console.log(results); + const results = await multiClient.exec_atomic(); + assert.equal(results, true); + const value = await redis.get('test'); + assert.equal(value, "value"); }); }); diff --git a/yarn.lock b/yarn.lock index b20d9ee..2976e5a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,7 +2,14 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4": +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/code-frame@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== @@ -176,6 +183,21 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" +"@eslint/eslintrc@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.1.tgz#442763b88cecbe3ee0ec7ca6d6dd6168550cbf14" + integrity sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^12.1.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" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -197,27 +219,37 @@ resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== -"@types/node@*", "@types/node@^14.0.27": +"@types/node@*": version "14.0.27" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.27.tgz#a151873af5a5e851b51b3b065c9e63390a9e0eb1" integrity sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g== -"@types/redis@^2.8.25": - version "2.8.25" - resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.25.tgz#046bfff24b82effa59d74744c6fcf8995be17479" - integrity sha512-e5N5Dg712aZ1CPi1Li0XalukPSWd2RTLYzmrMsQ84NkYQ7cqKHC+HroXM1WP65O1zRGfzld72/u9ikumEe+ylA== +"@types/node@^15.6.1": + version "15.6.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.1.tgz#32d43390d5c62c5b6ec486a9bc9c59544de39a08" + integrity sha512-7EIraBEyRHEe7CH+Fm1XvgqU6uwZN8Q7jppJGcqjROMT29qhAuuOxYB1uEY5UMYQKEmA5D+5tBnhdaPXSsLONA== + +"@types/redis@^2.8.28": + version "2.8.28" + resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.28.tgz#5862b2b64aa7f7cbc76dafd7e6f06992b52c55e3" + integrity sha512-8l2gr2OQ969ypa7hFOeKqtFoY70XkHxISV0pAwmQ2nm6CSPb1brmTmqJCGGrekCo+pAZyWlNXr+Kvo6L/1wijA== dependencies: "@types/node" "*" -acorn-jsx@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" - integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== -acorn@^7.3.1: - version "7.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" - integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== +acorn-jsx@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== aggregate-error@^3.0.0: version "3.0.1" @@ -227,7 +259,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3: +ajv@^6.10.0, ajv@^6.12.3: version "6.12.3" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== @@ -237,6 +269,26 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + +ajv@^8.0.1: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.5.0.tgz#695528274bcb5afc865446aa275484049a18ae4b" + integrity sha512-Y2l399Tt1AguU3BPRP9Fn4eN+Or+StUGWCUpbnFyXSo8NZ9S4uj+AG2pjs5apK+ZMOwYOz1+a+VKvKH7CudXgQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ansi-colors@4.1.1, ansi-colors@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" @@ -246,11 +298,6 @@ ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - ansi-regex@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" @@ -262,13 +309,6 @@ ansi-styles@^3.2.0: dependencies: color-convert "^1.9.0" -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" @@ -302,15 +342,10 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -array.prototype.map@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.2.tgz#9a4159f416458a23e9483078de1106b2ef68f8ec" - integrity sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.4" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== asn1@~0.2.3: version "0.2.4" @@ -327,10 +362,10 @@ assertion-error@^1.1.0: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== asynckit@^0.4.0: version "0.4.0" @@ -399,6 +434,11 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -409,16 +449,16 @@ chai-as-promised@^7.1.1: dependencies: check-error "^1.0.2" -chai@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" - integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== +chai@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" + integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== dependencies: assertion-error "^1.1.0" check-error "^1.0.2" deep-eql "^3.0.1" get-func-name "^2.0.0" - pathval "^1.1.0" + pathval "^1.1.1" type-detect "^4.0.5" chalk@^2.0.0: @@ -429,15 +469,6 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.2.0" -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" @@ -450,10 +481,10 @@ check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" -chokidar@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" - integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== +chokidar@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -461,24 +492,15 @@ chokidar@3.3.1: is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.3.0" + readdirp "~3.5.0" optionalDependencies: - fsevents "~2.1.2" + fsevents "~2.3.1" clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -488,6 +510,15 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + color-convert@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" @@ -562,12 +593,12 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== +debug@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: - ms "^2.1.1" + ms "2.1.2" debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.1.1" @@ -581,6 +612,11 @@ decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + deep-eql@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" @@ -600,33 +636,19 @@ default-require-extensions@^3.0.0: dependencies: strip-bom "^4.0.0" -define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" - dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" - -define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" -denque@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/denque/-/denque-1.4.1.tgz#6744ff7641c148c3f8a69c307e51235c1f4a37cf" - integrity sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ== +denque@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.0.tgz#773de0686ff2d8ec2ff92914316a47b73b1c73de" + integrity sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ== -diff@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== doctrine@^3.0.0: version "3.0.0" @@ -635,10 +657,10 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dotenv@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" - integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +dotenv@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== ecc-jsbn@~0.1.1: version "0.1.2" @@ -647,11 +669,6 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -664,65 +681,31 @@ enquirer@^2.3.5: dependencies: ansi-colors "^4.1.1" -es-abstract@^1.17.0-next.1, es-abstract@^1.17.4, es-abstract@^1.17.5: - version "1.17.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" - integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.0" - is-regex "^1.1.0" - object-inspect "^1.7.0" - object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - -es-array-method-boxes-properly@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" - integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== - -es-get-iterator@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.0.tgz#bb98ad9d6d63b31aacdc8f89d5d0ee57bcb5b4c8" - integrity sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ== - dependencies: - es-abstract "^1.17.4" - has-symbols "^1.0.1" - is-arguments "^1.0.4" - is-map "^2.0.1" - is-set "^2.0.1" - is-string "^1.0.5" - isarray "^2.0.5" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - es6-error@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" -eslint-scope@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" - integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - esrecurse "^4.1.0" + esrecurse "^4.3.0" estraverse "^4.1.1" eslint-utils@^2.1.0: @@ -737,28 +720,36 @@ eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint@^7.6.0: - version "7.6.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.6.0.tgz#522d67cfaea09724d96949c70e7a0550614d64d6" - integrity sha512-QlAManNtqr7sozWm5TF4wIH9gmUm2hE3vNRUvyoYAa4y1l5/jxD/PQStEjBMQtCqZmSep8UxrcecI60hOpe61w== +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint@^7.27.0: + version "7.27.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.27.0.tgz#665a1506d8f95655c9274d84bd78f7166b07e9c7" + integrity sha512-JZuR6La2ZF0UD384lcbnd0Cgg6QJjiCwhMD6eU4h/VGPcVGwawNNzKU41tgokGXnfjOOyI6QIffthhJTPzzuRA== dependencies: - "@babel/code-frame" "^7.0.0" + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.1" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" enquirer "^2.3.5" - eslint-scope "^5.1.0" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" eslint-utils "^2.1.0" - eslint-visitor-keys "^1.3.0" - espree "^7.2.0" - esquery "^1.2.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" esutils "^2.0.2" - file-entry-cache "^5.0.1" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" glob-parent "^5.0.0" - globals "^12.1.0" + globals "^13.6.0" ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" @@ -766,7 +757,7 @@ eslint@^7.6.0: js-yaml "^3.13.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" - lodash "^4.17.19" + lodash.merge "^4.6.2" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -775,38 +766,38 @@ eslint@^7.6.0: semver "^7.2.1" strip-ansi "^6.0.0" strip-json-comments "^3.1.0" - table "^5.2.3" + table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.2.0.tgz#1c263d5b513dbad0ac30c4991b93ac354e948d69" - integrity sha512-H+cQ3+3JYRMEIOl87e7QdHX70ocly5iW4+dttuR8iYSPr/hXKFb+7dBsZ7+u1adC4VrnPlTkv0+OwuPnDop19g== +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: - acorn "^7.3.1" - acorn-jsx "^5.2.0" + acorn "^7.4.0" + acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" -esquery@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" - object-assign "^4.0.1" + estraverse "^5.2.0" -estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -815,6 +806,11 @@ estraverse@^5.1.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== +estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -832,7 +828,7 @@ extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -846,12 +842,12 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: - flat-cache "^2.0.1" + flat-cache "^3.0.4" fill-range@^7.0.1: version "7.0.1" @@ -869,7 +865,15 @@ find-cache-dir@^3.2.0: make-dir "^3.0.2" pkg-dir "^4.1.0" -find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -877,37 +881,23 @@ find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - -flat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" - integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: - is-buffer "~2.0.3" + flatted "^3.1.0" + rimraf "^3.0.2" -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" +flatted@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== foreground-child@^2.0.0: version "2.0.0" @@ -939,14 +929,10 @@ fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" -fsevents@~2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" +fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== functional-red-black-tree@^1.0.1: version "1.0.1" @@ -957,7 +943,7 @@ gensync@^1.0.0-beta.1: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -1009,6 +995,13 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" +globals@^13.6.0: + version "13.8.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.8.0.tgz#3e20f504810ce87a8d72e55aecf8435b50f4c1b3" + integrity sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q== + dependencies: + type-fest "^0.20.2" + graceful-fs@^4.1.15: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" @@ -1040,18 +1033,6 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - hasha@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.0.tgz#33094d1f69c40a4a6ac7be53d5fe3ff95a269e0c" @@ -1091,6 +1072,14 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -1111,11 +1100,6 @@ inherits@2: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" -is-arguments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" - integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -1123,20 +1107,6 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-buffer@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== - -is-callable@^1.1.4, is-callable@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" - integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== - -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -1158,50 +1128,21 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-map@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" - integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" - integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== - dependencies: - has-symbols "^1.0.1" - -is-set@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43" - integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA== +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== -is-string@^1.0.4, is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== - -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" - is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -1211,11 +1152,6 @@ is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -1285,30 +1221,17 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterate-iterator@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.1.tgz#1693a768c1ddd79c969051459453f082fe82e9f6" - integrity sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw== - -iterate-value@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/iterate-value/-/iterate-value-1.0.2.tgz#935115bd37d006a52046535ebc8d07e9c9337f57" - integrity sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ== - dependencies: - es-get-iterator "^1.0.2" - iterate-iterator "^1.0.1" - js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" +js-yaml@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" + integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== dependencies: - argparse "^1.0.7" - esprima "^4.0.0" + argparse "^2.0.1" js-yaml@^3.13.1: version "3.14.0" @@ -1332,6 +1255,11 @@ json-schema-traverse@^0.4.1: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" @@ -1373,14 +1301,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -1388,12 +1308,34 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" integrity sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI= -lodash@^4.17.14, lodash@^4.17.19: +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + +lodash@^4.17.19: version "4.17.19" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== @@ -1403,12 +1345,12 @@ log-driver@^1.2.7: resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== -log-symbols@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== dependencies: - chalk "^2.4.2" + chalk "^4.0.0" make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" @@ -1445,57 +1387,57 @@ minimatch@3.0.4, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -mocha@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.1.0.tgz#e651d05dcc5e42389f3412c2173ca13352a8bacd" - integrity sha512-sI0gaI1I/jPVu3KFpnveWGadfe3JNBAENqgTUPgLZAUppu725zS2mrVztzAgIR8DUscuS4doEBTx9LATC+HSeA== +mocha@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" + integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== dependencies: + "@ungap/promise-all-settled" "1.1.2" ansi-colors "4.1.1" browser-stdout "1.3.1" - chokidar "3.3.1" - debug "3.2.6" - diff "4.0.2" - escape-string-regexp "1.0.5" - find-up "4.1.0" + chokidar "3.5.1" + debug "4.3.1" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" glob "7.1.6" growl "1.10.5" he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" + js-yaml "4.0.0" + log-symbols "4.0.0" minimatch "3.0.4" - ms "2.1.2" - object.assign "4.1.0" - promise.allsettled "1.0.2" - serialize-javascript "4.0.0" - strip-json-comments "3.0.1" - supports-color "7.1.0" + ms "2.1.3" + nanoid "3.1.20" + serialize-javascript "5.0.1" + strip-json-comments "3.1.1" + supports-color "8.1.1" which "2.0.2" wide-align "1.1.3" - workerpool "6.0.0" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.1" + workerpool "6.1.0" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" ms@2.1.2, ms@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@3.1.20: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -1550,34 +1492,6 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - -object-inspect@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" - integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-keys@^1.0.8: - version "1.0.11" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" - -object.assign@4.1.0, object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -1596,19 +1510,19 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -p-limit@^2.0.0, p-limit@^2.2.0: +p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: - p-limit "^2.0.0" + yocto-queue "^0.1.0" p-locate@^4.1.0: version "4.1.0" @@ -1617,6 +1531,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-map@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" @@ -1646,10 +1567,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -1669,20 +1586,25 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== -pathval@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" -picomatch@^2.0.4, picomatch@^2.0.7: +picomatch@^2.0.4: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picomatch@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + pkg-dir@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -1706,17 +1628,6 @@ progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" -promise.allsettled@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.2.tgz#d66f78fbb600e83e863d893e98b3d4376a9c47c9" - integrity sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg== - dependencies: - array.prototype.map "^1.0.1" - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - iterate-value "^1.0.0" - psl@^1.1.28: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" @@ -1739,17 +1650,17 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -readdirp@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" - integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== dependencies: - picomatch "^2.0.7" + picomatch "^2.2.1" -redis-commands@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.5.0.tgz#80d2e20698fe688f227127ff9e5164a7dd17e785" - integrity sha512-6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg== +redis-commands@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.7.0.tgz#15a6fea2d58281e27b1cd1acfb4b293e278c3a89" + integrity sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ== redis-errors@^1.0.0, redis-errors@^1.2.0: version "1.2.0" @@ -1763,13 +1674,13 @@ redis-parser@^3.0.0: dependencies: redis-errors "^1.0.0" -redis@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/redis/-/redis-3.0.2.tgz#bd47067b8a4a3e6a2e556e57f71cc82c7360150a" - integrity sha512-PNhLCrjU6vKVuMOyFu7oSP296mwBkcE6lrAjruBYG5LgdSqtRBoVQIylrMyVZD/lkF24RSNNatzvYag6HRBHjQ== +redis@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/redis/-/redis-3.1.2.tgz#766851117e80653d23e0ed536254677ab647638c" + integrity sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw== dependencies: - denque "^1.4.1" - redis-commands "^1.5.0" + denque "^1.5.0" + redis-commands "^1.7.0" redis-errors "^1.2.0" redis-parser "^3.0.0" @@ -1815,6 +1726,11 @@ require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" @@ -1837,14 +1753,7 @@ resolve@^1.3.2: dependencies: path-parse "^1.0.6" -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.0: +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -1879,10 +1788,10 @@ semver@^7.2.1: resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== -serialize-javascript@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" - integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== +serialize-javascript@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== dependencies: randombytes "^2.1.0" @@ -1906,14 +1815,14 @@ signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" source-map@^0.5.0: version "0.5.7" @@ -1962,15 +1871,6 @@ sshpk@^1.7.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - string-width@^4.1.0, string-width@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" @@ -1980,35 +1880,12 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - strip-ansi@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" @@ -2021,20 +1898,15 @@ strip-bom@^4.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== -strip-json-comments@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" - integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== - -strip-json-comments@^3.1.0: +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@7.1.0, supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" @@ -2044,22 +1916,24 @@ supports-color@^5.2.0: dependencies: has-flag "^3.0.0" -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== +supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== dependencies: - has-flag "^3.0.0" + has-flag "^4.0.0" -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== +table@^6.0.9: + version "6.7.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" + integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" test-exclude@^6.0.0: version "6.0.0" @@ -2117,6 +1991,11 @@ type-detect@^4.0.0, type-detect@^4.0.5: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + type-fest@^0.8.0, type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" @@ -2177,19 +2056,10 @@ word-wrap@^1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -workerpool@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.0.0.tgz#85aad67fa1a2c8ef9386a1b43539900f61d03d58" - integrity sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA== - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" +workerpool@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" + integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== wrap-ansi@^6.2.0: version "6.2.0" @@ -2200,6 +2070,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -2214,33 +2093,20 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== -yargs-parser@13.1.2, yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yargs-parser@^15.0.1: - version "15.0.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3" - integrity sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== yargs-parser@^18.1.2: version "18.1.3" @@ -2250,49 +2116,33 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-unparser@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.1.tgz#bd4b0ee05b4c94d058929c32cb09e3fce71d3c5f" - integrity sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA== - dependencies: - camelcase "^5.3.1" - decamelize "^1.2.0" - flat "^4.1.0" - is-plain-obj "^1.1.0" - yargs "^14.2.3" - -yargs@13.3.2: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.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 "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" +yargs-parser@^20.2.2: + version "20.2.7" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" + integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== -yargs@^14.2.3: - version "14.2.3" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" - integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== - dependencies: - cliui "^5.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^15.0.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" yargs@^15.0.2: version "15.4.1" @@ -2310,3 +2160,8 @@ yargs@^15.0.2: which-module "^2.0.0" y18n "^4.0.0" yargs-parser "^18.1.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==