From 65568ddb7180b05d045b36825a50187e285619da Mon Sep 17 00:00:00 2001 From: Ishmael Samuel Date: Wed, 1 Jul 2020 22:13:49 -0700 Subject: [PATCH 01/19] added cluster support --- dist/cluster-core.module.d.ts | 11 +++ dist/cluster-core.module.js | 72 +++++++++++++++++ dist/cluster.constants.d.ts | 2 + dist/cluster.constants.js | 5 ++ dist/cluster.interface.d.ts | 11 +++ dist/cluster.interface.js | 2 + dist/cluster.module.d.ts | 6 ++ dist/cluster.module.js | 30 +++++++ dist/cluster.provider.d.ts | 16 ++++ dist/cluster.provider.js | 72 +++++++++++++++++ dist/cluster.service.d.ts | 8 ++ dist/cluster.service.js | 41 ++++++++++ dist/index.d.ts | 3 + dist/index.js | 21 +++-- dist/redis-core.module.js | 9 ++- dist/redis.constants.js | 1 + dist/redis.module.js | 3 +- ...ient.provider.d.ts => redis.provider.d.ts} | 2 +- ...s-client.provider.js => redis.provider.js} | 14 ++-- dist/redis.service.d.ts | 2 +- dist/redis.service.js | 5 +- lib/cluster-core.module.ts | 79 +++++++++++++++++++ lib/cluster.constants.ts | 2 + lib/cluster.interface.ts | 20 +++++ lib/cluster.module.ts | 26 ++++++ lib/cluster.provider.ts | 71 +++++++++++++++++ lib/cluster.service.ts | 26 ++++++ lib/index.ts | 3 + lib/redis-core.module.ts | 2 +- lib/redis.interface.ts | 3 +- ...s-client.provider.ts => redis.provider.ts} | 0 lib/redis.service.ts | 2 +- package.json | 10 +-- yarn.lock | 7 +- 34 files changed, 557 insertions(+), 30 deletions(-) create mode 100644 dist/cluster-core.module.d.ts create mode 100644 dist/cluster-core.module.js create mode 100644 dist/cluster.constants.d.ts create mode 100644 dist/cluster.constants.js create mode 100644 dist/cluster.interface.d.ts create mode 100644 dist/cluster.interface.js create mode 100644 dist/cluster.module.d.ts create mode 100644 dist/cluster.module.js create mode 100644 dist/cluster.provider.d.ts create mode 100644 dist/cluster.provider.js create mode 100644 dist/cluster.service.d.ts create mode 100644 dist/cluster.service.js rename dist/{redis-client.provider.d.ts => redis.provider.d.ts} (91%) rename dist/{redis-client.provider.js => redis.provider.js} (80%) create mode 100644 lib/cluster-core.module.ts create mode 100644 lib/cluster.constants.ts create mode 100644 lib/cluster.interface.ts create mode 100644 lib/cluster.module.ts create mode 100644 lib/cluster.provider.ts create mode 100644 lib/cluster.service.ts rename lib/{redis-client.provider.ts => redis.provider.ts} (100%) diff --git a/dist/cluster-core.module.d.ts b/dist/cluster-core.module.d.ts new file mode 100644 index 0000000..36847e4 --- /dev/null +++ b/dist/cluster-core.module.d.ts @@ -0,0 +1,11 @@ +import { DynamicModule, OnModuleDestroy } from '@nestjs/common'; +import { ModuleRef } from '@nestjs/core'; +import { ClusterModuleAsyncOptions, ClusterModuleOptions } from './cluster.interface'; +export declare class ClusterCoreModule implements OnModuleDestroy { + private readonly options; + private readonly moduleRef; + constructor(options: ClusterModuleOptions | ClusterModuleOptions[], moduleRef: ModuleRef); + static register(options: ClusterModuleOptions | ClusterModuleOptions[]): DynamicModule; + static forRootAsync(options: ClusterModuleAsyncOptions): DynamicModule; + onModuleDestroy(): void; +} diff --git a/dist/cluster-core.module.js b/dist/cluster-core.module.js new file mode 100644 index 0000000..f49b458 --- /dev/null +++ b/dist/cluster-core.module.js @@ -0,0 +1,72 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var ClusterCoreModule_1; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ClusterCoreModule = void 0; +const common_1 = require("@nestjs/common"); +const core_1 = require("@nestjs/core"); +const cluster_provider_1 = require("./cluster.provider"); +const cluster_constants_1 = require("./cluster.constants"); +const cluster_service_1 = require("./cluster.service"); +let ClusterCoreModule = ClusterCoreModule_1 = class ClusterCoreModule { + constructor(options, moduleRef) { + this.options = options; + this.moduleRef = moduleRef; + } + static register(options) { + return { + module: ClusterCoreModule_1, + providers: [ + cluster_provider_1.createCluster(), + { provide: cluster_constants_1.CLUSTER_MODULE_OPTIONS, useValue: options }, + ], + exports: [cluster_service_1.ClusterService], + }; + } + static forRootAsync(options) { + return { + module: ClusterCoreModule_1, + imports: options.imports, + providers: [cluster_provider_1.createCluster(), cluster_provider_1.createAsyncClusterOptions(options)], + exports: [cluster_service_1.ClusterService], + }; + } + onModuleDestroy() { + const closeConnection = ({ clusters, defaultKey, }) => options => { + const name = options.name || defaultKey; + const cluster = clusters.get(name); + if (cluster && !options.keepAlive) { + cluster.disconnect(); + } + }; + const provider = this.moduleRef.get(cluster_constants_1.REDIS_CLUSTER); + const closeClusterConnection = closeConnection(provider); + if (Array.isArray(this.options)) { + this.options.forEach(closeClusterConnection); + } + else { + closeClusterConnection(this.options); + } + } +}; +ClusterCoreModule = ClusterCoreModule_1 = __decorate([ + common_1.Global(), + common_1.Module({ + providers: [cluster_service_1.ClusterService], + exports: [cluster_service_1.ClusterService], + }), + __param(0, common_1.Inject(cluster_constants_1.CLUSTER_MODULE_OPTIONS)), + __metadata("design:paramtypes", [Object, core_1.ModuleRef]) +], ClusterCoreModule); +exports.ClusterCoreModule = ClusterCoreModule; diff --git a/dist/cluster.constants.d.ts b/dist/cluster.constants.d.ts new file mode 100644 index 0000000..343122f --- /dev/null +++ b/dist/cluster.constants.d.ts @@ -0,0 +1,2 @@ +export declare const CLUSTER_MODULE_OPTIONS: unique symbol; +export declare const REDIS_CLUSTER: unique symbol; diff --git a/dist/cluster.constants.js b/dist/cluster.constants.js new file mode 100644 index 0000000..24ffb9a --- /dev/null +++ b/dist/cluster.constants.js @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.REDIS_CLUSTER = exports.CLUSTER_MODULE_OPTIONS = void 0; +exports.CLUSTER_MODULE_OPTIONS = Symbol('CLUSTER_MODULE_OPTIONS'); +exports.REDIS_CLUSTER = Symbol('REDIS_CLUSTER'); diff --git a/dist/cluster.interface.d.ts b/dist/cluster.interface.d.ts new file mode 100644 index 0000000..e9288a9 --- /dev/null +++ b/dist/cluster.interface.d.ts @@ -0,0 +1,11 @@ +import { ModuleMetadata } from '@nestjs/common/interfaces'; +import { Cluster, ClusterOptions } from 'ioredis'; +export interface ClusterModuleOptions extends ClusterOptions { + name?: string; + nodes: (string | number | object)[]; + onClusterReady?(cluster: Cluster): Promise; +} +export interface ClusterModuleAsyncOptions extends Pick { + useFactory?: (...args: any[]) => ClusterModuleOptions | ClusterModuleOptions[] | Promise | Promise; + inject?: any[]; +} diff --git a/dist/cluster.interface.js b/dist/cluster.interface.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/dist/cluster.interface.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/dist/cluster.module.d.ts b/dist/cluster.module.d.ts new file mode 100644 index 0000000..4e01a3d --- /dev/null +++ b/dist/cluster.module.d.ts @@ -0,0 +1,6 @@ +import { DynamicModule } from '@nestjs/common'; +import { ClusterModuleAsyncOptions, ClusterModuleOptions } from './cluster.interface'; +export declare class ClusterModule { + static register(options: ClusterModuleOptions | ClusterModuleOptions[]): DynamicModule; + static forRootAsync(options: ClusterModuleAsyncOptions): DynamicModule; +} diff --git a/dist/cluster.module.js b/dist/cluster.module.js new file mode 100644 index 0000000..fb6d3bf --- /dev/null +++ b/dist/cluster.module.js @@ -0,0 +1,30 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var ClusterModule_1; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ClusterModule = void 0; +const common_1 = require("@nestjs/common"); +const cluster_core_module_1 = require("./cluster-core.module"); +let ClusterModule = ClusterModule_1 = class ClusterModule { + static register(options) { + return { + module: ClusterModule_1, + imports: [cluster_core_module_1.ClusterCoreModule.register(options)], + }; + } + static forRootAsync(options) { + return { + module: ClusterModule_1, + imports: [cluster_core_module_1.ClusterCoreModule.forRootAsync(options)], + }; + } +}; +ClusterModule = ClusterModule_1 = __decorate([ + common_1.Module({}) +], ClusterModule); +exports.ClusterModule = ClusterModule; diff --git a/dist/cluster.provider.d.ts b/dist/cluster.provider.d.ts new file mode 100644 index 0000000..1414606 --- /dev/null +++ b/dist/cluster.provider.d.ts @@ -0,0 +1,16 @@ +import { Cluster } from 'ioredis'; +import { Provider } from '@nestjs/common'; +import { ClusterModuleAsyncOptions, ClusterModuleOptions } from './cluster.interface'; +export declare class RedisClusterError extends Error { +} +export interface ClusterProvider { + defaultKey: string; + clusters: Map; + size: number; +} +export declare const createCluster: () => Provider; +export declare const createAsyncClusterOptions: (options: ClusterModuleAsyncOptions) => { + provide: symbol; + useFactory: (...args: any[]) => ClusterModuleOptions | Promise | ClusterModuleOptions[] | Promise; + inject: any[]; +}; diff --git a/dist/cluster.provider.js b/dist/cluster.provider.js new file mode 100644 index 0000000..93eee98 --- /dev/null +++ b/dist/cluster.provider.js @@ -0,0 +1,72 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __rest = (this && this.__rest) || function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createAsyncClusterOptions = exports.createCluster = exports.RedisClusterError = void 0; +const ioredis_1 = require("ioredis"); +const uuid = require("uuid"); +const cluster_constants_1 = require("./cluster.constants"); +class RedisClusterError extends Error { +} +exports.RedisClusterError = RedisClusterError; +function getCluster(options) { + return __awaiter(this, void 0, void 0, function* () { + const { onClusterReady, nodes } = options, opt = __rest(options, ["onClusterReady", "nodes"]); + const cluster = new ioredis_1.Cluster(nodes, opt); + if (onClusterReady) { + onClusterReady(cluster); + } + return cluster; + }); +} +exports.createCluster = () => ({ + provide: cluster_constants_1.REDIS_CLUSTER, + useFactory: (options) => __awaiter(void 0, void 0, void 0, function* () { + const clusters = new Map(); + let defaultKey = uuid(); + if (Array.isArray(options)) { + yield Promise.all(options.map((o) => __awaiter(void 0, void 0, void 0, function* () { + const key = o.name || defaultKey; + if (clusters.has(key)) { + throw new RedisClusterError(`${o.name || 'default'} cluster already exists`); + } + clusters.set(key, yield getCluster(o)); + }))); + } + else { + if (options.name && options.name.length !== 0) { + defaultKey = options.name; + } + clusters.set(defaultKey, yield getCluster(options)); + } + return { + defaultKey, + clusters, + size: clusters.size, + }; + }), + inject: [cluster_constants_1.CLUSTER_MODULE_OPTIONS], +}); +exports.createAsyncClusterOptions = (options) => ({ + provide: cluster_constants_1.CLUSTER_MODULE_OPTIONS, + useFactory: options.useFactory, + inject: options.inject, +}); diff --git a/dist/cluster.service.d.ts b/dist/cluster.service.d.ts new file mode 100644 index 0000000..c03ef44 --- /dev/null +++ b/dist/cluster.service.d.ts @@ -0,0 +1,8 @@ +import { Cluster } from 'ioredis'; +import { ClusterProvider } from './cluster.provider'; +export declare class ClusterService { + private readonly provider; + constructor(provider: ClusterProvider); + getCluster(name?: string): Cluster; + getClusters(): Map; +} diff --git a/dist/cluster.service.js b/dist/cluster.service.js new file mode 100644 index 0000000..846819d --- /dev/null +++ b/dist/cluster.service.js @@ -0,0 +1,41 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ClusterService = void 0; +const common_1 = require("@nestjs/common"); +const cluster_constants_1 = require("./cluster.constants"); +const cluster_provider_1 = require("./cluster.provider"); +let ClusterService = class ClusterService { + constructor(provider) { + this.provider = provider; + } + getCluster(name) { + if (!name) { + name = this.provider.defaultKey; + } + if (!this.provider.clusters.has(name)) { + throw new cluster_provider_1.RedisClusterError(`cluster ${name} does not exist`); + } + return this.provider.clusters.get(name); + } + getClusters() { + return this.provider.clusters; + } +}; +ClusterService = __decorate([ + common_1.Injectable(), + __param(0, common_1.Inject(cluster_constants_1.REDIS_CLUSTER)), + __metadata("design:paramtypes", [Object]) +], ClusterService); +exports.ClusterService = ClusterService; diff --git a/dist/index.d.ts b/dist/index.d.ts index 3aae4f1..28589be 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,3 +1,6 @@ export * from './redis.service'; export * from './redis.module'; export * from './redis.interface'; +export * from './cluster.service'; +export * from './cluster.module'; +export * from './redis.interface'; diff --git a/dist/index.js b/dist/index.js index 7759545..a70a632 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,7 +1,18 @@ "use strict"; -function __export(m) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; -} +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p); +}; Object.defineProperty(exports, "__esModule", { value: true }); -__export(require("./redis.service")); -__export(require("./redis.module")); +__exportStar(require("./redis.service"), exports); +__exportStar(require("./redis.module"), exports); +__exportStar(require("./redis.interface"), exports); +__exportStar(require("./cluster.service"), exports); +__exportStar(require("./cluster.module"), exports); +__exportStar(require("./redis.interface"), exports); diff --git a/dist/redis-core.module.js b/dist/redis-core.module.js index dc05008..714e4b6 100644 --- a/dist/redis-core.module.js +++ b/dist/redis-core.module.js @@ -11,11 +11,12 @@ var __metadata = (this && this.__metadata) || function (k, v) { var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; -Object.defineProperty(exports, "__esModule", { value: true }); var RedisCoreModule_1; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RedisCoreModule = void 0; const common_1 = require("@nestjs/common"); const core_1 = require("@nestjs/core"); -const redis_client_provider_1 = require("./redis-client.provider"); +const redis_provider_1 = require("./redis.provider"); const redis_constants_1 = require("./redis.constants"); const redis_service_1 = require("./redis.service"); let RedisCoreModule = RedisCoreModule_1 = class RedisCoreModule { @@ -27,7 +28,7 @@ let RedisCoreModule = RedisCoreModule_1 = class RedisCoreModule { return { module: RedisCoreModule_1, providers: [ - redis_client_provider_1.createClient(), + redis_provider_1.createClient(), { provide: redis_constants_1.REDIS_MODULE_OPTIONS, useValue: options }, ], exports: [redis_service_1.RedisService], @@ -37,7 +38,7 @@ let RedisCoreModule = RedisCoreModule_1 = class RedisCoreModule { return { module: RedisCoreModule_1, imports: options.imports, - providers: [redis_client_provider_1.createClient(), redis_client_provider_1.createAsyncClientOptions(options)], + providers: [redis_provider_1.createClient(), redis_provider_1.createAsyncClientOptions(options)], exports: [redis_service_1.RedisService], }; } diff --git a/dist/redis.constants.js b/dist/redis.constants.js index bc59a1e..cbc6ad9 100644 --- a/dist/redis.constants.js +++ b/dist/redis.constants.js @@ -1,4 +1,5 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +exports.REDIS_CLIENT = exports.REDIS_MODULE_OPTIONS = void 0; exports.REDIS_MODULE_OPTIONS = Symbol('REDIS_MODULE_OPTIONS'); exports.REDIS_CLIENT = Symbol('REDIS_CLIENT'); diff --git a/dist/redis.module.js b/dist/redis.module.js index 82ae8ca..8f2e37d 100644 --- a/dist/redis.module.js +++ b/dist/redis.module.js @@ -5,8 +5,9 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key, else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; -Object.defineProperty(exports, "__esModule", { value: true }); var RedisModule_1; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RedisModule = void 0; const common_1 = require("@nestjs/common"); const redis_core_module_1 = require("./redis-core.module"); let RedisModule = RedisModule_1 = class RedisModule { diff --git a/dist/redis-client.provider.d.ts b/dist/redis.provider.d.ts similarity index 91% rename from dist/redis-client.provider.d.ts rename to dist/redis.provider.d.ts index 635d13b..731646b 100644 --- a/dist/redis-client.provider.d.ts +++ b/dist/redis.provider.d.ts @@ -8,7 +8,7 @@ export interface RedisClient { clients: Map; size: number; } -export declare const createClient: () => Provider; +export declare const createClient: () => Provider; export declare const createAsyncClientOptions: (options: RedisModuleAsyncOptions) => { provide: symbol; useFactory: (...args: any[]) => RedisModuleOptions | Promise | RedisModuleOptions[] | Promise; diff --git a/dist/redis-client.provider.js b/dist/redis.provider.js similarity index 80% rename from dist/redis-client.provider.js rename to dist/redis.provider.js index 448493f..4b94a5c 100644 --- a/dist/redis-client.provider.js +++ b/dist/redis.provider.js @@ -1,9 +1,10 @@ "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; @@ -12,11 +13,14 @@ var __rest = (this && this.__rest) || function (s, e) { for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) - t[p[i]] = s[p[i]]; + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } return t; }; Object.defineProperty(exports, "__esModule", { value: true }); +exports.createAsyncClientOptions = exports.createClient = exports.RedisClientError = void 0; const Redis = require("ioredis"); const uuid = require("uuid"); const redis_constants_1 = require("./redis.constants"); @@ -35,11 +39,11 @@ function getClient(options) { } exports.createClient = () => ({ provide: redis_constants_1.REDIS_CLIENT, - useFactory: (options) => __awaiter(this, void 0, void 0, function* () { + useFactory: (options) => __awaiter(void 0, void 0, void 0, function* () { const clients = new Map(); let defaultKey = uuid(); if (Array.isArray(options)) { - yield Promise.all(options.map((o) => __awaiter(this, void 0, void 0, function* () { + yield Promise.all(options.map((o) => __awaiter(void 0, void 0, void 0, function* () { const key = o.name || defaultKey; if (clients.has(key)) { throw new RedisClientError(`${o.name || 'default'} client is exists`); diff --git a/dist/redis.service.d.ts b/dist/redis.service.d.ts index 5deed75..0c986c8 100644 --- a/dist/redis.service.d.ts +++ b/dist/redis.service.d.ts @@ -1,5 +1,5 @@ import * as Redis from 'ioredis'; -import { RedisClient } from './redis-client.provider'; +import { RedisClient } from './redis.provider'; export declare class RedisService { private readonly redisClient; constructor(redisClient: RedisClient); diff --git a/dist/redis.service.js b/dist/redis.service.js index ef536c7..02b844c 100644 --- a/dist/redis.service.js +++ b/dist/redis.service.js @@ -12,9 +12,10 @@ var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; Object.defineProperty(exports, "__esModule", { value: true }); +exports.RedisService = void 0; const common_1 = require("@nestjs/common"); const redis_constants_1 = require("./redis.constants"); -const redis_client_provider_1 = require("./redis-client.provider"); +const redis_provider_1 = require("./redis.provider"); let RedisService = class RedisService { constructor(redisClient) { this.redisClient = redisClient; @@ -24,7 +25,7 @@ let RedisService = class RedisService { name = this.redisClient.defaultKey; } if (!this.redisClient.clients.has(name)) { - throw new redis_client_provider_1.RedisClientError(`client ${name} does not exist`); + throw new redis_provider_1.RedisClientError(`client ${name} does not exist`); } return this.redisClient.clients.get(name); } diff --git a/lib/cluster-core.module.ts b/lib/cluster-core.module.ts new file mode 100644 index 0000000..906b092 --- /dev/null +++ b/lib/cluster-core.module.ts @@ -0,0 +1,79 @@ +import { + DynamicModule, + Global, + Module, + Inject, + OnModuleDestroy, +} from '@nestjs/common'; +import { ModuleRef } from '@nestjs/core'; +import { Cluster } from 'ioredis'; +import { + ClusterModuleAsyncOptions, + ClusterModuleOptions, +} from './cluster.interface'; +import { + createAsyncClusterOptions, + createCluster, + ClusterProvider, +} from './cluster.provider'; + +import { CLUSTER_MODULE_OPTIONS, REDIS_CLUSTER } from './cluster.constants'; +import { ClusterService } from './cluster.service'; + +@Global() +@Module({ + providers: [ClusterService], + exports: [ClusterService], +}) +export class ClusterCoreModule implements OnModuleDestroy { + constructor( + @Inject(CLUSTER_MODULE_OPTIONS) + private readonly options: ClusterModuleOptions | ClusterModuleOptions[], + private readonly moduleRef: ModuleRef, + ) {} + + static register( + options: ClusterModuleOptions | ClusterModuleOptions[], + ): DynamicModule { + return { + module: ClusterCoreModule, + providers: [ + createCluster(), + { provide: CLUSTER_MODULE_OPTIONS, useValue: options }, + ], + exports: [ClusterService], + }; + } + + static forRootAsync(options: ClusterModuleAsyncOptions): DynamicModule { + return { + module: ClusterCoreModule, + imports: options.imports, + providers: [createCluster(), createAsyncClusterOptions(options)], + exports: [ClusterService], + }; + } + + onModuleDestroy() { + const closeConnection = ({ + clusters, + defaultKey, + }: ClusterProvider) => options => { + const name = options.name || defaultKey; + const cluster: Cluster = clusters.get(name); + + if (cluster && !options.keepAlive) { + cluster.disconnect(); + } + }; + + const provider = this.moduleRef.get(REDIS_CLUSTER); + const closeClusterConnection = closeConnection(provider); + + if (Array.isArray(this.options)) { + this.options.forEach(closeClusterConnection); + } else { + closeClusterConnection(this.options); + } + } +} diff --git a/lib/cluster.constants.ts b/lib/cluster.constants.ts new file mode 100644 index 0000000..5f46582 --- /dev/null +++ b/lib/cluster.constants.ts @@ -0,0 +1,2 @@ +export const CLUSTER_MODULE_OPTIONS = Symbol('CLUSTER_MODULE_OPTIONS'); +export const REDIS_CLUSTER = Symbol('REDIS_CLUSTER'); diff --git a/lib/cluster.interface.ts b/lib/cluster.interface.ts new file mode 100644 index 0000000..82cffb3 --- /dev/null +++ b/lib/cluster.interface.ts @@ -0,0 +1,20 @@ +import { ModuleMetadata } from '@nestjs/common/interfaces'; +import { Cluster, ClusterOptions } from 'ioredis'; + +export interface ClusterModuleOptions extends ClusterOptions { + name?: string; + nodes: (string | number | object)[]; + onClusterReady?(cluster: Cluster): Promise; +} + +export interface ClusterModuleAsyncOptions + extends Pick { + useFactory?: ( + ...args: any[] + ) => + | ClusterModuleOptions + | ClusterModuleOptions[] + | Promise + | Promise; + inject?: any[]; +} diff --git a/lib/cluster.module.ts b/lib/cluster.module.ts new file mode 100644 index 0000000..47263f9 --- /dev/null +++ b/lib/cluster.module.ts @@ -0,0 +1,26 @@ +import { DynamicModule, Module } from '@nestjs/common'; +import { + ClusterModuleAsyncOptions, + ClusterModuleOptions, +} from './cluster.interface'; + +import { ClusterCoreModule } from './cluster-core.module'; + +@Module({}) +export class ClusterModule { + static register( + options: ClusterModuleOptions | ClusterModuleOptions[], + ): DynamicModule { + return { + module: ClusterModule, + imports: [ClusterCoreModule.register(options)], + }; + } + + static forRootAsync(options: ClusterModuleAsyncOptions): DynamicModule { + return { + module: ClusterModule, + imports: [ClusterCoreModule.forRootAsync(options)], + }; + } +} diff --git a/lib/cluster.provider.ts b/lib/cluster.provider.ts new file mode 100644 index 0000000..499cbee --- /dev/null +++ b/lib/cluster.provider.ts @@ -0,0 +1,71 @@ +import { Cluster } from 'ioredis'; +import * as uuid from 'uuid'; +import { Provider } from '@nestjs/common'; + +import { REDIS_CLUSTER, CLUSTER_MODULE_OPTIONS } from './cluster.constants'; +import { + ClusterModuleAsyncOptions, + ClusterModuleOptions, +} from './cluster.interface'; + +export class RedisClusterError extends Error {} +export interface ClusterProvider { + defaultKey: string; + clusters: Map; + size: number; +} + +async function getCluster(options: ClusterModuleOptions): Promise { + const { onClusterReady, nodes, ...opt } = options; + const cluster: Cluster = (new Cluster(nodes, opt) as unknown) as Cluster; + + if (onClusterReady) { + onClusterReady(cluster); + } + + return cluster; +} + +export const createCluster = (): Provider => ({ + provide: REDIS_CLUSTER, + useFactory: async ( + options: ClusterModuleOptions | ClusterModuleOptions[], + ): Promise => { + const clusters: Map = new Map(); + let defaultKey = uuid(); + + if (Array.isArray(options)) { + await Promise.all( + options.map(async o => { + const key: string = o.name || defaultKey; + if (clusters.has(key)) { + throw new RedisClusterError( + `${o.name || 'default'} cluster already exists`, + ); + } + clusters.set(key, await getCluster(o)); + }), + ); + } else { + if (options.name && options.name.length !== 0) { + defaultKey = options.name; + } + clusters.set(defaultKey, await getCluster(options)); + } + + return { + defaultKey, + clusters, + size: clusters.size, + }; + }, + inject: [CLUSTER_MODULE_OPTIONS], +}); + +export const createAsyncClusterOptions = ( + options: ClusterModuleAsyncOptions, +) => ({ + provide: CLUSTER_MODULE_OPTIONS, + useFactory: options.useFactory, + inject: options.inject, +}); diff --git a/lib/cluster.service.ts b/lib/cluster.service.ts new file mode 100644 index 0000000..1c415a3 --- /dev/null +++ b/lib/cluster.service.ts @@ -0,0 +1,26 @@ +import { Injectable, Inject } from '@nestjs/common'; +import { REDIS_CLUSTER } from './cluster.constants'; +import { Cluster } from 'ioredis'; +import { ClusterProvider, RedisClusterError } from './cluster.provider'; + +@Injectable() +export class ClusterService { + constructor( + @Inject(REDIS_CLUSTER) private readonly provider: ClusterProvider, + ) {} + + getCluster(name?: string): Cluster { + if (!name) { + name = this.provider.defaultKey; + } + + if (!this.provider.clusters.has(name)) { + throw new RedisClusterError(`cluster ${name} does not exist`); + } + return this.provider.clusters.get(name); + } + + getClusters(): Map { + return this.provider.clusters; + } +} diff --git a/lib/index.ts b/lib/index.ts index 3aae4f1..28589be 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -1,3 +1,6 @@ export * from './redis.service'; export * from './redis.module'; export * from './redis.interface'; +export * from './cluster.service'; +export * from './cluster.module'; +export * from './redis.interface'; diff --git a/lib/redis-core.module.ts b/lib/redis-core.module.ts index baabc58..fd8ce1c 100644 --- a/lib/redis-core.module.ts +++ b/lib/redis-core.module.ts @@ -11,7 +11,7 @@ import { createAsyncClientOptions, createClient, RedisClient, -} from './redis-client.provider'; +} from './redis.provider'; import { REDIS_MODULE_OPTIONS, REDIS_CLIENT } from './redis.constants'; import { RedisService } from './redis.service'; diff --git a/lib/redis.interface.ts b/lib/redis.interface.ts index a6d4db0..e9f6e43 100644 --- a/lib/redis.interface.ts +++ b/lib/redis.interface.ts @@ -7,7 +7,8 @@ export interface RedisModuleOptions extends RedisOptions { onClientReady?(client: Redis): Promise; } -export interface RedisModuleAsyncOptions extends Pick { +export interface RedisModuleAsyncOptions + extends Pick { useFactory?: ( ...args: any[] ) => diff --git a/lib/redis-client.provider.ts b/lib/redis.provider.ts similarity index 100% rename from lib/redis-client.provider.ts rename to lib/redis.provider.ts diff --git a/lib/redis.service.ts b/lib/redis.service.ts index 4da6548..ade4b82 100644 --- a/lib/redis.service.ts +++ b/lib/redis.service.ts @@ -1,7 +1,7 @@ import { Injectable, Inject } from '@nestjs/common'; import { REDIS_CLIENT } from './redis.constants'; import * as Redis from 'ioredis'; -import { RedisClient, RedisClientError } from './redis-client.provider'; +import { RedisClient, RedisClientError } from './redis.provider'; @Injectable() export class RedisService { diff --git a/package.json b/package.json index 7171481..0484498 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { - "name": "nestjs-redis", + "name": "nestjs-redis-cluster", "version": "1.2.7", - "description": "a nestjs redis module", - "author": "zzy", + "description": "A nestjs redis module w/ cluster support", + "author": "Ishmael Samuel (useparagon.com)", "license": "MIT", "repository": { "type": "git", - "url": "https://github.com/kyknow/nestjs-redis" + "url": "https://github.com/useparagon.com/nestjs-redis-cluster" }, "scripts": { "build": "rimraf dist && tsc -p tsconfig.json", @@ -40,7 +40,7 @@ "tslint": "^5.20.1", "tslint-config-prettier": "^1.18.0", "tslint-plugin-prettier": "^2.0.1", - "typescript": "^2.4.2" + "typescript": "^3.6.4" }, "keywords": [ "nestjs", diff --git a/yarn.lock b/yarn.lock index a994f54..7a99950 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3405,9 +3405,10 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -typescript@^2.4.2: - version "2.9.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" +typescript@^3.6.4: + version "3.9.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a" + integrity sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw== uglify-js@^3.1.4: version "3.7.1" From 72c123ec1b0a92ed844f5d515d06424898e91497 Mon Sep 17 00:00:00 2001 From: Ishmael Samuel Date: Wed, 1 Jul 2020 22:31:04 -0700 Subject: [PATCH 02/19] updated documentation for ClusterService usage --- README.md | 541 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 400 insertions(+), 141 deletions(-) diff --git a/README.md b/README.md index 86a8ebd..8f9133e 100644 --- a/README.md +++ b/README.md @@ -1,209 +1,468 @@ - # Nestjs Redis -Redis component for NestJs. - +Redis component for NestJs with cluster support. ### Installation **Yarn** + ```bash -yarn add nestjs-redis +yarn add nestjs-redis-cluster ``` **NPM** + ```bash -npm install nestjs-redis --save +npm install nestjs-redis-cluster --save ``` ### Getting Started -Let's register the RedisModule in `app.module.ts` + +##### RedisModule + +Let's register the ClusterModule and RedisModule in `app.module.ts` ```typescript -import { Module } from '@nestjs/common' -import { RedisModule} from 'nestjs-redis' +import { Module } from '@nestjs/common'; +import { RedisModule } from 'nestjs-redis-cluster'; @Module({ - imports: [ - RedisModule.register(options) - ], + imports: [RedisModule.register(options)], }) export class AppModule {} ``` + With Async + ```typescript import { Module } from '@nestjs/common'; -import { RedisModule} from 'nestjs-redis' +import { RedisModule } from 'nestjs-redis-redis'; @Module({ - imports: [ - RedisModule.forRootAsync({ - useFactory: (configService: ConfigService) => configService.get('redis'), // or use async method - //useFactory: async (configService: ConfigService) => configService.get('redis'), - inject:[ConfigService] - }), - ], + imports: [ + RedisModule.forRootAsync({ + useFactory: (configService: ConfigService) => configService.get('redis'), + // or use async method + //useFactory: async (configService: ConfigService) => configService.get('redis'), + inject: [ConfigService], + }), + ], }) export class AppModule {} ``` -And the config file look like this -With single client + +Config looks like this for RedisModule with single client + ```typescript export default { + host: process.env.REDIS_HOST, + port: parseInt(process.env.REDIS_PORT), + db: parseInt(process.env.REDIS_DB), + password: process.env.REDIS_PASSWORD, + keyPrefix: process.env.REDIS_PRIFIX, +}; +Or; +export default { + url: 'redis://:authpassword@127.0.0.1:6380/4', +}; +``` + +With custom error handler + +```typescript +export default { + url: 'redis://:authpassword@127.0.0.1:6380/4', + onClientReady: client => { + client.on('error', err => {}); + }, +}; +``` + +With multi client + +```typescript +export default [ + { + name: 'test1', + url: 'redis://:authpassword@127.0.0.1:6380/4', + }, + { + name: 'test2', host: process.env.REDIS_HOST, port: parseInt(process.env.REDIS_PORT), db: parseInt(process.env.REDIS_DB), password: process.env.REDIS_PASSWORD, keyPrefix: process.env.REDIS_PRIFIX, + }, +]; +``` + +And use in your service + +```typescript +import { Injectable } from '@nestjs/common'; +import { RedisService } from 'nestjs-redis-cluster'; + +@Injectable() +export class TestService { + constructor(private readonly redisService: RedisService) {} + async root(): Promise { + const client = await this.redisService.getClient('test'); + return true; + } } -Or -export default { - url: 'redis://:authpassword@127.0.0.1:6380/4', +``` + +Options + +```typescript +interface RedisOptions { + /** + * client name. default is a uuid, unique. + */ + name?: string; + url?: string; + port?: number; + host?: string; + /** + * 4 (IPv4) or 6 (IPv6), Defaults to 4. + */ + family?: number; + /** + * Local domain socket path. If set the port, host and family will be ignored. + */ + path?: string; + /** + * TCP KeepAlive on the socket with a X ms delay before start. Set to a non-number value to disable keepAlive. + */ + keepAlive?: number; + connectionName?: string; + /** + * If set, client will send AUTH command with the value of this option when connected. + */ + password?: string; + /** + * Database index to use. + */ + db?: number; + /** + * When a connection is established to the Redis server, the server might still be loading + * the database from disk. While loading, the server not respond to any commands. + * To work around this, when this option is true, ioredis will check the status of the Redis server, + * and when the Redis server is able to process commands, a ready event will be emitted. + */ + enableReadyCheck?: boolean; + keyPrefix?: string; + /** + * When the return value isn't a number, ioredis will stop trying to reconnect. + * Fixed in: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/15858 + */ + retryStrategy?(times: number): number | false; + /** + * By default, all pending commands will be flushed with an error every + * 20 retry attempts. That makes sure commands won't wait forever when + * the connection is down. You can change this behavior by setting + * `maxRetriesPerRequest`. + * + * Set maxRetriesPerRequest to `null` to disable this behavior, and + * every command will wait forever until the connection is alive again + * (which is the default behavior before ioredis v4). + */ + maxRetriesPerRequest?: number | null; + /** + * 1/true means reconnect, 2 means reconnect and resend failed command. Returning false will ignore + * the error and do nothing. + */ + reconnectOnError?(error: Error): boolean | 1 | 2; + /** + * By default, if there is no active connection to the Redis server, commands are added to a queue + * and are executed once the connection is "ready" (when enableReadyCheck is true, "ready" means + * the Redis server has loaded the database from disk, otherwise means the connection to the Redis + * server has been established). If this option is false, when execute the command when the connection + * isn't ready, an error will be returned. + */ + enableOfflineQueue?: boolean; + /** + * The milliseconds before a timeout occurs during the initial connection to the Redis server. + * default: 10000. + */ + connectTimeout?: number; + /** + * After reconnected, if the previous connection was in the subscriber mode, client will auto re-subscribe these channels. + * default: true. + */ + autoResubscribe?: boolean; + /** + * If true, client will resend unfulfilled commands(e.g. block commands) in the previous connection when reconnected. + * default: true. + */ + autoResendUnfulfilledCommands?: boolean; + lazyConnect?: boolean; + tls?: tls.ConnectionOptions; + sentinels?: Array<{ host: string; port: number }>; + name?: string; + /** + * Enable READONLY mode for the connection. Only available for cluster mode. + * default: false. + */ + readOnly?: boolean; + /** + * If you are using the hiredis parser, it's highly recommended to enable this option. + * Create another instance with dropBufferSupport disabled for other commands that you want to return binary instead of string + */ + dropBufferSupport?: boolean; + /** + * Whether to show a friendly error stack. Will decrease the performance significantly. + */ + showFriendlyErrorStack?: boolean; } ``` + +##### ClusterModule + +Let's register the ClusterModule in `app.module.ts` + +```typescript +import { Module } from '@nestjs/common'; +import { ClusterModule } from 'nestjs-redis-cluster'; + +@Module({ + imports: [ClusterModule.register(options)], +}) +export class AppModule {} +``` + +With Async + +```typescript +import { Module } from '@nestjs/common'; +import { ClusterModule } from 'nestjs-redis-cluster'; + +@Module({ + imports: [ + ClusterModule.forRootAsync({ + useFactory: (configService: ConfigService) => + configService.get('cluster'), + // or use async method + //useFactory: async (configService: ConfigService) => configService.get('cluster'), + inject: [ConfigService], + }), + ], +}) +export class AppModule {} +``` + +Config looks like this for ClusterModule + +```typescript +export default { + nodes: [ + { + host: 6380, + port: '127.0.0.1', + }, + { + host: 6381, + port: '127.0.0.1', + }, + ], +}; +Or; +export default { + nodes: [ + { + url: 'redis://:authpassword@127.0.0.1:6380/4', + }, + { + url: 'redis://:authpassword@127.0.0.1:6381/4', + }, + ], +}; +``` + With custom error handler + ```typescript export default { - url: 'redis://:authpassword@127.0.0.1:6380/4', - onClientReady: (client) => { - client.on('error', (err) => {} - )}, -} + nodes: [ + { + url: 'redis://:authpassword@127.0.0.1:6380/4', + }, + ], + onClusterReady: client => { + client.on('error', err => {}); + }, +}; ``` -With multi client + +With multiple clusters + ```typescript export default [ - { - name:'test1', + { + name: 'test1', + nodes: [ + { url: 'redis://:authpassword@127.0.0.1:6380/4', - }, - { - name:'test2', + url: 'redis://:authpassword@127.0.0.1:6380/5', + }, + ], + }, + { + name: 'test2', + nodes: [ + { host: process.env.REDIS_HOST, port: parseInt(process.env.REDIS_PORT), db: parseInt(process.env.REDIS_DB), password: process.env.REDIS_PASSWORD, keyPrefix: process.env.REDIS_PRIFIX, - }, -] + }, + ], + }, +]; ``` + And use in your service + ```typescript import { Injectable } from '@nestjs/common'; -import { RedisService } from 'nestjs-redis'; +import { ClusterService } from 'nestjs-redis-cluster'; @Injectable() export class TestService { - constructor( - private readonly redisService: RedisService, - ) { } + constructor(private readonly redisService: RedisService) {} async root(): Promise { - const client = await this.redisService.getClient('test') - return true + const client = await this.redisService.getClient('test'); + return true; } } ``` + Options +Almost all the options are passed to ioredis/cluster (https://github.com/luin/ioredis/blob/master/lib/cluster/ClusterOptions.ts) + +The only additional options are `name`, `nodes`, and `onClusterReady`. + ```typescript -interface RedisOptions { - /** - * client name. default is a uuid, unique. - */ - name?: string; - url?: string; - port?: number; - host?: string; - /** - * 4 (IPv4) or 6 (IPv6), Defaults to 4. - */ - family?: number; - /** - * Local domain socket path. If set the port, host and family will be ignored. - */ - path?: string; - /** - * TCP KeepAlive on the socket with a X ms delay before start. Set to a non-number value to disable keepAlive. - */ - keepAlive?: number; - connectionName?: string; - /** - * If set, client will send AUTH command with the value of this option when connected. - */ - password?: string; - /** - * Database index to use. - */ - db?: number; - /** - * When a connection is established to the Redis server, the server might still be loading - * the database from disk. While loading, the server not respond to any commands. - * To work around this, when this option is true, ioredis will check the status of the Redis server, - * and when the Redis server is able to process commands, a ready event will be emitted. - */ - enableReadyCheck?: boolean; - keyPrefix?: string; - /** - * When the return value isn't a number, ioredis will stop trying to reconnect. - * Fixed in: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/15858 - */ - retryStrategy?(times: number): number | false; - /** - * By default, all pending commands will be flushed with an error every - * 20 retry attempts. That makes sure commands won't wait forever when - * the connection is down. You can change this behavior by setting - * `maxRetriesPerRequest`. - * - * Set maxRetriesPerRequest to `null` to disable this behavior, and - * every command will wait forever until the connection is alive again - * (which is the default behavior before ioredis v4). - */ - maxRetriesPerRequest?: number | null; - /** - * 1/true means reconnect, 2 means reconnect and resend failed command. Returning false will ignore - * the error and do nothing. - */ - reconnectOnError?(error: Error): boolean | 1 | 2; - /** - * By default, if there is no active connection to the Redis server, commands are added to a queue - * and are executed once the connection is "ready" (when enableReadyCheck is true, "ready" means - * the Redis server has loaded the database from disk, otherwise means the connection to the Redis - * server has been established). If this option is false, when execute the command when the connection - * isn't ready, an error will be returned. - */ - enableOfflineQueue?: boolean; - /** - * The milliseconds before a timeout occurs during the initial connection to the Redis server. - * default: 10000. - */ - connectTimeout?: number; - /** - * After reconnected, if the previous connection was in the subscriber mode, client will auto re-subscribe these channels. - * default: true. - */ - autoResubscribe?: boolean; - /** - * If true, client will resend unfulfilled commands(e.g. block commands) in the previous connection when reconnected. - * default: true. - */ - autoResendUnfulfilledCommands?: boolean; - lazyConnect?: boolean; - tls?: tls.ConnectionOptions; - sentinels?: Array<{ host: string; port: number; }>; - name?: string; - /** - * Enable READONLY mode for the connection. Only available for cluster mode. - * default: false. - */ - readOnly?: boolean; - /** - * If you are using the hiredis parser, it's highly recommended to enable this option. - * Create another instance with dropBufferSupport disabled for other commands that you want to return binary instead of string - */ - dropBufferSupport?: boolean; +interface ClusterOptions { + /** + * client name. default is a uuid, unique. + */ + name?: string; + nodes: (string | number | { url: string?, host?: string, port?: number )[]; + /** - * Whether to show a friendly error stack. Will decrease the performance significantly. - */ - showFriendlyErrorStack?: boolean; + * See "Quick Start" section. + * + * @default (times) => Math.min(100 + times * 2, 2000) + */ + clusterRetryStrategy?: ( + times: number, + reason?: Error + ) => number | void | null; + + /** + * See Redis class. + * + * @default true + */ + enableOfflineQueue?: boolean; + + /** + * When enabled, ioredis only emits "ready" event when `CLUSTER INFO` + * command reporting the cluster is ready for handling commands. + * + * @default true + */ + enableReadyCheck?: boolean; + + /** + * Scale reads to the node with the specified role. + * + * @default "master" + */ + scaleReads?: NodeRole | Function; + + /** + * When a MOVED or ASK error is received, client will redirect the + * command to another node. + * This option limits the max redirections allowed to send a command. + * + * @default 16 + */ + maxRedirections?: number; + + /** + * When an error is received when sending a command (e.g. + * "Connection is closed." when the target Redis node is down), client will retry + * if `retryDelayOnFailover` is valid delay time (in ms). + * + * @default 100 + */ + retryDelayOnFailover?: number; + + /** + * When a CLUSTERDOWN error is received, client will retry + * if `retryDelayOnClusterDown` is valid delay time (in ms). + * + * @default 100 + */ + retryDelayOnClusterDown?: number; + + /** + * When a TRYAGAIN error is received, client will retry + * if `retryDelayOnTryAgain` is valid delay time (in ms). + * + * @default 100 + */ + retryDelayOnTryAgain?: number; + + /** + * The milliseconds before a timeout occurs while refreshing + * slots from the cluster. + * + * @default 1000 + */ + slotsRefreshTimeout?: number; + + /** + * The milliseconds between every automatic slots refresh. + * + * @default 5000 + */ + slotsRefreshInterval?: number; + + /** + * Passed to the constructor of `Redis` + * + * @default null + */ + redisOptions?: any; + + /** + * By default, When a new Cluster instance is created, + * it will connect to the Redis cluster automatically. + * If you want to keep the instance disconnected until the first command is called, + * set this option to `true`. + * + * @default false + */ + lazyConnect?: boolean; + + /** + * Hostnames will be resolved to IP addresses via this function. + * This is needed when the addresses of startup nodes are hostnames instead + * of IPs. + * + * You may provide a custom `lookup` function when you want to customize + * the cache behavior of the default function. + * + * @default require('dns').lookup + */ + dnsLookup?: DNSLookupFunction; + natMap?: INatMap; } ``` + That's it! From b13aaa62676617d8501f91836082141e4d9a6d7c Mon Sep 17 00:00:00 2001 From: Ishmael Samuel Date: Wed, 1 Jul 2020 22:37:03 -0700 Subject: [PATCH 03/19] fixed cluster interface export --- lib/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/index.ts b/lib/index.ts index 28589be..8c026e3 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -3,4 +3,4 @@ export * from './redis.module'; export * from './redis.interface'; export * from './cluster.service'; export * from './cluster.module'; -export * from './redis.interface'; +export * from './cluster.interface'; From a5a85aa4ab9c70a728edcc8539abf0088b299156 Mon Sep 17 00:00:00 2001 From: Ishmael Samuel Date: Wed, 1 Jul 2020 22:41:24 -0700 Subject: [PATCH 04/19] version bump -> 1.2.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0484498..9382042 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nestjs-redis-cluster", - "version": "1.2.7", + "version": "1.2.8", "description": "A nestjs redis module w/ cluster support", "author": "Ishmael Samuel (useparagon.com)", "license": "MIT", From 735df4ce4e9b80b929230990765fe3269400f674 Mon Sep 17 00:00:00 2001 From: Ishmael Samuel Date: Wed, 1 Jul 2020 23:22:12 -0700 Subject: [PATCH 05/19] chagned "cluster" type back to "Redis" to prevent typescript errors --- dist/cluster.interface.d.ts | 4 ++-- dist/cluster.provider.d.ts | 4 ++-- dist/cluster.service.d.ts | 6 +++--- dist/index.d.ts | 2 +- dist/index.js | 2 +- lib/cluster-core.module.ts | 4 ++-- lib/cluster.interface.ts | 4 ++-- lib/cluster.provider.ts | 10 +++++----- lib/cluster.service.ts | 6 +++--- 9 files changed, 21 insertions(+), 21 deletions(-) diff --git a/dist/cluster.interface.d.ts b/dist/cluster.interface.d.ts index e9288a9..82dc695 100644 --- a/dist/cluster.interface.d.ts +++ b/dist/cluster.interface.d.ts @@ -1,9 +1,9 @@ import { ModuleMetadata } from '@nestjs/common/interfaces'; -import { Cluster, ClusterOptions } from 'ioredis'; +import { Redis, ClusterOptions } from 'ioredis'; export interface ClusterModuleOptions extends ClusterOptions { name?: string; nodes: (string | number | object)[]; - onClusterReady?(cluster: Cluster): Promise; + onClusterReady?(cluster: Redis): Promise; } export interface ClusterModuleAsyncOptions extends Pick { useFactory?: (...args: any[]) => ClusterModuleOptions | ClusterModuleOptions[] | Promise | Promise; diff --git a/dist/cluster.provider.d.ts b/dist/cluster.provider.d.ts index 1414606..28e12c5 100644 --- a/dist/cluster.provider.d.ts +++ b/dist/cluster.provider.d.ts @@ -1,11 +1,11 @@ -import { Cluster } from 'ioredis'; +import { Redis } from 'ioredis'; import { Provider } from '@nestjs/common'; import { ClusterModuleAsyncOptions, ClusterModuleOptions } from './cluster.interface'; export declare class RedisClusterError extends Error { } export interface ClusterProvider { defaultKey: string; - clusters: Map; + clusters: Map; size: number; } export declare const createCluster: () => Provider; diff --git a/dist/cluster.service.d.ts b/dist/cluster.service.d.ts index c03ef44..6aff2fb 100644 --- a/dist/cluster.service.d.ts +++ b/dist/cluster.service.d.ts @@ -1,8 +1,8 @@ -import { Cluster } from 'ioredis'; +import { Redis } from 'ioredis'; import { ClusterProvider } from './cluster.provider'; export declare class ClusterService { private readonly provider; constructor(provider: ClusterProvider); - getCluster(name?: string): Cluster; - getClusters(): Map; + getCluster(name?: string): Redis; + getClusters(): Map; } diff --git a/dist/index.d.ts b/dist/index.d.ts index 28589be..8c026e3 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -3,4 +3,4 @@ export * from './redis.module'; export * from './redis.interface'; export * from './cluster.service'; export * from './cluster.module'; -export * from './redis.interface'; +export * from './cluster.interface'; diff --git a/dist/index.js b/dist/index.js index a70a632..99be788 100644 --- a/dist/index.js +++ b/dist/index.js @@ -15,4 +15,4 @@ __exportStar(require("./redis.module"), exports); __exportStar(require("./redis.interface"), exports); __exportStar(require("./cluster.service"), exports); __exportStar(require("./cluster.module"), exports); -__exportStar(require("./redis.interface"), exports); +__exportStar(require("./cluster.interface"), exports); diff --git a/lib/cluster-core.module.ts b/lib/cluster-core.module.ts index 906b092..2cedb61 100644 --- a/lib/cluster-core.module.ts +++ b/lib/cluster-core.module.ts @@ -6,7 +6,7 @@ import { OnModuleDestroy, } from '@nestjs/common'; import { ModuleRef } from '@nestjs/core'; -import { Cluster } from 'ioredis'; +import { Redis } from 'ioredis'; import { ClusterModuleAsyncOptions, ClusterModuleOptions, @@ -60,7 +60,7 @@ export class ClusterCoreModule implements OnModuleDestroy { defaultKey, }: ClusterProvider) => options => { const name = options.name || defaultKey; - const cluster: Cluster = clusters.get(name); + const cluster: Redis = clusters.get(name); if (cluster && !options.keepAlive) { cluster.disconnect(); diff --git a/lib/cluster.interface.ts b/lib/cluster.interface.ts index 82cffb3..6b0c13c 100644 --- a/lib/cluster.interface.ts +++ b/lib/cluster.interface.ts @@ -1,10 +1,10 @@ import { ModuleMetadata } from '@nestjs/common/interfaces'; -import { Cluster, ClusterOptions } from 'ioredis'; +import { Redis, ClusterOptions } from 'ioredis'; export interface ClusterModuleOptions extends ClusterOptions { name?: string; nodes: (string | number | object)[]; - onClusterReady?(cluster: Cluster): Promise; + onClusterReady?(cluster: Redis): Promise; } export interface ClusterModuleAsyncOptions diff --git a/lib/cluster.provider.ts b/lib/cluster.provider.ts index 499cbee..265e502 100644 --- a/lib/cluster.provider.ts +++ b/lib/cluster.provider.ts @@ -1,4 +1,4 @@ -import { Cluster } from 'ioredis'; +import { Cluster, Redis } from 'ioredis'; import * as uuid from 'uuid'; import { Provider } from '@nestjs/common'; @@ -11,13 +11,13 @@ import { export class RedisClusterError extends Error {} export interface ClusterProvider { defaultKey: string; - clusters: Map; + clusters: Map; size: number; } -async function getCluster(options: ClusterModuleOptions): Promise { +async function getCluster(options: ClusterModuleOptions): Promise { const { onClusterReady, nodes, ...opt } = options; - const cluster: Cluster = (new Cluster(nodes, opt) as unknown) as Cluster; + const cluster: Redis = new Cluster(nodes, opt); if (onClusterReady) { onClusterReady(cluster); @@ -31,7 +31,7 @@ export const createCluster = (): Provider => ({ useFactory: async ( options: ClusterModuleOptions | ClusterModuleOptions[], ): Promise => { - const clusters: Map = new Map(); + const clusters: Map = new Map(); let defaultKey = uuid(); if (Array.isArray(options)) { diff --git a/lib/cluster.service.ts b/lib/cluster.service.ts index 1c415a3..21bc2b4 100644 --- a/lib/cluster.service.ts +++ b/lib/cluster.service.ts @@ -1,6 +1,6 @@ import { Injectable, Inject } from '@nestjs/common'; import { REDIS_CLUSTER } from './cluster.constants'; -import { Cluster } from 'ioredis'; +import { Redis } from 'ioredis'; import { ClusterProvider, RedisClusterError } from './cluster.provider'; @Injectable() @@ -9,7 +9,7 @@ export class ClusterService { @Inject(REDIS_CLUSTER) private readonly provider: ClusterProvider, ) {} - getCluster(name?: string): Cluster { + getCluster(name?: string): Redis { if (!name) { name = this.provider.defaultKey; } @@ -20,7 +20,7 @@ export class ClusterService { return this.provider.clusters.get(name); } - getClusters(): Map { + getClusters(): Map { return this.provider.clusters; } } From 45a56c0abe79758d4a5e52bfe411f0878c31d9ad Mon Sep 17 00:00:00 2001 From: Ishmael Samuel Date: Wed, 1 Jul 2020 23:23:01 -0700 Subject: [PATCH 06/19] version bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9382042..171df62 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nestjs-redis-cluster", - "version": "1.2.8", + "version": "1.2.9", "description": "A nestjs redis module w/ cluster support", "author": "Ishmael Samuel (useparagon.com)", "license": "MIT", From 46aaa36373699b1e3f97519b40d884718ea641df Mon Sep 17 00:00:00 2001 From: Ishmael Samuel Date: Wed, 1 Jul 2020 23:55:57 -0700 Subject: [PATCH 07/19] prefixed cluster classes with "Redis" --- README.md | 22 ++++++++++----------- dist/cluster-core.module.d.ts | 8 ++++---- dist/cluster-core.module.js | 12 ++++++------ dist/cluster.constants.d.ts | 2 +- dist/cluster.constants.js | 4 ++-- dist/cluster.interface.d.ts | 6 +++--- dist/cluster.module.d.ts | 8 ++++---- dist/cluster.module.js | 16 +++++++-------- dist/cluster.provider.d.ts | 8 ++++---- dist/cluster.provider.js | 4 ++-- dist/cluster.service.d.ts | 6 +++--- dist/cluster.service.js | 10 +++++----- lib/cluster-core.module.ts | 37 ++++++++++++++++++++--------------- lib/cluster.constants.ts | 4 +++- lib/cluster.interface.ts | 12 ++++++------ lib/cluster.module.ts | 14 ++++++------- lib/cluster.provider.ts | 23 ++++++++++++---------- lib/cluster.service.ts | 6 +++--- package.json | 2 +- 19 files changed, 107 insertions(+), 97 deletions(-) diff --git a/README.md b/README.md index 8f9133e..6dcdb01 100644 --- a/README.md +++ b/README.md @@ -220,14 +220,14 @@ interface RedisOptions { ##### ClusterModule -Let's register the ClusterModule in `app.module.ts` +Let's register the RedisClusterModule in `app.module.ts` ```typescript import { Module } from '@nestjs/common'; -import { ClusterModule } from 'nestjs-redis-cluster'; +import { RedisClusterModule } from 'nestjs-redis-cluster'; @Module({ - imports: [ClusterModule.register(options)], + imports: [RedisClusterModule.register(options)], }) export class AppModule {} ``` @@ -240,7 +240,7 @@ import { ClusterModule } from 'nestjs-redis-cluster'; @Module({ imports: [ - ClusterModule.forRootAsync({ + RedisClusterModule.forRootAsync({ useFactory: (configService: ConfigService) => configService.get('cluster'), // or use async method @@ -252,7 +252,7 @@ import { ClusterModule } from 'nestjs-redis-cluster'; export class AppModule {} ``` -Config looks like this for ClusterModule +Config looks like this for RedisClusterModule ```typescript export default { @@ -289,8 +289,8 @@ export default { url: 'redis://:authpassword@127.0.0.1:6380/4', }, ], - onClusterReady: client => { - client.on('error', err => {}); + onClusterReady: cluster => { + cluster.on('error', err => {}); }, }; ``` @@ -327,13 +327,13 @@ And use in your service ```typescript import { Injectable } from '@nestjs/common'; -import { ClusterService } from 'nestjs-redis-cluster'; +import { RedisClusterService } from 'nestjs-redis-cluster'; @Injectable() export class TestService { - constructor(private readonly redisService: RedisService) {} + constructor(private readonly redisService: RedisClusterService) {} async root(): Promise { - const client = await this.redisService.getClient('test'); + const client = await this.redisService.getCluster('test'); return true; } } @@ -345,7 +345,7 @@ Almost all the options are passed to ioredis/cluster (https://github.com/luin/io The only additional options are `name`, `nodes`, and `onClusterReady`. ```typescript -interface ClusterOptions { +interface RedisClusterOptions { /** * client name. default is a uuid, unique. */ diff --git a/dist/cluster-core.module.d.ts b/dist/cluster-core.module.d.ts index 36847e4..dd32474 100644 --- a/dist/cluster-core.module.d.ts +++ b/dist/cluster-core.module.d.ts @@ -1,11 +1,11 @@ import { DynamicModule, OnModuleDestroy } from '@nestjs/common'; import { ModuleRef } from '@nestjs/core'; -import { ClusterModuleAsyncOptions, ClusterModuleOptions } from './cluster.interface'; +import { RedisClusterModuleAsyncOptions, RedisClusterModuleOptions } from './cluster.interface'; export declare class ClusterCoreModule implements OnModuleDestroy { private readonly options; private readonly moduleRef; - constructor(options: ClusterModuleOptions | ClusterModuleOptions[], moduleRef: ModuleRef); - static register(options: ClusterModuleOptions | ClusterModuleOptions[]): DynamicModule; - static forRootAsync(options: ClusterModuleAsyncOptions): DynamicModule; + constructor(options: RedisClusterModuleOptions | RedisClusterModuleOptions[], moduleRef: ModuleRef); + static register(options: RedisClusterModuleOptions | RedisClusterModuleOptions[]): DynamicModule; + static forRootAsync(options: RedisClusterModuleAsyncOptions): DynamicModule; onModuleDestroy(): void; } diff --git a/dist/cluster-core.module.js b/dist/cluster-core.module.js index f49b458..08dcb5c 100644 --- a/dist/cluster-core.module.js +++ b/dist/cluster-core.module.js @@ -29,9 +29,9 @@ let ClusterCoreModule = ClusterCoreModule_1 = class ClusterCoreModule { module: ClusterCoreModule_1, providers: [ cluster_provider_1.createCluster(), - { provide: cluster_constants_1.CLUSTER_MODULE_OPTIONS, useValue: options }, + { provide: cluster_constants_1.REDIS_CLUSTER_MODULE_OPTIONS, useValue: options }, ], - exports: [cluster_service_1.ClusterService], + exports: [cluster_service_1.RedisClusterService], }; } static forRootAsync(options) { @@ -39,7 +39,7 @@ let ClusterCoreModule = ClusterCoreModule_1 = class ClusterCoreModule { module: ClusterCoreModule_1, imports: options.imports, providers: [cluster_provider_1.createCluster(), cluster_provider_1.createAsyncClusterOptions(options)], - exports: [cluster_service_1.ClusterService], + exports: [cluster_service_1.RedisClusterService], }; } onModuleDestroy() { @@ -63,10 +63,10 @@ let ClusterCoreModule = ClusterCoreModule_1 = class ClusterCoreModule { ClusterCoreModule = ClusterCoreModule_1 = __decorate([ common_1.Global(), common_1.Module({ - providers: [cluster_service_1.ClusterService], - exports: [cluster_service_1.ClusterService], + providers: [cluster_service_1.RedisClusterService], + exports: [cluster_service_1.RedisClusterService], }), - __param(0, common_1.Inject(cluster_constants_1.CLUSTER_MODULE_OPTIONS)), + __param(0, common_1.Inject(cluster_constants_1.REDIS_CLUSTER_MODULE_OPTIONS)), __metadata("design:paramtypes", [Object, core_1.ModuleRef]) ], ClusterCoreModule); exports.ClusterCoreModule = ClusterCoreModule; diff --git a/dist/cluster.constants.d.ts b/dist/cluster.constants.d.ts index 343122f..258c021 100644 --- a/dist/cluster.constants.d.ts +++ b/dist/cluster.constants.d.ts @@ -1,2 +1,2 @@ -export declare const CLUSTER_MODULE_OPTIONS: unique symbol; +export declare const REDIS_CLUSTER_MODULE_OPTIONS: unique symbol; export declare const REDIS_CLUSTER: unique symbol; diff --git a/dist/cluster.constants.js b/dist/cluster.constants.js index 24ffb9a..4d1742f 100644 --- a/dist/cluster.constants.js +++ b/dist/cluster.constants.js @@ -1,5 +1,5 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.REDIS_CLUSTER = exports.CLUSTER_MODULE_OPTIONS = void 0; -exports.CLUSTER_MODULE_OPTIONS = Symbol('CLUSTER_MODULE_OPTIONS'); +exports.REDIS_CLUSTER = exports.REDIS_CLUSTER_MODULE_OPTIONS = void 0; +exports.REDIS_CLUSTER_MODULE_OPTIONS = Symbol('REDIS_CLUSTER_MODULE_OPTIONS'); exports.REDIS_CLUSTER = Symbol('REDIS_CLUSTER'); diff --git a/dist/cluster.interface.d.ts b/dist/cluster.interface.d.ts index 82dc695..bbc648f 100644 --- a/dist/cluster.interface.d.ts +++ b/dist/cluster.interface.d.ts @@ -1,11 +1,11 @@ import { ModuleMetadata } from '@nestjs/common/interfaces'; import { Redis, ClusterOptions } from 'ioredis'; -export interface ClusterModuleOptions extends ClusterOptions { +export interface RedisClusterModuleOptions extends ClusterOptions { name?: string; nodes: (string | number | object)[]; onClusterReady?(cluster: Redis): Promise; } -export interface ClusterModuleAsyncOptions extends Pick { - useFactory?: (...args: any[]) => ClusterModuleOptions | ClusterModuleOptions[] | Promise | Promise; +export interface RedisClusterModuleAsyncOptions extends Pick { + useFactory?: (...args: any[]) => RedisClusterModuleOptions | RedisClusterModuleOptions[] | Promise | Promise; inject?: any[]; } diff --git a/dist/cluster.module.d.ts b/dist/cluster.module.d.ts index 4e01a3d..dbeec69 100644 --- a/dist/cluster.module.d.ts +++ b/dist/cluster.module.d.ts @@ -1,6 +1,6 @@ import { DynamicModule } from '@nestjs/common'; -import { ClusterModuleAsyncOptions, ClusterModuleOptions } from './cluster.interface'; -export declare class ClusterModule { - static register(options: ClusterModuleOptions | ClusterModuleOptions[]): DynamicModule; - static forRootAsync(options: ClusterModuleAsyncOptions): DynamicModule; +import { RedisClusterModuleAsyncOptions, RedisClusterModuleOptions } from './cluster.interface'; +export declare class RedisClusterModule { + static register(options: RedisClusterModuleOptions | RedisClusterModuleOptions[]): DynamicModule; + static forRootAsync(options: RedisClusterModuleAsyncOptions): DynamicModule; } diff --git a/dist/cluster.module.js b/dist/cluster.module.js index fb6d3bf..2ac89ae 100644 --- a/dist/cluster.module.js +++ b/dist/cluster.module.js @@ -5,26 +5,26 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key, else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; -var ClusterModule_1; +var RedisClusterModule_1; Object.defineProperty(exports, "__esModule", { value: true }); -exports.ClusterModule = void 0; +exports.RedisClusterModule = void 0; const common_1 = require("@nestjs/common"); const cluster_core_module_1 = require("./cluster-core.module"); -let ClusterModule = ClusterModule_1 = class ClusterModule { +let RedisClusterModule = RedisClusterModule_1 = class RedisClusterModule { static register(options) { return { - module: ClusterModule_1, + module: RedisClusterModule_1, imports: [cluster_core_module_1.ClusterCoreModule.register(options)], }; } static forRootAsync(options) { return { - module: ClusterModule_1, + module: RedisClusterModule_1, imports: [cluster_core_module_1.ClusterCoreModule.forRootAsync(options)], }; } }; -ClusterModule = ClusterModule_1 = __decorate([ +RedisClusterModule = RedisClusterModule_1 = __decorate([ common_1.Module({}) -], ClusterModule); -exports.ClusterModule = ClusterModule; +], RedisClusterModule); +exports.RedisClusterModule = RedisClusterModule; diff --git a/dist/cluster.provider.d.ts b/dist/cluster.provider.d.ts index 28e12c5..46a31a7 100644 --- a/dist/cluster.provider.d.ts +++ b/dist/cluster.provider.d.ts @@ -1,16 +1,16 @@ import { Redis } from 'ioredis'; import { Provider } from '@nestjs/common'; -import { ClusterModuleAsyncOptions, ClusterModuleOptions } from './cluster.interface'; +import { RedisClusterModuleAsyncOptions, RedisClusterModuleOptions } from './cluster.interface'; export declare class RedisClusterError extends Error { } -export interface ClusterProvider { +export interface RedisClusterProvider { defaultKey: string; clusters: Map; size: number; } export declare const createCluster: () => Provider; -export declare const createAsyncClusterOptions: (options: ClusterModuleAsyncOptions) => { +export declare const createAsyncClusterOptions: (options: RedisClusterModuleAsyncOptions) => { provide: symbol; - useFactory: (...args: any[]) => ClusterModuleOptions | Promise | ClusterModuleOptions[] | Promise; + useFactory: (...args: any[]) => RedisClusterModuleOptions | Promise | RedisClusterModuleOptions[] | Promise; inject: any[]; }; diff --git a/dist/cluster.provider.js b/dist/cluster.provider.js index 93eee98..7b0c4b0 100644 --- a/dist/cluster.provider.js +++ b/dist/cluster.provider.js @@ -63,10 +63,10 @@ exports.createCluster = () => ({ size: clusters.size, }; }), - inject: [cluster_constants_1.CLUSTER_MODULE_OPTIONS], + inject: [cluster_constants_1.REDIS_CLUSTER_MODULE_OPTIONS], }); exports.createAsyncClusterOptions = (options) => ({ - provide: cluster_constants_1.CLUSTER_MODULE_OPTIONS, + provide: cluster_constants_1.REDIS_CLUSTER_MODULE_OPTIONS, useFactory: options.useFactory, inject: options.inject, }); diff --git a/dist/cluster.service.d.ts b/dist/cluster.service.d.ts index 6aff2fb..df634e4 100644 --- a/dist/cluster.service.d.ts +++ b/dist/cluster.service.d.ts @@ -1,8 +1,8 @@ import { Redis } from 'ioredis'; -import { ClusterProvider } from './cluster.provider'; -export declare class ClusterService { +import { RedisClusterProvider } from './cluster.provider'; +export declare class RedisClusterService { private readonly provider; - constructor(provider: ClusterProvider); + constructor(provider: RedisClusterProvider); getCluster(name?: string): Redis; getClusters(): Map; } diff --git a/dist/cluster.service.js b/dist/cluster.service.js index 846819d..91719df 100644 --- a/dist/cluster.service.js +++ b/dist/cluster.service.js @@ -12,11 +12,11 @@ var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.ClusterService = void 0; +exports.RedisClusterService = void 0; const common_1 = require("@nestjs/common"); const cluster_constants_1 = require("./cluster.constants"); const cluster_provider_1 = require("./cluster.provider"); -let ClusterService = class ClusterService { +let RedisClusterService = class RedisClusterService { constructor(provider) { this.provider = provider; } @@ -33,9 +33,9 @@ let ClusterService = class ClusterService { return this.provider.clusters; } }; -ClusterService = __decorate([ +RedisClusterService = __decorate([ common_1.Injectable(), __param(0, common_1.Inject(cluster_constants_1.REDIS_CLUSTER)), __metadata("design:paramtypes", [Object]) -], ClusterService); -exports.ClusterService = ClusterService; +], RedisClusterService); +exports.RedisClusterService = RedisClusterService; diff --git a/lib/cluster-core.module.ts b/lib/cluster-core.module.ts index 2cedb61..9b64a12 100644 --- a/lib/cluster-core.module.ts +++ b/lib/cluster-core.module.ts @@ -8,49 +8,54 @@ import { import { ModuleRef } from '@nestjs/core'; import { Redis } from 'ioredis'; import { - ClusterModuleAsyncOptions, - ClusterModuleOptions, + RedisClusterModuleAsyncOptions, + RedisClusterModuleOptions, } from './cluster.interface'; import { createAsyncClusterOptions, createCluster, - ClusterProvider, + RedisClusterProvider, } from './cluster.provider'; -import { CLUSTER_MODULE_OPTIONS, REDIS_CLUSTER } from './cluster.constants'; -import { ClusterService } from './cluster.service'; +import { + REDIS_CLUSTER_MODULE_OPTIONS, + REDIS_CLUSTER, +} from './cluster.constants'; +import { RedisClusterService } from './cluster.service'; @Global() @Module({ - providers: [ClusterService], - exports: [ClusterService], + providers: [RedisClusterService], + exports: [RedisClusterService], }) export class ClusterCoreModule implements OnModuleDestroy { constructor( - @Inject(CLUSTER_MODULE_OPTIONS) - private readonly options: ClusterModuleOptions | ClusterModuleOptions[], + @Inject(REDIS_CLUSTER_MODULE_OPTIONS) + private readonly options: + | RedisClusterModuleOptions + | RedisClusterModuleOptions[], private readonly moduleRef: ModuleRef, ) {} static register( - options: ClusterModuleOptions | ClusterModuleOptions[], + options: RedisClusterModuleOptions | RedisClusterModuleOptions[], ): DynamicModule { return { module: ClusterCoreModule, providers: [ createCluster(), - { provide: CLUSTER_MODULE_OPTIONS, useValue: options }, + { provide: REDIS_CLUSTER_MODULE_OPTIONS, useValue: options }, ], - exports: [ClusterService], + exports: [RedisClusterService], }; } - static forRootAsync(options: ClusterModuleAsyncOptions): DynamicModule { + static forRootAsync(options: RedisClusterModuleAsyncOptions): DynamicModule { return { module: ClusterCoreModule, imports: options.imports, providers: [createCluster(), createAsyncClusterOptions(options)], - exports: [ClusterService], + exports: [RedisClusterService], }; } @@ -58,7 +63,7 @@ export class ClusterCoreModule implements OnModuleDestroy { const closeConnection = ({ clusters, defaultKey, - }: ClusterProvider) => options => { + }: RedisClusterProvider) => options => { const name = options.name || defaultKey; const cluster: Redis = clusters.get(name); @@ -67,7 +72,7 @@ export class ClusterCoreModule implements OnModuleDestroy { } }; - const provider = this.moduleRef.get(REDIS_CLUSTER); + const provider = this.moduleRef.get(REDIS_CLUSTER); const closeClusterConnection = closeConnection(provider); if (Array.isArray(this.options)) { diff --git a/lib/cluster.constants.ts b/lib/cluster.constants.ts index 5f46582..2ef4d23 100644 --- a/lib/cluster.constants.ts +++ b/lib/cluster.constants.ts @@ -1,2 +1,4 @@ -export const CLUSTER_MODULE_OPTIONS = Symbol('CLUSTER_MODULE_OPTIONS'); +export const REDIS_CLUSTER_MODULE_OPTIONS = Symbol( + 'REDIS_CLUSTER_MODULE_OPTIONS', +); export const REDIS_CLUSTER = Symbol('REDIS_CLUSTER'); diff --git a/lib/cluster.interface.ts b/lib/cluster.interface.ts index 6b0c13c..405c665 100644 --- a/lib/cluster.interface.ts +++ b/lib/cluster.interface.ts @@ -1,20 +1,20 @@ import { ModuleMetadata } from '@nestjs/common/interfaces'; import { Redis, ClusterOptions } from 'ioredis'; -export interface ClusterModuleOptions extends ClusterOptions { +export interface RedisClusterModuleOptions extends ClusterOptions { name?: string; nodes: (string | number | object)[]; onClusterReady?(cluster: Redis): Promise; } -export interface ClusterModuleAsyncOptions +export interface RedisClusterModuleAsyncOptions extends Pick { useFactory?: ( ...args: any[] ) => - | ClusterModuleOptions - | ClusterModuleOptions[] - | Promise - | Promise; + | RedisClusterModuleOptions + | RedisClusterModuleOptions[] + | Promise + | Promise; inject?: any[]; } diff --git a/lib/cluster.module.ts b/lib/cluster.module.ts index 47263f9..ad88054 100644 --- a/lib/cluster.module.ts +++ b/lib/cluster.module.ts @@ -1,25 +1,25 @@ import { DynamicModule, Module } from '@nestjs/common'; import { - ClusterModuleAsyncOptions, - ClusterModuleOptions, + RedisClusterModuleAsyncOptions, + RedisClusterModuleOptions, } from './cluster.interface'; import { ClusterCoreModule } from './cluster-core.module'; @Module({}) -export class ClusterModule { +export class RedisClusterModule { static register( - options: ClusterModuleOptions | ClusterModuleOptions[], + options: RedisClusterModuleOptions | RedisClusterModuleOptions[], ): DynamicModule { return { - module: ClusterModule, + module: RedisClusterModule, imports: [ClusterCoreModule.register(options)], }; } - static forRootAsync(options: ClusterModuleAsyncOptions): DynamicModule { + static forRootAsync(options: RedisClusterModuleAsyncOptions): DynamicModule { return { - module: ClusterModule, + module: RedisClusterModule, imports: [ClusterCoreModule.forRootAsync(options)], }; } diff --git a/lib/cluster.provider.ts b/lib/cluster.provider.ts index 265e502..6941db0 100644 --- a/lib/cluster.provider.ts +++ b/lib/cluster.provider.ts @@ -2,20 +2,23 @@ import { Cluster, Redis } from 'ioredis'; import * as uuid from 'uuid'; import { Provider } from '@nestjs/common'; -import { REDIS_CLUSTER, CLUSTER_MODULE_OPTIONS } from './cluster.constants'; import { - ClusterModuleAsyncOptions, - ClusterModuleOptions, + REDIS_CLUSTER, + REDIS_CLUSTER_MODULE_OPTIONS, +} from './cluster.constants'; +import { + RedisClusterModuleAsyncOptions, + RedisClusterModuleOptions, } from './cluster.interface'; export class RedisClusterError extends Error {} -export interface ClusterProvider { +export interface RedisClusterProvider { defaultKey: string; clusters: Map; size: number; } -async function getCluster(options: ClusterModuleOptions): Promise { +async function getCluster(options: RedisClusterModuleOptions): Promise { const { onClusterReady, nodes, ...opt } = options; const cluster: Redis = new Cluster(nodes, opt); @@ -29,8 +32,8 @@ async function getCluster(options: ClusterModuleOptions): Promise { export const createCluster = (): Provider => ({ provide: REDIS_CLUSTER, useFactory: async ( - options: ClusterModuleOptions | ClusterModuleOptions[], - ): Promise => { + options: RedisClusterModuleOptions | RedisClusterModuleOptions[], + ): Promise => { const clusters: Map = new Map(); let defaultKey = uuid(); @@ -59,13 +62,13 @@ export const createCluster = (): Provider => ({ size: clusters.size, }; }, - inject: [CLUSTER_MODULE_OPTIONS], + inject: [REDIS_CLUSTER_MODULE_OPTIONS], }); export const createAsyncClusterOptions = ( - options: ClusterModuleAsyncOptions, + options: RedisClusterModuleAsyncOptions, ) => ({ - provide: CLUSTER_MODULE_OPTIONS, + provide: REDIS_CLUSTER_MODULE_OPTIONS, useFactory: options.useFactory, inject: options.inject, }); diff --git a/lib/cluster.service.ts b/lib/cluster.service.ts index 21bc2b4..3361455 100644 --- a/lib/cluster.service.ts +++ b/lib/cluster.service.ts @@ -1,12 +1,12 @@ import { Injectable, Inject } from '@nestjs/common'; import { REDIS_CLUSTER } from './cluster.constants'; import { Redis } from 'ioredis'; -import { ClusterProvider, RedisClusterError } from './cluster.provider'; +import { RedisClusterProvider, RedisClusterError } from './cluster.provider'; @Injectable() -export class ClusterService { +export class RedisClusterService { constructor( - @Inject(REDIS_CLUSTER) private readonly provider: ClusterProvider, + @Inject(REDIS_CLUSTER) private readonly provider: RedisClusterProvider, ) {} getCluster(name?: string): Redis { diff --git a/package.json b/package.json index 171df62..189d7cf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nestjs-redis-cluster", - "version": "1.2.9", + "version": "1.2.10", "description": "A nestjs redis module w/ cluster support", "author": "Ishmael Samuel (useparagon.com)", "license": "MIT", From e6138e524887050cb1fabbea2ba5f5d6f9348080 Mon Sep 17 00:00:00 2001 From: Di Zou Date: Thu, 8 Oct 2020 09:22:33 -0400 Subject: [PATCH 08/19] Issue 54: rename name -> clientName so we can use sentinel --- README.md | 6 +++--- lib/redis-client.provider.ts | 8 ++++---- lib/redis.interface.ts | 2 +- lib/redis.service.ts | 12 ++++++------ 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 86a8ebd..771d3b2 100644 --- a/README.md +++ b/README.md @@ -74,11 +74,11 @@ With multi client ```typescript export default [ { - name:'test1', + clientName:'test1', url: 'redis://:authpassword@127.0.0.1:6380/4', }, { - name:'test2', + clientName:'test2', host: process.env.REDIS_HOST, port: parseInt(process.env.REDIS_PORT), db: parseInt(process.env.REDIS_DB), @@ -109,7 +109,7 @@ interface RedisOptions { /** * client name. default is a uuid, unique. */ - name?: string; + clientName?: string; url?: string; port?: number; host?: string; diff --git a/lib/redis-client.provider.ts b/lib/redis-client.provider.ts index 3eea84a..5f65d87 100644 --- a/lib/redis-client.provider.ts +++ b/lib/redis-client.provider.ts @@ -30,16 +30,16 @@ export const createClient = (): Provider => ({ if (Array.isArray(options)) { await Promise.all( options.map(async o => { - const key = o.name || defaultKey; + const key = o.clientName || defaultKey; if (clients.has(key)) { - throw new RedisClientError(`${o.name || 'default'} client is exists`); + throw new RedisClientError(`${o.clientName || 'default'} client is exists`); } clients.set(key, await getClient(o)); }), ); } else { - if (options.name && options.name.length !== 0) { - defaultKey = options.name; + if (options.clientName && options.clientName.length !== 0) { + defaultKey = options.clientName; } clients.set(defaultKey, await getClient(options)); } diff --git a/lib/redis.interface.ts b/lib/redis.interface.ts index a6d4db0..993a589 100644 --- a/lib/redis.interface.ts +++ b/lib/redis.interface.ts @@ -2,7 +2,7 @@ import { ModuleMetadata } from '@nestjs/common/interfaces'; import { Redis, RedisOptions } from 'ioredis'; export interface RedisModuleOptions extends RedisOptions { - name?: string; + clientName?: string; url?: string; onClientReady?(client: Redis): Promise; } diff --git a/lib/redis.service.ts b/lib/redis.service.ts index 4da6548..6e42c3a 100644 --- a/lib/redis.service.ts +++ b/lib/redis.service.ts @@ -9,14 +9,14 @@ export class RedisService { @Inject(REDIS_CLIENT) private readonly redisClient: RedisClient, ) {} - getClient(name?: string): Redis.Redis { - if (!name) { - name = this.redisClient.defaultKey; + getClient(clientName?: string): Redis.Redis { + if (!clientName) { + clientName = this.redisClient.defaultKey; } - if (!this.redisClient.clients.has(name)) { - throw new RedisClientError(`client ${name} does not exist`); + if (!this.redisClient.clients.has(clientName)) { + throw new RedisClientError(`client ${clientName} does not exist`); } - return this.redisClient.clients.get(name); + return this.redisClient.clients.get(clientName); } getClients(): Map { From 31cdd2ca0949c716a56cda80f24dfcf0691535d4 Mon Sep 17 00:00:00 2001 From: Stanislav V Vyaliy Date: Wed, 4 Nov 2020 17:17:43 +0300 Subject: [PATCH 09/19] reformat --- dist/index.js | 18 +++------------- dist/redis-client.provider.js | 24 +++++++++------------ dist/redis-core.module.js | 39 ++++++++++++++++------------------- dist/redis.constants.js | 7 ++----- dist/redis.interface.js | 3 +-- dist/redis.module.js | 15 ++++++-------- dist/redis.service.js | 17 +++++++-------- index.js | 15 ++++++++++---- nest-cli.json | 2 +- nodemon-debug.json | 6 ------ nodemon.json | 6 ------ package.json | 12 +++++------ tsconfig.json | 7 ++++--- yarn.lock | 12 +++++------ 14 files changed, 75 insertions(+), 108 deletions(-) delete mode 100644 nodemon-debug.json delete mode 100644 nodemon.json diff --git a/dist/index.js b/dist/index.js index 2c4f126..3aae4f1 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,15 +1,3 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -__exportStar(require("./redis.service"), exports); -__exportStar(require("./redis.module"), exports); -__exportStar(require("./redis.interface"), exports); +export * from './redis.service'; +export * from './redis.module'; +export * from './redis.interface'; diff --git a/dist/redis-client.provider.js b/dist/redis-client.provider.js index 6ad362d..7fe162e 100644 --- a/dist/redis-client.provider.js +++ b/dist/redis-client.provider.js @@ -1,12 +1,8 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createAsyncClientOptions = exports.createClient = exports.RedisClientError = void 0; -const Redis = require("ioredis"); -const uuid_1 = require("uuid"); -const redis_constants_1 = require("./redis.constants"); -class RedisClientError extends Error { +import * as Redis from 'ioredis'; +import { v4 as uuidv4 } from 'uuid'; +import { REDIS_CLIENT, REDIS_MODULE_OPTIONS } from './redis.constants'; +export class RedisClientError extends Error { } -exports.RedisClientError = RedisClientError; async function getClient(options) { const { onClientReady, url, ...opt } = options; const client = url ? new Redis(url) : new Redis(opt); @@ -15,11 +11,11 @@ async function getClient(options) { } return client; } -exports.createClient = () => ({ - provide: redis_constants_1.REDIS_CLIENT, +export const createClient = () => ({ + provide: REDIS_CLIENT, useFactory: async (options) => { const clients = new Map(); - let defaultKey = uuid_1.v4(); + let defaultKey = uuidv4(); if (Array.isArray(options)) { await Promise.all(options.map(async (o) => { const key = o.name || defaultKey; @@ -41,10 +37,10 @@ exports.createClient = () => ({ size: clients.size, }; }, - inject: [redis_constants_1.REDIS_MODULE_OPTIONS], + inject: [REDIS_MODULE_OPTIONS], }); -exports.createAsyncClientOptions = (options) => ({ - provide: redis_constants_1.REDIS_MODULE_OPTIONS, +export const createAsyncClientOptions = (options) => ({ + provide: REDIS_MODULE_OPTIONS, useFactory: options.useFactory, inject: options.inject, }); diff --git a/dist/redis-core.module.js b/dist/redis-core.module.js index fb3b7bf..1747be8 100644 --- a/dist/redis-core.module.js +++ b/dist/redis-core.module.js @@ -1,4 +1,3 @@ -"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); @@ -12,13 +11,11 @@ var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; var RedisCoreModule_1; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.RedisCoreModule = void 0; -const common_1 = require("@nestjs/common"); -const core_1 = require("@nestjs/core"); -const redis_client_provider_1 = require("./redis-client.provider"); -const redis_constants_1 = require("./redis.constants"); -const redis_service_1 = require("./redis.service"); +import { Global, Module, Inject, } from '@nestjs/common'; +import { ModuleRef } from '@nestjs/core'; +import { createAsyncClientOptions, createClient, } from './redis-client.provider'; +import { REDIS_MODULE_OPTIONS, REDIS_CLIENT } from './redis.constants'; +import { RedisService } from './redis.service'; let RedisCoreModule = RedisCoreModule_1 = class RedisCoreModule { constructor(options, moduleRef) { this.options = options; @@ -28,18 +25,18 @@ let RedisCoreModule = RedisCoreModule_1 = class RedisCoreModule { return { module: RedisCoreModule_1, providers: [ - redis_client_provider_1.createClient(), - { provide: redis_constants_1.REDIS_MODULE_OPTIONS, useValue: options }, + createClient(), + { provide: REDIS_MODULE_OPTIONS, useValue: options }, ], - exports: [redis_service_1.RedisService], + exports: [RedisService], }; } static forRootAsync(options) { return { module: RedisCoreModule_1, imports: options.imports, - providers: [redis_client_provider_1.createClient(), redis_client_provider_1.createAsyncClientOptions(options)], - exports: [redis_service_1.RedisService], + providers: [createClient(), createAsyncClientOptions(options)], + exports: [RedisService], }; } onModuleDestroy() { @@ -50,7 +47,7 @@ let RedisCoreModule = RedisCoreModule_1 = class RedisCoreModule { client.disconnect(); } }; - const redisClient = this.moduleRef.get(redis_constants_1.REDIS_CLIENT); + const redisClient = this.moduleRef.get(REDIS_CLIENT); const closeClientConnection = closeConnection(redisClient); if (Array.isArray(this.options)) { this.options.forEach(closeClientConnection); @@ -61,12 +58,12 @@ let RedisCoreModule = RedisCoreModule_1 = class RedisCoreModule { } }; RedisCoreModule = RedisCoreModule_1 = __decorate([ - common_1.Global(), - common_1.Module({ - providers: [redis_service_1.RedisService], - exports: [redis_service_1.RedisService], + Global(), + Module({ + providers: [RedisService], + exports: [RedisService], }), - __param(0, common_1.Inject(redis_constants_1.REDIS_MODULE_OPTIONS)), - __metadata("design:paramtypes", [Object, core_1.ModuleRef]) + __param(0, Inject(REDIS_MODULE_OPTIONS)), + __metadata("design:paramtypes", [Object, ModuleRef]) ], RedisCoreModule); -exports.RedisCoreModule = RedisCoreModule; +export { RedisCoreModule }; diff --git a/dist/redis.constants.js b/dist/redis.constants.js index cbc6ad9..0bd4f75 100644 --- a/dist/redis.constants.js +++ b/dist/redis.constants.js @@ -1,5 +1,2 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.REDIS_CLIENT = exports.REDIS_MODULE_OPTIONS = void 0; -exports.REDIS_MODULE_OPTIONS = Symbol('REDIS_MODULE_OPTIONS'); -exports.REDIS_CLIENT = Symbol('REDIS_CLIENT'); +export const REDIS_MODULE_OPTIONS = Symbol('REDIS_MODULE_OPTIONS'); +export const REDIS_CLIENT = Symbol('REDIS_CLIENT'); diff --git a/dist/redis.interface.js b/dist/redis.interface.js index c8ad2e5..cb0ff5c 100644 --- a/dist/redis.interface.js +++ b/dist/redis.interface.js @@ -1,2 +1 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); +export {}; diff --git a/dist/redis.module.js b/dist/redis.module.js index 8f2e37d..6eb8c1a 100644 --- a/dist/redis.module.js +++ b/dist/redis.module.js @@ -1,4 +1,3 @@ -"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); @@ -6,25 +5,23 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key, return c > 3 && r && Object.defineProperty(target, key, r), r; }; var RedisModule_1; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.RedisModule = void 0; -const common_1 = require("@nestjs/common"); -const redis_core_module_1 = require("./redis-core.module"); +import { Module } from '@nestjs/common'; +import { RedisCoreModule } from './redis-core.module'; let RedisModule = RedisModule_1 = class RedisModule { static register(options) { return { module: RedisModule_1, - imports: [redis_core_module_1.RedisCoreModule.register(options)], + imports: [RedisCoreModule.register(options)], }; } static forRootAsync(options) { return { module: RedisModule_1, - imports: [redis_core_module_1.RedisCoreModule.forRootAsync(options)], + imports: [RedisCoreModule.forRootAsync(options)], }; } }; RedisModule = RedisModule_1 = __decorate([ - common_1.Module({}) + Module({}) ], RedisModule); -exports.RedisModule = RedisModule; +export { RedisModule }; diff --git a/dist/redis.service.js b/dist/redis.service.js index 6fa2f8a..317c00b 100644 --- a/dist/redis.service.js +++ b/dist/redis.service.js @@ -1,4 +1,3 @@ -"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); @@ -11,11 +10,9 @@ var __metadata = (this && this.__metadata) || function (k, v) { var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.RedisService = void 0; -const common_1 = require("@nestjs/common"); -const redis_constants_1 = require("./redis.constants"); -const redis_client_provider_1 = require("./redis-client.provider"); +import { Injectable, Inject } from '@nestjs/common'; +import { REDIS_CLIENT } from './redis.constants'; +import { RedisClientError } from './redis-client.provider'; let RedisService = class RedisService { constructor(redisClient) { this.redisClient = redisClient; @@ -25,7 +22,7 @@ let RedisService = class RedisService { name = this.redisClient.defaultKey; } if (!this.redisClient.clients.has(name)) { - throw new redis_client_provider_1.RedisClientError(`client ${name} does not exist`); + throw new RedisClientError(`client ${name} does not exist`); } return this.redisClient.clients.get(name); } @@ -34,8 +31,8 @@ let RedisService = class RedisService { } }; RedisService = __decorate([ - common_1.Injectable(), - __param(0, common_1.Inject(redis_constants_1.REDIS_CLIENT)), + Injectable(), + __param(0, Inject(REDIS_CLIENT)), __metadata("design:paramtypes", [Object]) ], RedisService); -exports.RedisService = RedisService; +export { RedisService }; diff --git a/index.js b/index.js index 9368dd3..70e3613 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,13 @@ "use strict"; -function __export(m) { - for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; -} +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; exports.__esModule = true; -__export(require("./dist")); +__exportStar(require("./dist"), exports); diff --git a/nest-cli.json b/nest-cli.json index 0dde5f8..f0cfd23 100644 --- a/nest-cli.json +++ b/nest-cli.json @@ -1,5 +1,5 @@ { "language": "ts", "collection": "@nestjs/schematics", - "sourceRoot": "src" + "sourceRoot": "lib" } diff --git a/nodemon-debug.json b/nodemon-debug.json deleted file mode 100644 index 7caf94b..0000000 --- a/nodemon-debug.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "watch": ["src"], - "ext": "ts", - "ignore": ["src/**/*.spec.ts"], - "exec": "node --inspect-brk -r ts-node/register src/main.ts" -} \ No newline at end of file diff --git a/nodemon.json b/nodemon.json deleted file mode 100644 index 583bb42..0000000 --- a/nodemon.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "watch": ["src"], - "ext": "ts", - "ignore": ["src/**/*.spec.ts"], - "exec": "ts-node -r tsconfig-paths/register src/main.ts" -} diff --git a/package.json b/package.json index d92e57a..dc9bc47 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nest-redis", - "version": "1.3.2", + "version": "1.3.3", "description": "a NestJS ioRedis module", "author": "Stanislav V Vyaliy", "license": "MIT", @@ -22,16 +22,14 @@ "dependencies": { "@nestjs/common": "^7", "@nestjs/core": "^7", - "@types/ioredis": "*", - "@types/uuid": "*", - "ioredis": "^4", - "reflect-metadata": "*", - "rxjs": "^6", + "ioredis": "*", "uuid": "^8" }, "devDependencies": { "@nestjs/testing": "^7", "@types/node": "*", + "@types/ioredis": "*", + "@types/uuid": "*", "@typescript-eslint/eslint-plugin": "^4", "@typescript-eslint/parser": "^4", "cz-conventional-changelog": "^3", @@ -41,7 +39,9 @@ "eslint-plugin-prettier": "^3", "jest": "^26", "prettier": "^2", + "reflect-metadata": "*", "rimraf": "*", + "rxjs": "^6", "ts-jest": "^26", "typescript": "^4" }, diff --git a/tsconfig.json b/tsconfig.json index 256c414..9a07bb0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,8 +1,9 @@ { "compilerOptions": { - "module": "CommonJS", - "target": "ES2018", + "module": "esnext", + "target": "es2018", "declaration": true, + "moduleResolution": "node", "noImplicitAny": false, "removeComments": true, "noLib": false, @@ -13,6 +14,6 @@ "rootDir": "./lib", "skipLibCheck": true }, - "include": ["lib/**/*", "../index.ts"], + "include": ["lib/**/*"], "exclude": ["node_modules", "**/*.spec.ts"] } diff --git a/yarn.lock b/yarn.lock index 24a1c5b..6488145 100644 --- a/yarn.lock +++ b/yarn.lock @@ -258,9 +258,9 @@ lodash "^4.17.19" "@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.5.tgz#5d6b4590cfe90c0c8d7396c83ffd9fc28b5a6450" - integrity sha512-gyTcvz7JFa4V45C0Zklv//GmFOAal5fL23OWpBLqc4nZ4Yrz67s4kCNwSK1Gu0MXGTU8mRY3zJYtacLdKXlzig== + version "7.12.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.6.tgz#ae0e55ef1cce1fbc881cd26f8234eb3e657edc96" + integrity sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA== dependencies: "@babel/helper-validator-identifier" "^7.10.4" lodash "^4.17.19" @@ -1597,7 +1597,7 @@ escodegen@^1.14.1: optionalDependencies: source-map "~0.6.1" -eslint-config-prettier@^6.15.0: +eslint-config-prettier@^6: version "6.15.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== @@ -1611,7 +1611,7 @@ eslint-plugin-jest@^24: dependencies: "@typescript-eslint/experimental-utils" "^4.0.1" -eslint-plugin-prettier@^3.1.4: +eslint-plugin-prettier@^3: version "3.1.4" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz#168ab43154e2ea57db992a2cd097c828171f75c2" integrity sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg== @@ -2351,7 +2351,7 @@ inquirer@6.5.2: strip-ansi "^5.1.0" through "^2.3.6" -ioredis@^4: +ioredis@*: version "4.19.2" resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.19.2.tgz#e3eab394c653cea5aea07c0c784d8c772dce8801" integrity sha512-SZSIwMrbd96b7rJvJwyTWSP6XQ0m1kAIIqBnwglJKrIJ6na7TeY4F2EV2vDY0xm/fLrUY8cEg81dR7kVFt2sKA== From 7d8fc0c42f76019381d15ac89caf6d607ecb4286 Mon Sep 17 00:00:00 2001 From: Stanislav V Vyaliy Date: Wed, 4 Nov 2020 17:56:27 +0300 Subject: [PATCH 10/19] reformat --- dist/index.js | 19 ++++++++++++--- dist/index.js.map | 1 + dist/redis-client.provider.d.ts | 2 +- dist/redis-client.provider.js | 30 ++++++++++++++--------- dist/redis-client.provider.js.map | 1 + dist/redis-core.module.js | 40 +++++++++++++++++-------------- dist/redis-core.module.js.map | 1 + dist/redis.constants.js | 8 +++++-- dist/redis.constants.js.map | 1 + dist/redis.interface.js | 4 +++- dist/redis.interface.js.map | 1 + dist/redis.module.js | 16 ++++++++----- dist/redis.module.js.map | 1 + dist/redis.service.js | 18 ++++++++------ dist/redis.service.js.map | 1 + lib/redis-client.provider.ts | 2 +- package.json | 4 ++-- tsconfig.json | 7 +++--- 18 files changed, 102 insertions(+), 55 deletions(-) create mode 100644 dist/index.js.map create mode 100644 dist/redis-client.provider.js.map create mode 100644 dist/redis-core.module.js.map create mode 100644 dist/redis.constants.js.map create mode 100644 dist/redis.interface.js.map create mode 100644 dist/redis.module.js.map create mode 100644 dist/redis.service.js.map diff --git a/dist/index.js b/dist/index.js index 3aae4f1..a41b1ce 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,3 +1,16 @@ -export * from './redis.service'; -export * from './redis.module'; -export * from './redis.interface'; +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./redis.service"), exports); +__exportStar(require("./redis.module"), exports); +__exportStar(require("./redis.interface"), exports); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map new file mode 100644 index 0000000..54b647b --- /dev/null +++ b/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,kDAAgC;AAChC,iDAA+B;AAC/B,oDAAkC"} \ No newline at end of file diff --git a/dist/redis-client.provider.d.ts b/dist/redis-client.provider.d.ts index 731646b..61763c1 100644 --- a/dist/redis-client.provider.d.ts +++ b/dist/redis-client.provider.d.ts @@ -1,4 +1,4 @@ -import * as Redis from 'ioredis'; +import Redis from 'ioredis'; import { Provider } from '@nestjs/common'; import { RedisModuleAsyncOptions, RedisModuleOptions } from './redis.interface'; export declare class RedisClientError extends Error { diff --git a/dist/redis-client.provider.js b/dist/redis-client.provider.js index 7fe162e..007ac70 100644 --- a/dist/redis-client.provider.js +++ b/dist/redis-client.provider.js @@ -1,21 +1,28 @@ -import * as Redis from 'ioredis'; -import { v4 as uuidv4 } from 'uuid'; -import { REDIS_CLIENT, REDIS_MODULE_OPTIONS } from './redis.constants'; -export class RedisClientError extends Error { +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createAsyncClientOptions = exports.createClient = exports.RedisClientError = void 0; +const ioredis_1 = __importDefault(require("ioredis")); +const uuid_1 = require("uuid"); +const redis_constants_1 = require("./redis.constants"); +class RedisClientError extends Error { } +exports.RedisClientError = RedisClientError; async function getClient(options) { const { onClientReady, url, ...opt } = options; - const client = url ? new Redis(url) : new Redis(opt); + const client = url ? new ioredis_1.default(url) : new ioredis_1.default(opt); if (onClientReady) { onClientReady(client); } return client; } -export const createClient = () => ({ - provide: REDIS_CLIENT, +exports.createClient = () => ({ + provide: redis_constants_1.REDIS_CLIENT, useFactory: async (options) => { const clients = new Map(); - let defaultKey = uuidv4(); + let defaultKey = uuid_1.v4(); if (Array.isArray(options)) { await Promise.all(options.map(async (o) => { const key = o.name || defaultKey; @@ -37,10 +44,11 @@ export const createClient = () => ({ size: clients.size, }; }, - inject: [REDIS_MODULE_OPTIONS], + inject: [redis_constants_1.REDIS_MODULE_OPTIONS], }); -export const createAsyncClientOptions = (options) => ({ - provide: REDIS_MODULE_OPTIONS, +exports.createAsyncClientOptions = (options) => ({ + provide: redis_constants_1.REDIS_MODULE_OPTIONS, useFactory: options.useFactory, inject: options.inject, }); +//# sourceMappingURL=redis-client.provider.js.map \ No newline at end of file diff --git a/dist/redis-client.provider.js.map b/dist/redis-client.provider.js.map new file mode 100644 index 0000000..ba7aac7 --- /dev/null +++ b/dist/redis-client.provider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"redis-client.provider.js","sourceRoot":"","sources":["../lib/redis-client.provider.ts"],"names":[],"mappings":";;;;;;AAAA,sDAA4B;AAC5B,+BAAoC;AAGpC,uDAAuE;AAGvE,MAAa,gBAAiB,SAAQ,KAAK;CAAG;AAA9C,4CAA8C;AAO9C,KAAK,UAAU,SAAS,CAAC,OAA2B;IAClD,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;IAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,iBAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,iBAAK,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,aAAa,EAAE;QACjB,aAAa,CAAC,MAAM,CAAC,CAAA;KACtB;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAEY,QAAA,YAAY,GAAG,GAAa,EAAE,CAAC,CAAC;IAC3C,OAAO,EAAE,8BAAY;IACrB,UAAU,EAAE,KAAK,EAAE,OAAkD,EAAwB,EAAE;QAC7F,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC/C,IAAI,UAAU,GAAG,SAAM,EAAE,CAAC;QAE1B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAC1B,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAC,CAAC,EAAC,EAAE;gBACpB,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,UAAU,CAAC;gBACjC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBACpB,MAAM,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,SAAS,mBAAmB,CAAC,CAAC;iBACvE;gBACD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,CAAC,CAAC,CACH,CAAC;SACH;aAAM;YACL,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC7C,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;aAC3B;YACD,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;SACnD;QAED,OAAO;YACL,UAAU;YACV,OAAO;YACP,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,CAAC,sCAAoB,CAAC;CAC/B,CAAC,CAAC;AAEU,QAAA,wBAAwB,GAAG,CAAC,OAAgC,EAAE,EAAE,CAAC,CAAC;IAC7E,OAAO,EAAE,sCAAoB;IAC7B,UAAU,EAAE,OAAO,CAAC,UAAU;IAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;CACvB,CAAC,CAAC"} \ No newline at end of file diff --git a/dist/redis-core.module.js b/dist/redis-core.module.js index 1747be8..719e9be 100644 --- a/dist/redis-core.module.js +++ b/dist/redis-core.module.js @@ -1,3 +1,4 @@ +"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); @@ -11,11 +12,13 @@ var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; var RedisCoreModule_1; -import { Global, Module, Inject, } from '@nestjs/common'; -import { ModuleRef } from '@nestjs/core'; -import { createAsyncClientOptions, createClient, } from './redis-client.provider'; -import { REDIS_MODULE_OPTIONS, REDIS_CLIENT } from './redis.constants'; -import { RedisService } from './redis.service'; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RedisCoreModule = void 0; +const common_1 = require("@nestjs/common"); +const core_1 = require("@nestjs/core"); +const redis_client_provider_1 = require("./redis-client.provider"); +const redis_constants_1 = require("./redis.constants"); +const redis_service_1 = require("./redis.service"); let RedisCoreModule = RedisCoreModule_1 = class RedisCoreModule { constructor(options, moduleRef) { this.options = options; @@ -25,18 +28,18 @@ let RedisCoreModule = RedisCoreModule_1 = class RedisCoreModule { return { module: RedisCoreModule_1, providers: [ - createClient(), - { provide: REDIS_MODULE_OPTIONS, useValue: options }, + redis_client_provider_1.createClient(), + { provide: redis_constants_1.REDIS_MODULE_OPTIONS, useValue: options }, ], - exports: [RedisService], + exports: [redis_service_1.RedisService], }; } static forRootAsync(options) { return { module: RedisCoreModule_1, imports: options.imports, - providers: [createClient(), createAsyncClientOptions(options)], - exports: [RedisService], + providers: [redis_client_provider_1.createClient(), redis_client_provider_1.createAsyncClientOptions(options)], + exports: [redis_service_1.RedisService], }; } onModuleDestroy() { @@ -47,7 +50,7 @@ let RedisCoreModule = RedisCoreModule_1 = class RedisCoreModule { client.disconnect(); } }; - const redisClient = this.moduleRef.get(REDIS_CLIENT); + const redisClient = this.moduleRef.get(redis_constants_1.REDIS_CLIENT); const closeClientConnection = closeConnection(redisClient); if (Array.isArray(this.options)) { this.options.forEach(closeClientConnection); @@ -58,12 +61,13 @@ let RedisCoreModule = RedisCoreModule_1 = class RedisCoreModule { } }; RedisCoreModule = RedisCoreModule_1 = __decorate([ - Global(), - Module({ - providers: [RedisService], - exports: [RedisService], + common_1.Global(), + common_1.Module({ + providers: [redis_service_1.RedisService], + exports: [redis_service_1.RedisService], }), - __param(0, Inject(REDIS_MODULE_OPTIONS)), - __metadata("design:paramtypes", [Object, ModuleRef]) + __param(0, common_1.Inject(redis_constants_1.REDIS_MODULE_OPTIONS)), + __metadata("design:paramtypes", [Object, core_1.ModuleRef]) ], RedisCoreModule); -export { RedisCoreModule }; +exports.RedisCoreModule = RedisCoreModule; +//# sourceMappingURL=redis-core.module.js.map \ No newline at end of file diff --git a/dist/redis-core.module.js.map b/dist/redis-core.module.js.map new file mode 100644 index 0000000..76564d6 --- /dev/null +++ b/dist/redis-core.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"redis-core.module.js","sourceRoot":"","sources":["../lib/redis-core.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAMwB;AACxB,uCAAyC;AAEzC,mEAIiC;AAEjC,uDAAuE;AACvE,mDAA+C;AAO/C,IAAa,eAAe,uBAA5B,MAAa,eAAe;IAC1B,YAEmB,OAAkD,EAClD,SAAoB;QADpB,YAAO,GAAP,OAAO,CAA2C;QAClD,cAAS,GAAT,SAAS,CAAW;IACpC,CAAC;IAEJ,MAAM,CAAC,QAAQ,CACb,OAAkD;QAElD,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,SAAS,EAAE;gBACT,oCAAY,EAAE;gBACd,EAAE,OAAO,EAAE,sCAAoB,EAAE,QAAQ,EAAE,OAAO,EAAE;aACrD;YACD,OAAO,EAAE,CAAC,4BAAY,CAAC;SACxB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAgC;QAClD,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,CAAC,oCAAY,EAAE,EAAE,gDAAwB,CAAC,OAAO,CAAC,CAAC;YAC9D,OAAO,EAAE,CAAC,4BAAY,CAAC;SACxB,CAAC;IACJ,CAAC;IAED,eAAe;QACb,MAAM,eAAe,GAAG,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE;YAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;YACxC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEjC,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;gBAChC,MAAM,CAAC,UAAU,EAAE,CAAC;aACrB;QACH,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAc,8BAAY,CAAC,CAAC;QAClE,MAAM,qBAAqB,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QAE3D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YAC/B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;SAC7C;aAAM;YACL,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACrC;IACH,CAAC;CACF,CAAA;AAhDY,eAAe;IAL3B,eAAM,EAAE;IACR,eAAM,CAAC;QACN,SAAS,EAAE,CAAC,4BAAY,CAAC;QACzB,OAAO,EAAE,CAAC,4BAAY,CAAC;KACxB,CAAC;IAGG,WAAA,eAAM,CAAC,sCAAoB,CAAC,CAAA;6CAED,gBAAS;GAJ5B,eAAe,CAgD3B;AAhDY,0CAAe"} \ No newline at end of file diff --git a/dist/redis.constants.js b/dist/redis.constants.js index 0bd4f75..58deca1 100644 --- a/dist/redis.constants.js +++ b/dist/redis.constants.js @@ -1,2 +1,6 @@ -export const REDIS_MODULE_OPTIONS = Symbol('REDIS_MODULE_OPTIONS'); -export const REDIS_CLIENT = Symbol('REDIS_CLIENT'); +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.REDIS_CLIENT = exports.REDIS_MODULE_OPTIONS = void 0; +exports.REDIS_MODULE_OPTIONS = Symbol('REDIS_MODULE_OPTIONS'); +exports.REDIS_CLIENT = Symbol('REDIS_CLIENT'); +//# sourceMappingURL=redis.constants.js.map \ No newline at end of file diff --git a/dist/redis.constants.js.map b/dist/redis.constants.js.map new file mode 100644 index 0000000..cee136d --- /dev/null +++ b/dist/redis.constants.js.map @@ -0,0 +1 @@ +{"version":3,"file":"redis.constants.js","sourceRoot":"","sources":["../lib/redis.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,oBAAoB,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC;AACtD,QAAA,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC"} \ No newline at end of file diff --git a/dist/redis.interface.js b/dist/redis.interface.js index cb0ff5c..b11e575 100644 --- a/dist/redis.interface.js +++ b/dist/redis.interface.js @@ -1 +1,3 @@ -export {}; +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=redis.interface.js.map \ No newline at end of file diff --git a/dist/redis.interface.js.map b/dist/redis.interface.js.map new file mode 100644 index 0000000..add791d --- /dev/null +++ b/dist/redis.interface.js.map @@ -0,0 +1 @@ +{"version":3,"file":"redis.interface.js","sourceRoot":"","sources":["../lib/redis.interface.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/redis.module.js b/dist/redis.module.js index 6eb8c1a..51aa1b7 100644 --- a/dist/redis.module.js +++ b/dist/redis.module.js @@ -1,3 +1,4 @@ +"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); @@ -5,23 +6,26 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key, return c > 3 && r && Object.defineProperty(target, key, r), r; }; var RedisModule_1; -import { Module } from '@nestjs/common'; -import { RedisCoreModule } from './redis-core.module'; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RedisModule = void 0; +const common_1 = require("@nestjs/common"); +const redis_core_module_1 = require("./redis-core.module"); let RedisModule = RedisModule_1 = class RedisModule { static register(options) { return { module: RedisModule_1, - imports: [RedisCoreModule.register(options)], + imports: [redis_core_module_1.RedisCoreModule.register(options)], }; } static forRootAsync(options) { return { module: RedisModule_1, - imports: [RedisCoreModule.forRootAsync(options)], + imports: [redis_core_module_1.RedisCoreModule.forRootAsync(options)], }; } }; RedisModule = RedisModule_1 = __decorate([ - Module({}) + common_1.Module({}) ], RedisModule); -export { RedisModule }; +exports.RedisModule = RedisModule; +//# sourceMappingURL=redis.module.js.map \ No newline at end of file diff --git a/dist/redis.module.js.map b/dist/redis.module.js.map new file mode 100644 index 0000000..7ee4c4a --- /dev/null +++ b/dist/redis.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"redis.module.js","sourceRoot":"","sources":["../lib/redis.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AAGvD,2DAAsD;AAGtD,IAAa,WAAW,mBAAxB,MAAa,WAAW;IACtB,MAAM,CAAC,QAAQ,CACb,OAAkD;QAElD,OAAO;YACL,MAAM,EAAE,aAAW;YACnB,OAAO,EAAE,CAAC,mCAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SAC7C,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAgC;QAClD,OAAO;YACL,MAAM,EAAE,aAAW;YACnB,OAAO,EAAE,CAAC,mCAAe,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;SACjD,CAAC;IACJ,CAAC;CACF,CAAA;AAhBY,WAAW;IADvB,eAAM,CAAC,EAAE,CAAC;GACE,WAAW,CAgBvB;AAhBY,kCAAW"} \ No newline at end of file diff --git a/dist/redis.service.js b/dist/redis.service.js index 317c00b..ee88ee4 100644 --- a/dist/redis.service.js +++ b/dist/redis.service.js @@ -1,3 +1,4 @@ +"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); @@ -10,9 +11,11 @@ var __metadata = (this && this.__metadata) || function (k, v) { var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; -import { Injectable, Inject } from '@nestjs/common'; -import { REDIS_CLIENT } from './redis.constants'; -import { RedisClientError } from './redis-client.provider'; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RedisService = void 0; +const common_1 = require("@nestjs/common"); +const redis_constants_1 = require("./redis.constants"); +const redis_client_provider_1 = require("./redis-client.provider"); let RedisService = class RedisService { constructor(redisClient) { this.redisClient = redisClient; @@ -22,7 +25,7 @@ let RedisService = class RedisService { name = this.redisClient.defaultKey; } if (!this.redisClient.clients.has(name)) { - throw new RedisClientError(`client ${name} does not exist`); + throw new redis_client_provider_1.RedisClientError(`client ${name} does not exist`); } return this.redisClient.clients.get(name); } @@ -31,8 +34,9 @@ let RedisService = class RedisService { } }; RedisService = __decorate([ - Injectable(), - __param(0, Inject(REDIS_CLIENT)), + common_1.Injectable(), + __param(0, common_1.Inject(redis_constants_1.REDIS_CLIENT)), __metadata("design:paramtypes", [Object]) ], RedisService); -export { RedisService }; +exports.RedisService = RedisService; +//# sourceMappingURL=redis.service.js.map \ No newline at end of file diff --git a/dist/redis.service.js.map b/dist/redis.service.js.map new file mode 100644 index 0000000..364944f --- /dev/null +++ b/dist/redis.service.js.map @@ -0,0 +1 @@ +{"version":3,"file":"redis.service.js","sourceRoot":"","sources":["../lib/redis.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,uDAAiD;AAEjD,mEAAwE;AAGxE,IAAa,YAAY,GAAzB,MAAa,YAAY;IACvB,YACyC,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;IAC9D,CAAC;IAEJ,SAAS,CAAC,IAAa;QACrB,IAAI,CAAC,IAAI,EAAE;YACT,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;SACpC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACvC,MAAM,IAAI,wCAAgB,CAAC,UAAU,IAAI,iBAAiB,CAAC,CAAC;SAC7D;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;IAClC,CAAC;CACF,CAAA;AAlBY,YAAY;IADxB,mBAAU,EAAE;IAGR,WAAA,eAAM,CAAC,8BAAY,CAAC,CAAA;;GAFZ,YAAY,CAkBxB;AAlBY,oCAAY"} \ No newline at end of file diff --git a/lib/redis-client.provider.ts b/lib/redis-client.provider.ts index eac33a1..b8b233e 100644 --- a/lib/redis-client.provider.ts +++ b/lib/redis-client.provider.ts @@ -1,4 +1,4 @@ -import * as Redis from 'ioredis'; +import Redis from 'ioredis'; import { v4 as uuidv4 } from 'uuid'; import { Provider } from '@nestjs/common'; diff --git a/package.json b/package.json index dc9bc47..61b59d2 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "nest-redis", - "version": "1.3.3", + "version": "1.3.4", "description": "a NestJS ioRedis module", "author": "Stanislav V Vyaliy", "license": "MIT", "repository": { "type": "git", - "url": "https://github.com/wisekaa03/nestjs-ioredis.git" + "url": "https://github.com/wisekaa03/nest-ioredis.git" }, "scripts": { "build": "rimraf dist && tsc -p tsconfig.json", diff --git a/tsconfig.json b/tsconfig.json index 9a07bb0..30c360d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,15 +1,16 @@ { "compilerOptions": { - "module": "esnext", - "target": "es2018", + "module": "commonjs", + "target": "esnext", "declaration": true, "moduleResolution": "node", "noImplicitAny": false, "removeComments": true, "noLib": false, + "esModuleInterop": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, - "sourceMap": false, + "sourceMap": true, "outDir": "./dist", "rootDir": "./lib", "skipLibCheck": true From 0143dc92506e777e9e22e654da46e4c928d454c3 Mon Sep 17 00:00:00 2001 From: Stanislav V Vyaliy Date: Wed, 4 Nov 2020 18:01:06 +0300 Subject: [PATCH 11/19] package version rename --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 61b59d2..9323c94 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "nest-redis", - "version": "1.3.4", + "name": "nest-ioredis", + "version": "1.3.5", "description": "a NestJS ioRedis module", "author": "Stanislav V Vyaliy", "license": "MIT", From 6e349c4148c935d0e098d21805dbe4e1762add28 Mon Sep 17 00:00:00 2001 From: Stanislav V Vyaliy Date: Wed, 4 Nov 2020 18:03:14 +0300 Subject: [PATCH 12/19] package version rename --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9323c94..34bb9c9 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { - "name": "nest-ioredis", + "name": "nest-redis", "version": "1.3.5", "description": "a NestJS ioRedis module", "author": "Stanislav V Vyaliy", "license": "MIT", "repository": { "type": "git", - "url": "https://github.com/wisekaa03/nest-ioredis.git" + "url": "https://github.com/wisekaa03/nest-redis.git" }, "scripts": { "build": "rimraf dist && tsc -p tsconfig.json", From 26a31ec9eefbfb7fb87288818acbbc9f72678fe8 Mon Sep 17 00:00:00 2001 From: Stanislav V Vyaliy Date: Wed, 4 Nov 2020 18:05:59 +0300 Subject: [PATCH 13/19] README --- README.md | 306 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 158 insertions(+), 148 deletions(-) diff --git a/README.md b/README.md index 86a8ebd..57a3611 100644 --- a/README.md +++ b/README.md @@ -1,209 +1,219 @@ - # Nestjs Redis Redis component for NestJs. - ### Installation **Yarn** + ```bash -yarn add nestjs-redis +yarn add nest-redis ``` **NPM** + ```bash -npm install nestjs-redis --save +npm install nest-redis --save ``` ### Getting Started + Let's register the RedisModule in `app.module.ts` ```typescript -import { Module } from '@nestjs/common' -import { RedisModule} from 'nestjs-redis' +import { Module } from '@nestjs/common'; +import { RedisModule } from 'nest-redis'; @Module({ - imports: [ - RedisModule.register(options) - ], + imports: [RedisModule.register(options)], }) export class AppModule {} ``` + With Async + ```typescript import { Module } from '@nestjs/common'; -import { RedisModule} from 'nestjs-redis' +import { RedisModule } from 'nest-redis'; @Module({ - imports: [ - RedisModule.forRootAsync({ - useFactory: (configService: ConfigService) => configService.get('redis'), // or use async method - //useFactory: async (configService: ConfigService) => configService.get('redis'), - inject:[ConfigService] - }), - ], + imports: [ + RedisModule.forRootAsync({ + useFactory: (configService: ConfigService) => configService.get('redis'), // or use async method + //useFactory: async (configService: ConfigService) => configService.get('redis'), + inject: [ConfigService], + }), + ], }) export class AppModule {} ``` + And the config file look like this With single client + ```typescript export default { - host: process.env.REDIS_HOST, - port: parseInt(process.env.REDIS_PORT), - db: parseInt(process.env.REDIS_DB), - password: process.env.REDIS_PASSWORD, - keyPrefix: process.env.REDIS_PRIFIX, -} -Or + host: process.env.REDIS_HOST, + port: parseInt(process.env.REDIS_PORT), + db: parseInt(process.env.REDIS_DB), + password: process.env.REDIS_PASSWORD, + keyPrefix: process.env.REDIS_PRIFIX, +}; +Or; export default { - url: 'redis://:authpassword@127.0.0.1:6380/4', -} + url: 'redis://:authpassword@127.0.0.1:6380/4', +}; ``` + With custom error handler + ```typescript export default { - url: 'redis://:authpassword@127.0.0.1:6380/4', - onClientReady: (client) => { - client.on('error', (err) => {} - )}, -} + url: 'redis://:authpassword@127.0.0.1:6380/4', + onClientReady: (client) => { + client.on('error', (err) => {}); + }, +}; ``` + With multi client + ```typescript export default [ - { - name:'test1', - url: 'redis://:authpassword@127.0.0.1:6380/4', - }, - { - name:'test2', - host: process.env.REDIS_HOST, - port: parseInt(process.env.REDIS_PORT), - db: parseInt(process.env.REDIS_DB), - password: process.env.REDIS_PASSWORD, - keyPrefix: process.env.REDIS_PRIFIX, - }, -] + { + name: 'test1', + url: 'redis://:authpassword@127.0.0.1:6380/4', + }, + { + name: 'test2', + host: process.env.REDIS_HOST, + port: parseInt(process.env.REDIS_PORT), + db: parseInt(process.env.REDIS_DB), + password: process.env.REDIS_PASSWORD, + keyPrefix: process.env.REDIS_PRIFIX, + }, +]; ``` + And use in your service + ```typescript import { Injectable } from '@nestjs/common'; -import { RedisService } from 'nestjs-redis'; +import { RedisService } from 'nest-redis'; @Injectable() export class TestService { - constructor( - private readonly redisService: RedisService, - ) { } + constructor(private readonly redisService: RedisService) {} async root(): Promise { - const client = await this.redisService.getClient('test') - return true + const client = await this.redisService.getClient('test'); + return true; } } ``` + Options + ```typescript interface RedisOptions { - /** - * client name. default is a uuid, unique. - */ - name?: string; - url?: string; - port?: number; - host?: string; - /** - * 4 (IPv4) or 6 (IPv6), Defaults to 4. - */ - family?: number; - /** - * Local domain socket path. If set the port, host and family will be ignored. - */ - path?: string; - /** - * TCP KeepAlive on the socket with a X ms delay before start. Set to a non-number value to disable keepAlive. - */ - keepAlive?: number; - connectionName?: string; - /** - * If set, client will send AUTH command with the value of this option when connected. - */ - password?: string; - /** - * Database index to use. - */ - db?: number; - /** - * When a connection is established to the Redis server, the server might still be loading - * the database from disk. While loading, the server not respond to any commands. - * To work around this, when this option is true, ioredis will check the status of the Redis server, - * and when the Redis server is able to process commands, a ready event will be emitted. - */ - enableReadyCheck?: boolean; - keyPrefix?: string; - /** - * When the return value isn't a number, ioredis will stop trying to reconnect. - * Fixed in: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/15858 - */ - retryStrategy?(times: number): number | false; - /** - * By default, all pending commands will be flushed with an error every - * 20 retry attempts. That makes sure commands won't wait forever when - * the connection is down. You can change this behavior by setting - * `maxRetriesPerRequest`. - * - * Set maxRetriesPerRequest to `null` to disable this behavior, and - * every command will wait forever until the connection is alive again - * (which is the default behavior before ioredis v4). - */ - maxRetriesPerRequest?: number | null; - /** - * 1/true means reconnect, 2 means reconnect and resend failed command. Returning false will ignore - * the error and do nothing. - */ - reconnectOnError?(error: Error): boolean | 1 | 2; - /** - * By default, if there is no active connection to the Redis server, commands are added to a queue - * and are executed once the connection is "ready" (when enableReadyCheck is true, "ready" means - * the Redis server has loaded the database from disk, otherwise means the connection to the Redis - * server has been established). If this option is false, when execute the command when the connection - * isn't ready, an error will be returned. - */ - enableOfflineQueue?: boolean; - /** - * The milliseconds before a timeout occurs during the initial connection to the Redis server. - * default: 10000. - */ - connectTimeout?: number; - /** - * After reconnected, if the previous connection was in the subscriber mode, client will auto re-subscribe these channels. - * default: true. - */ - autoResubscribe?: boolean; - /** - * If true, client will resend unfulfilled commands(e.g. block commands) in the previous connection when reconnected. - * default: true. - */ - autoResendUnfulfilledCommands?: boolean; - lazyConnect?: boolean; - tls?: tls.ConnectionOptions; - sentinels?: Array<{ host: string; port: number; }>; - name?: string; - /** - * Enable READONLY mode for the connection. Only available for cluster mode. - * default: false. - */ - readOnly?: boolean; - /** - * If you are using the hiredis parser, it's highly recommended to enable this option. - * Create another instance with dropBufferSupport disabled for other commands that you want to return binary instead of string - */ - dropBufferSupport?: boolean; - /** - * Whether to show a friendly error stack. Will decrease the performance significantly. - */ - showFriendlyErrorStack?: boolean; + /** + * client name. default is a uuid, unique. + */ + name?: string; + url?: string; + port?: number; + host?: string; + /** + * 4 (IPv4) or 6 (IPv6), Defaults to 4. + */ + family?: number; + /** + * Local domain socket path. If set the port, host and family will be ignored. + */ + path?: string; + /** + * TCP KeepAlive on the socket with a X ms delay before start. Set to a non-number value to disable keepAlive. + */ + keepAlive?: number; + connectionName?: string; + /** + * If set, client will send AUTH command with the value of this option when connected. + */ + password?: string; + /** + * Database index to use. + */ + db?: number; + /** + * When a connection is established to the Redis server, the server might still be loading + * the database from disk. While loading, the server not respond to any commands. + * To work around this, when this option is true, ioredis will check the status of the Redis server, + * and when the Redis server is able to process commands, a ready event will be emitted. + */ + enableReadyCheck?: boolean; + keyPrefix?: string; + /** + * When the return value isn't a number, ioredis will stop trying to reconnect. + * Fixed in: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/15858 + */ + retryStrategy?(times: number): number | false; + /** + * By default, all pending commands will be flushed with an error every + * 20 retry attempts. That makes sure commands won't wait forever when + * the connection is down. You can change this behavior by setting + * `maxRetriesPerRequest`. + * + * Set maxRetriesPerRequest to `null` to disable this behavior, and + * every command will wait forever until the connection is alive again + * (which is the default behavior before ioredis v4). + */ + maxRetriesPerRequest?: number | null; + /** + * 1/true means reconnect, 2 means reconnect and resend failed command. Returning false will ignore + * the error and do nothing. + */ + reconnectOnError?(error: Error): boolean | 1 | 2; + /** + * By default, if there is no active connection to the Redis server, commands are added to a queue + * and are executed once the connection is "ready" (when enableReadyCheck is true, "ready" means + * the Redis server has loaded the database from disk, otherwise means the connection to the Redis + * server has been established). If this option is false, when execute the command when the connection + * isn't ready, an error will be returned. + */ + enableOfflineQueue?: boolean; + /** + * The milliseconds before a timeout occurs during the initial connection to the Redis server. + * default: 10000. + */ + connectTimeout?: number; + /** + * After reconnected, if the previous connection was in the subscriber mode, client will auto re-subscribe these channels. + * default: true. + */ + autoResubscribe?: boolean; + /** + * If true, client will resend unfulfilled commands(e.g. block commands) in the previous connection when reconnected. + * default: true. + */ + autoResendUnfulfilledCommands?: boolean; + lazyConnect?: boolean; + tls?: tls.ConnectionOptions; + sentinels?: Array<{ host: string; port: number }>; + name?: string; + /** + * Enable READONLY mode for the connection. Only available for cluster mode. + * default: false. + */ + readOnly?: boolean; + /** + * If you are using the hiredis parser, it's highly recommended to enable this option. + * Create another instance with dropBufferSupport disabled for other commands that you want to return binary instead of string + */ + dropBufferSupport?: boolean; + /** + * Whether to show a friendly error stack. Will decrease the performance significantly. + */ + showFriendlyErrorStack?: boolean; } ``` + That's it! From 098f9ec6214c07deda2e3c087c84bd11f55a2720 Mon Sep 17 00:00:00 2001 From: Stanislav V Vyaliy Date: Wed, 4 Nov 2020 20:23:52 +0300 Subject: [PATCH 14/19] package author --- README.md | 10 +++++----- package.json | 8 ++++---- tsconfig.json | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 57a3611..2c1b1fb 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,13 @@ Redis component for NestJs. **Yarn** ```bash -yarn add nest-redis +yarn add nestjs-redis ``` **NPM** ```bash -npm install nest-redis --save +npm install nestjs-redis --save ``` ### Getting Started @@ -22,7 +22,7 @@ Let's register the RedisModule in `app.module.ts` ```typescript import { Module } from '@nestjs/common'; -import { RedisModule } from 'nest-redis'; +import { RedisModule } from 'nestjs-redis'; @Module({ imports: [RedisModule.register(options)], @@ -34,7 +34,7 @@ With Async ```typescript import { Module } from '@nestjs/common'; -import { RedisModule } from 'nest-redis'; +import { RedisModule } from 'nestjs-redis'; @Module({ imports: [ @@ -99,7 +99,7 @@ And use in your service ```typescript import { Injectable } from '@nestjs/common'; -import { RedisService } from 'nest-redis'; +import { RedisService } from 'nestjs-redis'; @Injectable() export class TestService { diff --git a/package.json b/package.json index 34bb9c9..a2aba93 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { - "name": "nest-redis", - "version": "1.3.5", + "name": "nestjs-redis", + "version": "1.3.6", "description": "a NestJS ioRedis module", - "author": "Stanislav V Vyaliy", + "author": "skunight", "license": "MIT", "repository": { "type": "git", - "url": "https://github.com/wisekaa03/nest-redis.git" + "url": "https://github.com/skunight/nestjs-redis.git" }, "scripts": { "build": "rimraf dist && tsc -p tsconfig.json", diff --git a/tsconfig.json b/tsconfig.json index 30c360d..572c805 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "module": "commonjs", - "target": "esnext", + "target": "es2018", "declaration": true, "moduleResolution": "node", "noImplicitAny": false, From 39f2e6dcbb7251d8f839c9ce34a984f95d2f9677 Mon Sep 17 00:00:00 2001 From: Stanislav V Vyaliy Date: Fri, 6 Nov 2020 11:42:14 +0300 Subject: [PATCH 15/19] package version upgrade --- package.json | 2 +- yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index a2aba93..4685428 100644 --- a/package.json +++ b/package.json @@ -27,8 +27,8 @@ }, "devDependencies": { "@nestjs/testing": "^7", - "@types/node": "*", "@types/ioredis": "*", + "@types/node": "*", "@types/uuid": "*", "@typescript-eslint/eslint-plugin": "^4", "@typescript-eslint/parser": "^4", diff --git a/yarn.lock b/yarn.lock index 6488145..b9c3ae6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2025,9 +2025,9 @@ fs.realpath@^1.0.0: integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.2.0.tgz#4150396a427ecb5baa747725b70270a72b17bc17" - integrity sha512-pKnaUh2TNvk+/egJdBw1h46LwyLx8BzEq+MGCf/RMCVfEHHsGOCWG00dqk91kUPPArIIwMBg9T/virxwzP03cA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.2.1.tgz#1fb02ded2036a8ac288d507a65962bd87b97628d" + integrity sha512-bTLYHSeC0UH/EFXS9KqWnXuOl/wHK5Z/d+ghd5AsFMYN7wIGkUCOJyzy88+wJKkZPGON8u4Z9f6U4FdgURE9qA== function-bind@^1.1.1: version "1.1.1" @@ -2404,9 +2404,9 @@ is-ci@^2.0.0: ci-info "^2.0.0" is-core-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.0.0.tgz#58531b70aed1db7c0e8d4eb1a0a2d1ddd64bd12d" - integrity sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946" + integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA== dependencies: has "^1.0.3" From 2f6690d4eb04068c750b0232c537e38abe24dcc8 Mon Sep 17 00:00:00 2001 From: Stanislav V Vyaliy Date: Fri, 6 Nov 2020 12:46:33 +0300 Subject: [PATCH 16/19] Redis -> Cluster --- dist/cluster-core.module.js | 1 + dist/cluster-core.module.js.map | 1 + dist/cluster.constants.js | 1 + dist/cluster.constants.js.map | 1 + dist/cluster.interface.d.ts | 4 +-- dist/cluster.interface.js | 1 + dist/cluster.interface.js.map | 1 + dist/cluster.module.js | 1 + dist/cluster.module.js.map | 1 + dist/cluster.provider.d.ts | 4 +-- dist/cluster.provider.js | 53 +++++++++--------------------- dist/cluster.provider.js.map | 1 + dist/cluster.service.d.ts | 6 ++-- dist/cluster.service.js | 1 + dist/cluster.service.js.map | 1 + dist/index.js | 19 +++++++++++ dist/index.js.map | 2 +- dist/redis-client.provider.js.map | 1 - dist/redis-core.module.js.map | 2 +- dist/redis.interface.d.ts | 2 +- dist/redis.provider.js | 54 +++++++++++++++++++++++++++++++ dist/redis.provider.js.map | 1 + dist/redis.service.d.ts | 8 +++++ dist/redis.service.js | 12 +++---- dist/redis.service.js.map | 2 +- lib/cluster-core.module.ts | 4 +-- lib/cluster.interface.ts | 4 +-- lib/cluster.provider.ts | 10 +++--- lib/cluster.service.ts | 6 ++-- lib/redis.provider.ts | 4 +-- lib/redis.service.ts | 2 +- 31 files changed, 141 insertions(+), 70 deletions(-) create mode 100644 dist/cluster-core.module.js.map create mode 100644 dist/cluster.constants.js.map create mode 100644 dist/cluster.interface.js.map create mode 100644 dist/cluster.module.js.map create mode 100644 dist/cluster.provider.js.map create mode 100644 dist/cluster.service.js.map create mode 100644 dist/index.js delete mode 100644 dist/redis-client.provider.js.map create mode 100644 dist/redis.provider.js create mode 100644 dist/redis.provider.js.map create mode 100644 dist/redis.service.d.ts diff --git a/dist/cluster-core.module.js b/dist/cluster-core.module.js index 08dcb5c..799bdd1 100644 --- a/dist/cluster-core.module.js +++ b/dist/cluster-core.module.js @@ -70,3 +70,4 @@ ClusterCoreModule = ClusterCoreModule_1 = __decorate([ __metadata("design:paramtypes", [Object, core_1.ModuleRef]) ], ClusterCoreModule); exports.ClusterCoreModule = ClusterCoreModule; +//# sourceMappingURL=cluster-core.module.js.map \ No newline at end of file diff --git a/dist/cluster-core.module.js.map b/dist/cluster-core.module.js.map new file mode 100644 index 0000000..b97821d --- /dev/null +++ b/dist/cluster-core.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"cluster-core.module.js","sourceRoot":"","sources":["../lib/cluster-core.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAMwB;AACxB,uCAAyC;AAMzC,yDAI4B;AAE5B,2DAG6B;AAC7B,uDAAwD;AAOxD,IAAa,iBAAiB,yBAA9B,MAAa,iBAAiB;IAC5B,YAEmB,OAEc,EACd,SAAoB;QAHpB,YAAO,GAAP,OAAO,CAEO;QACd,cAAS,GAAT,SAAS,CAAW;IACpC,CAAC;IAEJ,MAAM,CAAC,QAAQ,CACb,OAAgE;QAEhE,OAAO;YACL,MAAM,EAAE,mBAAiB;YACzB,SAAS,EAAE;gBACT,gCAAa,EAAE;gBACf,EAAE,OAAO,EAAE,gDAA4B,EAAE,QAAQ,EAAE,OAAO,EAAE;aAC7D;YACD,OAAO,EAAE,CAAC,qCAAmB,CAAC;SAC/B,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAuC;QACzD,OAAO;YACL,MAAM,EAAE,mBAAiB;YACzB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,CAAC,gCAAa,EAAE,EAAE,4CAAyB,CAAC,OAAO,CAAC,CAAC;YAChE,OAAO,EAAE,CAAC,qCAAmB,CAAC;SAC/B,CAAC;IACJ,CAAC;IAED,eAAe;QACb,MAAM,eAAe,GAAG,CAAC,EACvB,QAAQ,EACR,UAAU,GACW,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE;YACpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;YACxC,MAAM,OAAO,GAAY,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAE5C,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;gBACjC,OAAO,CAAC,UAAU,EAAE,CAAC;aACtB;QACH,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAuB,iCAAa,CAAC,CAAC;QACzE,MAAM,sBAAsB,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAEzD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YAC/B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;SAC9C;aAAM;YACL,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACtC;IACH,CAAC;CACF,CAAA;AArDY,iBAAiB;IAL7B,eAAM,EAAE;IACR,eAAM,CAAC;QACN,SAAS,EAAE,CAAC,qCAAmB,CAAC;QAChC,OAAO,EAAE,CAAC,qCAAmB,CAAC;KAC/B,CAAC;IAGG,WAAA,eAAM,CAAC,gDAA4B,CAAC,CAAA;6CAIT,gBAAS;GAN5B,iBAAiB,CAqD7B;AArDY,8CAAiB"} \ No newline at end of file diff --git a/dist/cluster.constants.js b/dist/cluster.constants.js index 4d1742f..706f6be 100644 --- a/dist/cluster.constants.js +++ b/dist/cluster.constants.js @@ -3,3 +3,4 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.REDIS_CLUSTER = exports.REDIS_CLUSTER_MODULE_OPTIONS = void 0; exports.REDIS_CLUSTER_MODULE_OPTIONS = Symbol('REDIS_CLUSTER_MODULE_OPTIONS'); exports.REDIS_CLUSTER = Symbol('REDIS_CLUSTER'); +//# sourceMappingURL=cluster.constants.js.map \ No newline at end of file diff --git a/dist/cluster.constants.js.map b/dist/cluster.constants.js.map new file mode 100644 index 0000000..1b0d931 --- /dev/null +++ b/dist/cluster.constants.js.map @@ -0,0 +1 @@ +{"version":3,"file":"cluster.constants.js","sourceRoot":"","sources":["../lib/cluster.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,4BAA4B,GAAG,MAAM,CAChD,8BAA8B,CAC/B,CAAC;AACW,QAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC"} \ No newline at end of file diff --git a/dist/cluster.interface.d.ts b/dist/cluster.interface.d.ts index bbc648f..159ece3 100644 --- a/dist/cluster.interface.d.ts +++ b/dist/cluster.interface.d.ts @@ -1,9 +1,9 @@ import { ModuleMetadata } from '@nestjs/common/interfaces'; -import { Redis, ClusterOptions } from 'ioredis'; +import { Cluster, ClusterOptions } from 'ioredis'; export interface RedisClusterModuleOptions extends ClusterOptions { name?: string; nodes: (string | number | object)[]; - onClusterReady?(cluster: Redis): Promise; + onClusterReady?(cluster: Cluster): Promise; } export interface RedisClusterModuleAsyncOptions extends Pick { useFactory?: (...args: any[]) => RedisClusterModuleOptions | RedisClusterModuleOptions[] | Promise | Promise; diff --git a/dist/cluster.interface.js b/dist/cluster.interface.js index c8ad2e5..c4f41dc 100644 --- a/dist/cluster.interface.js +++ b/dist/cluster.interface.js @@ -1,2 +1,3 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=cluster.interface.js.map \ No newline at end of file diff --git a/dist/cluster.interface.js.map b/dist/cluster.interface.js.map new file mode 100644 index 0000000..f4d916c --- /dev/null +++ b/dist/cluster.interface.js.map @@ -0,0 +1 @@ +{"version":3,"file":"cluster.interface.js","sourceRoot":"","sources":["../lib/cluster.interface.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/dist/cluster.module.js b/dist/cluster.module.js index 2ac89ae..8005be0 100644 --- a/dist/cluster.module.js +++ b/dist/cluster.module.js @@ -28,3 +28,4 @@ RedisClusterModule = RedisClusterModule_1 = __decorate([ common_1.Module({}) ], RedisClusterModule); exports.RedisClusterModule = RedisClusterModule; +//# sourceMappingURL=cluster.module.js.map \ No newline at end of file diff --git a/dist/cluster.module.js.map b/dist/cluster.module.js.map new file mode 100644 index 0000000..87309f8 --- /dev/null +++ b/dist/cluster.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"cluster.module.js","sourceRoot":"","sources":["../lib/cluster.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AAMvD,+DAA0D;AAG1D,IAAa,kBAAkB,0BAA/B,MAAa,kBAAkB;IAC7B,MAAM,CAAC,QAAQ,CACb,OAAgE;QAEhE,OAAO;YACL,MAAM,EAAE,oBAAkB;YAC1B,OAAO,EAAE,CAAC,uCAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SAC/C,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAuC;QACzD,OAAO;YACL,MAAM,EAAE,oBAAkB;YAC1B,OAAO,EAAE,CAAC,uCAAiB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;SACnD,CAAC;IACJ,CAAC;CACF,CAAA;AAhBY,kBAAkB;IAD9B,eAAM,CAAC,EAAE,CAAC;GACE,kBAAkB,CAgB9B;AAhBY,gDAAkB"} \ No newline at end of file diff --git a/dist/cluster.provider.d.ts b/dist/cluster.provider.d.ts index 46a31a7..47bcee3 100644 --- a/dist/cluster.provider.d.ts +++ b/dist/cluster.provider.d.ts @@ -1,11 +1,11 @@ -import { Redis } from 'ioredis'; +import { Cluster } from 'ioredis'; import { Provider } from '@nestjs/common'; import { RedisClusterModuleAsyncOptions, RedisClusterModuleOptions } from './cluster.interface'; export declare class RedisClusterError extends Error { } export interface RedisClusterProvider { defaultKey: string; - clusters: Map; + clusters: Map; size: number; } export declare const createCluster: () => Provider; diff --git a/dist/cluster.provider.js b/dist/cluster.provider.js index 7b0c4b0..9567140 100644 --- a/dist/cluster.provider.js +++ b/dist/cluster.provider.js @@ -1,68 +1,46 @@ "use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __rest = (this && this.__rest) || function (s, e) { - var t = {}; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { - if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) - t[p[i]] = s[p[i]]; - } - return t; -}; Object.defineProperty(exports, "__esModule", { value: true }); exports.createAsyncClusterOptions = exports.createCluster = exports.RedisClusterError = void 0; const ioredis_1 = require("ioredis"); -const uuid = require("uuid"); +const uuid_1 = require("uuid"); const cluster_constants_1 = require("./cluster.constants"); class RedisClusterError extends Error { } exports.RedisClusterError = RedisClusterError; -function getCluster(options) { - return __awaiter(this, void 0, void 0, function* () { - const { onClusterReady, nodes } = options, opt = __rest(options, ["onClusterReady", "nodes"]); - const cluster = new ioredis_1.Cluster(nodes, opt); - if (onClusterReady) { - onClusterReady(cluster); - } - return cluster; - }); +async function getCluster(options) { + const { onClusterReady, nodes, ...opt } = options; + const cluster = new ioredis_1.Cluster(nodes, opt); + if (onClusterReady) { + onClusterReady(cluster); + } + return cluster; } exports.createCluster = () => ({ provide: cluster_constants_1.REDIS_CLUSTER, - useFactory: (options) => __awaiter(void 0, void 0, void 0, function* () { + useFactory: async (options) => { const clusters = new Map(); - let defaultKey = uuid(); + let defaultKey = uuid_1.v4(); if (Array.isArray(options)) { - yield Promise.all(options.map((o) => __awaiter(void 0, void 0, void 0, function* () { + await Promise.all(options.map(async (o) => { const key = o.name || defaultKey; if (clusters.has(key)) { throw new RedisClusterError(`${o.name || 'default'} cluster already exists`); } - clusters.set(key, yield getCluster(o)); - }))); + clusters.set(key, await getCluster(o)); + })); } else { if (options.name && options.name.length !== 0) { defaultKey = options.name; } - clusters.set(defaultKey, yield getCluster(options)); + clusters.set(defaultKey, await getCluster(options)); } return { defaultKey, clusters, size: clusters.size, }; - }), + }, inject: [cluster_constants_1.REDIS_CLUSTER_MODULE_OPTIONS], }); exports.createAsyncClusterOptions = (options) => ({ @@ -70,3 +48,4 @@ exports.createAsyncClusterOptions = (options) => ({ useFactory: options.useFactory, inject: options.inject, }); +//# sourceMappingURL=cluster.provider.js.map \ No newline at end of file diff --git a/dist/cluster.provider.js.map b/dist/cluster.provider.js.map new file mode 100644 index 0000000..4d380ab --- /dev/null +++ b/dist/cluster.provider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"cluster.provider.js","sourceRoot":"","sources":["../lib/cluster.provider.ts"],"names":[],"mappings":";;;AAAA,qCAAyC;AACzC,+BAAkC;AAGlC,2DAG6B;AAM7B,MAAa,iBAAkB,SAAQ,KAAK;CAAG;AAA/C,8CAA+C;AAO/C,KAAK,UAAU,UAAU,CAAC,OAAkC;IAC1D,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAExC,IAAI,cAAc,EAAE;QAClB,cAAc,CAAC,OAAO,CAAC,CAAC;KACzB;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAEY,QAAA,aAAa,GAAG,GAAa,EAAE,CAAC,CAAC;IAC5C,OAAO,EAAE,iCAAa;IACtB,UAAU,EAAE,KAAK,EACf,OAAgE,EACjC,EAAE;QACjC,MAAM,QAAQ,GAAyB,IAAI,GAAG,EAAmB,CAAC;QAClE,IAAI,UAAU,GAAG,SAAI,EAAE,CAAC;QAExB,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAC1B,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAC,CAAC,EAAC,EAAE;gBACpB,MAAM,GAAG,GAAW,CAAC,CAAC,IAAI,IAAI,UAAU,CAAC;gBACzC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBACrB,MAAM,IAAI,iBAAiB,CACzB,GAAG,CAAC,CAAC,IAAI,IAAI,SAAS,yBAAyB,CAChD,CAAC;iBACH;gBACD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,CAAC,CAAC,CACH,CAAC;SACH;aAAM;YACL,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC7C,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;aAC3B;YACD,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;SACrD;QAED,OAAO;YACL,UAAU;YACV,QAAQ;YACR,IAAI,EAAE,QAAQ,CAAC,IAAI;SACpB,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,CAAC,gDAA4B,CAAC;CACvC,CAAC,CAAC;AAEU,QAAA,yBAAyB,GAAG,CACvC,OAAuC,EACvC,EAAE,CAAC,CAAC;IACJ,OAAO,EAAE,gDAA4B;IACrC,UAAU,EAAE,OAAO,CAAC,UAAU;IAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;CACvB,CAAC,CAAC"} \ No newline at end of file diff --git a/dist/cluster.service.d.ts b/dist/cluster.service.d.ts index df634e4..e53cbfd 100644 --- a/dist/cluster.service.d.ts +++ b/dist/cluster.service.d.ts @@ -1,8 +1,8 @@ -import { Redis } from 'ioredis'; +import { Cluster } from 'ioredis'; import { RedisClusterProvider } from './cluster.provider'; export declare class RedisClusterService { private readonly provider; constructor(provider: RedisClusterProvider); - getCluster(name?: string): Redis; - getClusters(): Map; + getCluster(name?: string): Cluster; + getClusters(): Map; } diff --git a/dist/cluster.service.js b/dist/cluster.service.js index 91719df..833d44b 100644 --- a/dist/cluster.service.js +++ b/dist/cluster.service.js @@ -39,3 +39,4 @@ RedisClusterService = __decorate([ __metadata("design:paramtypes", [Object]) ], RedisClusterService); exports.RedisClusterService = RedisClusterService; +//# sourceMappingURL=cluster.service.js.map \ No newline at end of file diff --git a/dist/cluster.service.js.map b/dist/cluster.service.js.map new file mode 100644 index 0000000..0fa8f67 --- /dev/null +++ b/dist/cluster.service.js.map @@ -0,0 +1 @@ +{"version":3,"file":"cluster.service.js","sourceRoot":"","sources":["../lib/cluster.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,2DAAoD;AAEpD,yDAA6E;AAG7E,IAAa,mBAAmB,GAAhC,MAAa,mBAAmB;IAC9B,YAC0C,QAA8B;QAA9B,aAAQ,GAAR,QAAQ,CAAsB;IACrE,CAAC;IAEJ,UAAU,CAAC,IAAa;QACtB,IAAI,CAAC,IAAI,EAAE;YACT,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;SACjC;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACrC,MAAM,IAAI,oCAAiB,CAAC,WAAW,IAAI,iBAAiB,CAAC,CAAC;SAC/D;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAChC,CAAC;CACF,CAAA;AAnBY,mBAAmB;IAD/B,mBAAU,EAAE;IAGR,WAAA,eAAM,CAAC,iCAAa,CAAC,CAAA;;GAFb,mBAAmB,CAmB/B;AAnBY,kDAAmB"} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..4a73d76 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,19 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +__exportStar(require("./redis.service"), exports); +__exportStar(require("./redis.module"), exports); +__exportStar(require("./redis.interface"), exports); +__exportStar(require("./cluster.service"), exports); +__exportStar(require("./cluster.module"), exports); +__exportStar(require("./cluster.interface"), exports); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map index 54b647b..f72f149 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,kDAAgC;AAChC,iDAA+B;AAC/B,oDAAkC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,kDAAgC;AAChC,iDAA+B;AAC/B,oDAAkC;AAClC,oDAAkC;AAClC,mDAAiC;AACjC,sDAAoC"} \ No newline at end of file diff --git a/dist/redis-client.provider.js.map b/dist/redis-client.provider.js.map deleted file mode 100644 index ba7aac7..0000000 --- a/dist/redis-client.provider.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"redis-client.provider.js","sourceRoot":"","sources":["../lib/redis-client.provider.ts"],"names":[],"mappings":";;;;;;AAAA,sDAA4B;AAC5B,+BAAoC;AAGpC,uDAAuE;AAGvE,MAAa,gBAAiB,SAAQ,KAAK;CAAG;AAA9C,4CAA8C;AAO9C,KAAK,UAAU,SAAS,CAAC,OAA2B;IAClD,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;IAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,iBAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,iBAAK,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,aAAa,EAAE;QACjB,aAAa,CAAC,MAAM,CAAC,CAAA;KACtB;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAEY,QAAA,YAAY,GAAG,GAAa,EAAE,CAAC,CAAC;IAC3C,OAAO,EAAE,8BAAY;IACrB,UAAU,EAAE,KAAK,EAAE,OAAkD,EAAwB,EAAE;QAC7F,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC/C,IAAI,UAAU,GAAG,SAAM,EAAE,CAAC;QAE1B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAC1B,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAC,CAAC,EAAC,EAAE;gBACpB,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,UAAU,CAAC;gBACjC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBACpB,MAAM,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,SAAS,mBAAmB,CAAC,CAAC;iBACvE;gBACD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,CAAC,CAAC,CACH,CAAC;SACH;aAAM;YACL,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC7C,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;aAC3B;YACD,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;SACnD;QAED,OAAO;YACL,UAAU;YACV,OAAO;YACP,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,CAAC,sCAAoB,CAAC;CAC/B,CAAC,CAAC;AAEU,QAAA,wBAAwB,GAAG,CAAC,OAAgC,EAAE,EAAE,CAAC,CAAC;IAC7E,OAAO,EAAE,sCAAoB;IAC7B,UAAU,EAAE,OAAO,CAAC,UAAU;IAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;CACvB,CAAC,CAAC"} \ No newline at end of file diff --git a/dist/redis-core.module.js.map b/dist/redis-core.module.js.map index 76564d6..c5877f6 100644 --- a/dist/redis-core.module.js.map +++ b/dist/redis-core.module.js.map @@ -1 +1 @@ -{"version":3,"file":"redis-core.module.js","sourceRoot":"","sources":["../lib/redis-core.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAMwB;AACxB,uCAAyC;AAEzC,mEAIiC;AAEjC,uDAAuE;AACvE,mDAA+C;AAO/C,IAAa,eAAe,uBAA5B,MAAa,eAAe;IAC1B,YAEmB,OAAkD,EAClD,SAAoB;QADpB,YAAO,GAAP,OAAO,CAA2C;QAClD,cAAS,GAAT,SAAS,CAAW;IACpC,CAAC;IAEJ,MAAM,CAAC,QAAQ,CACb,OAAkD;QAElD,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,SAAS,EAAE;gBACT,oCAAY,EAAE;gBACd,EAAE,OAAO,EAAE,sCAAoB,EAAE,QAAQ,EAAE,OAAO,EAAE;aACrD;YACD,OAAO,EAAE,CAAC,4BAAY,CAAC;SACxB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAgC;QAClD,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,CAAC,oCAAY,EAAE,EAAE,gDAAwB,CAAC,OAAO,CAAC,CAAC;YAC9D,OAAO,EAAE,CAAC,4BAAY,CAAC;SACxB,CAAC;IACJ,CAAC;IAED,eAAe;QACb,MAAM,eAAe,GAAG,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE;YAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;YACxC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEjC,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;gBAChC,MAAM,CAAC,UAAU,EAAE,CAAC;aACrB;QACH,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAc,8BAAY,CAAC,CAAC;QAClE,MAAM,qBAAqB,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QAE3D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YAC/B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;SAC7C;aAAM;YACL,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACrC;IACH,CAAC;CACF,CAAA;AAhDY,eAAe;IAL3B,eAAM,EAAE;IACR,eAAM,CAAC;QACN,SAAS,EAAE,CAAC,4BAAY,CAAC;QACzB,OAAO,EAAE,CAAC,4BAAY,CAAC;KACxB,CAAC;IAGG,WAAA,eAAM,CAAC,sCAAoB,CAAC,CAAA;6CAED,gBAAS;GAJ5B,eAAe,CAgD3B;AAhDY,0CAAe"} \ No newline at end of file +{"version":3,"file":"redis-core.module.js","sourceRoot":"","sources":["../lib/redis-core.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAMwB;AACxB,uCAAyC;AAEzC,qDAI0B;AAE1B,uDAAuE;AACvE,mDAA+C;AAO/C,IAAa,eAAe,uBAA5B,MAAa,eAAe;IAC1B,YAEmB,OAAkD,EAClD,SAAoB;QADpB,YAAO,GAAP,OAAO,CAA2C;QAClD,cAAS,GAAT,SAAS,CAAW;IACpC,CAAC;IAEJ,MAAM,CAAC,QAAQ,CACb,OAAkD;QAElD,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,SAAS,EAAE;gBACT,6BAAY,EAAE;gBACd,EAAE,OAAO,EAAE,sCAAoB,EAAE,QAAQ,EAAE,OAAO,EAAE;aACrD;YACD,OAAO,EAAE,CAAC,4BAAY,CAAC;SACxB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAgC;QAClD,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,CAAC,6BAAY,EAAE,EAAE,yCAAwB,CAAC,OAAO,CAAC,CAAC;YAC9D,OAAO,EAAE,CAAC,4BAAY,CAAC;SACxB,CAAC;IACJ,CAAC;IAED,eAAe;QACb,MAAM,eAAe,GAAG,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE;YAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;YACxC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEjC,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;gBAChC,MAAM,CAAC,UAAU,EAAE,CAAC;aACrB;QACH,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAc,8BAAY,CAAC,CAAC;QAClE,MAAM,qBAAqB,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QAE3D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YAC/B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;SAC7C;aAAM;YACL,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACrC;IACH,CAAC;CACF,CAAA;AAhDY,eAAe;IAL3B,eAAM,EAAE;IACR,eAAM,CAAC;QACN,SAAS,EAAE,CAAC,4BAAY,CAAC;QACzB,OAAO,EAAE,CAAC,4BAAY,CAAC;KACxB,CAAC;IAGG,WAAA,eAAM,CAAC,sCAAoB,CAAC,CAAA;6CAED,gBAAS;GAJ5B,eAAe,CAgD3B;AAhDY,0CAAe"} \ No newline at end of file diff --git a/dist/redis.interface.d.ts b/dist/redis.interface.d.ts index 2d0bbe1..ed33535 100644 --- a/dist/redis.interface.d.ts +++ b/dist/redis.interface.d.ts @@ -1,7 +1,7 @@ import { ModuleMetadata } from '@nestjs/common/interfaces'; import { Redis, RedisOptions } from 'ioredis'; export interface RedisModuleOptions extends RedisOptions { - name?: string; + clientName?: string; url?: string; onClientReady?(client: Redis): Promise; } diff --git a/dist/redis.provider.js b/dist/redis.provider.js new file mode 100644 index 0000000..89287b1 --- /dev/null +++ b/dist/redis.provider.js @@ -0,0 +1,54 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createAsyncClientOptions = exports.createClient = exports.RedisClientError = void 0; +const ioredis_1 = __importDefault(require("ioredis")); +const uuid_1 = require("uuid"); +const redis_constants_1 = require("./redis.constants"); +class RedisClientError extends Error { +} +exports.RedisClientError = RedisClientError; +async function getClient(options) { + const { onClientReady, url, ...opt } = options; + const client = url ? new ioredis_1.default(url) : new ioredis_1.default(opt); + if (onClientReady) { + onClientReady(client); + } + return client; +} +exports.createClient = () => ({ + provide: redis_constants_1.REDIS_CLIENT, + useFactory: async (options) => { + const clients = new Map(); + let defaultKey = uuid_1.v4(); + if (Array.isArray(options)) { + await Promise.all(options.map(async (o) => { + const key = o.clientName || defaultKey; + if (clients.has(key)) { + throw new RedisClientError(`${o.clientName || 'default'} client is exists`); + } + clients.set(key, await getClient(o)); + })); + } + else { + if (options.clientName && options.clientName.length !== 0) { + defaultKey = options.clientName; + } + clients.set(defaultKey, await getClient(options)); + } + return { + defaultKey, + clients, + size: clients.size, + }; + }, + inject: [redis_constants_1.REDIS_MODULE_OPTIONS], +}); +exports.createAsyncClientOptions = (options) => ({ + provide: redis_constants_1.REDIS_MODULE_OPTIONS, + useFactory: options.useFactory, + inject: options.inject, +}); +//# sourceMappingURL=redis.provider.js.map \ No newline at end of file diff --git a/dist/redis.provider.js.map b/dist/redis.provider.js.map new file mode 100644 index 0000000..e5c18d2 --- /dev/null +++ b/dist/redis.provider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"redis.provider.js","sourceRoot":"","sources":["../lib/redis.provider.ts"],"names":[],"mappings":";;;;;;AAAA,sDAA4B;AAC5B,+BAAkC;AAGlC,uDAAuE;AAGvE,MAAa,gBAAiB,SAAQ,KAAK;CAAG;AAA9C,4CAA8C;AAO9C,KAAK,UAAU,SAAS,CAAC,OAA2B;IAClD,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;IAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,iBAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,iBAAK,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,aAAa,EAAE;QACjB,aAAa,CAAC,MAAM,CAAC,CAAA;KACtB;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAEY,QAAA,YAAY,GAAG,GAAa,EAAE,CAAC,CAAC;IAC3C,OAAO,EAAE,8BAAY;IACrB,UAAU,EAAE,KAAK,EAAE,OAAkD,EAAwB,EAAE;QAC7F,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;QAC/C,IAAI,UAAU,GAAG,SAAI,EAAE,CAAC;QAExB,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAC1B,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAC,CAAC,EAAC,EAAE;gBACpB,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,IAAI,UAAU,CAAC;gBACvC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBACpB,MAAM,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC,UAAU,IAAI,SAAS,mBAAmB,CAAC,CAAC;iBAC7E;gBACD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,CAAC,CAAC,CACH,CAAC;SACH;aAAM;YACL,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;gBACzD,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;aACjC;YACD,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;SACnD;QAED,OAAO;YACL,UAAU;YACV,OAAO;YACP,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,CAAC,sCAAoB,CAAC;CAC/B,CAAC,CAAC;AAEU,QAAA,wBAAwB,GAAG,CAAC,OAAgC,EAAE,EAAE,CAAC,CAAC;IAC7E,OAAO,EAAE,sCAAoB;IAC7B,UAAU,EAAE,OAAO,CAAC,UAAU;IAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;CACvB,CAAC,CAAC"} \ No newline at end of file diff --git a/dist/redis.service.d.ts b/dist/redis.service.d.ts new file mode 100644 index 0000000..49e8fad --- /dev/null +++ b/dist/redis.service.d.ts @@ -0,0 +1,8 @@ +import { Redis } from 'ioredis'; +import { RedisClient } from './redis.provider'; +export declare class RedisService { + private readonly redisClient; + constructor(redisClient: RedisClient); + getClient(clientName?: string): Redis; + getClients(): Map; +} diff --git a/dist/redis.service.js b/dist/redis.service.js index 1ceaec7..fa1358d 100644 --- a/dist/redis.service.js +++ b/dist/redis.service.js @@ -20,14 +20,14 @@ let RedisService = class RedisService { constructor(redisClient) { this.redisClient = redisClient; } - getClient(name) { - if (!name) { - name = this.redisClient.defaultKey; + getClient(clientName) { + if (!clientName) { + clientName = this.redisClient.defaultKey; } - if (!this.redisClient.clients.has(name)) { - throw new redis_provider_1.RedisClientError(`client ${name} does not exist`); + if (!this.redisClient.clients.has(clientName)) { + throw new redis_provider_1.RedisClientError(`client ${clientName} does not exist`); } - return this.redisClient.clients.get(name); + return this.redisClient.clients.get(clientName); } getClients() { return this.redisClient.clients; diff --git a/dist/redis.service.js.map b/dist/redis.service.js.map index 364944f..c96f702 100644 --- a/dist/redis.service.js.map +++ b/dist/redis.service.js.map @@ -1 +1 @@ -{"version":3,"file":"redis.service.js","sourceRoot":"","sources":["../lib/redis.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,uDAAiD;AAEjD,mEAAwE;AAGxE,IAAa,YAAY,GAAzB,MAAa,YAAY;IACvB,YACyC,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;IAC9D,CAAC;IAEJ,SAAS,CAAC,IAAa;QACrB,IAAI,CAAC,IAAI,EAAE;YACT,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;SACpC;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACvC,MAAM,IAAI,wCAAgB,CAAC,UAAU,IAAI,iBAAiB,CAAC,CAAC;SAC7D;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;IAClC,CAAC;CACF,CAAA;AAlBY,YAAY;IADxB,mBAAU,EAAE;IAGR,WAAA,eAAM,CAAC,8BAAY,CAAC,CAAA;;GAFZ,YAAY,CAkBxB;AAlBY,oCAAY"} \ No newline at end of file +{"version":3,"file":"redis.service.js","sourceRoot":"","sources":["../lib/redis.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,uDAAiD;AAEjD,qDAAiE;AAGjE,IAAa,YAAY,GAAzB,MAAa,YAAY;IACvB,YACyC,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;IAC9D,CAAC;IAEJ,SAAS,CAAC,UAAmB;QAC3B,IAAI,CAAC,UAAU,EAAE;YACf,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;SAC1C;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;YAC7C,MAAM,IAAI,iCAAgB,CAAC,UAAU,UAAU,iBAAiB,CAAC,CAAC;SACnE;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;IAClC,CAAC;CACF,CAAA;AAlBY,YAAY;IADxB,mBAAU,EAAE;IAGR,WAAA,eAAM,CAAC,8BAAY,CAAC,CAAA;;GAFZ,YAAY,CAkBxB;AAlBY,oCAAY"} \ No newline at end of file diff --git a/lib/cluster-core.module.ts b/lib/cluster-core.module.ts index 9b64a12..a72b33a 100644 --- a/lib/cluster-core.module.ts +++ b/lib/cluster-core.module.ts @@ -6,7 +6,7 @@ import { OnModuleDestroy, } from '@nestjs/common'; import { ModuleRef } from '@nestjs/core'; -import { Redis } from 'ioredis'; +import { Cluster } from 'ioredis'; import { RedisClusterModuleAsyncOptions, RedisClusterModuleOptions, @@ -65,7 +65,7 @@ export class ClusterCoreModule implements OnModuleDestroy { defaultKey, }: RedisClusterProvider) => options => { const name = options.name || defaultKey; - const cluster: Redis = clusters.get(name); + const cluster: Cluster = clusters.get(name); if (cluster && !options.keepAlive) { cluster.disconnect(); diff --git a/lib/cluster.interface.ts b/lib/cluster.interface.ts index 405c665..987da4c 100644 --- a/lib/cluster.interface.ts +++ b/lib/cluster.interface.ts @@ -1,10 +1,10 @@ import { ModuleMetadata } from '@nestjs/common/interfaces'; -import { Redis, ClusterOptions } from 'ioredis'; +import { Cluster, ClusterOptions } from 'ioredis'; export interface RedisClusterModuleOptions extends ClusterOptions { name?: string; nodes: (string | number | object)[]; - onClusterReady?(cluster: Redis): Promise; + onClusterReady?(cluster: Cluster): Promise; } export interface RedisClusterModuleAsyncOptions diff --git a/lib/cluster.provider.ts b/lib/cluster.provider.ts index 6941db0..c63b13d 100644 --- a/lib/cluster.provider.ts +++ b/lib/cluster.provider.ts @@ -1,5 +1,5 @@ import { Cluster, Redis } from 'ioredis'; -import * as uuid from 'uuid'; +import { v4 as uuid } from 'uuid'; import { Provider } from '@nestjs/common'; import { @@ -14,13 +14,13 @@ import { export class RedisClusterError extends Error {} export interface RedisClusterProvider { defaultKey: string; - clusters: Map; + clusters: Map; size: number; } -async function getCluster(options: RedisClusterModuleOptions): Promise { +async function getCluster(options: RedisClusterModuleOptions): Promise { const { onClusterReady, nodes, ...opt } = options; - const cluster: Redis = new Cluster(nodes, opt); + const cluster = new Cluster(nodes, opt); if (onClusterReady) { onClusterReady(cluster); @@ -34,7 +34,7 @@ export const createCluster = (): Provider => ({ useFactory: async ( options: RedisClusterModuleOptions | RedisClusterModuleOptions[], ): Promise => { - const clusters: Map = new Map(); + const clusters: Map = new Map(); let defaultKey = uuid(); if (Array.isArray(options)) { diff --git a/lib/cluster.service.ts b/lib/cluster.service.ts index 3361455..9a8e048 100644 --- a/lib/cluster.service.ts +++ b/lib/cluster.service.ts @@ -1,6 +1,6 @@ import { Injectable, Inject } from '@nestjs/common'; import { REDIS_CLUSTER } from './cluster.constants'; -import { Redis } from 'ioredis'; +import { Cluster } from 'ioredis'; import { RedisClusterProvider, RedisClusterError } from './cluster.provider'; @Injectable() @@ -9,7 +9,7 @@ export class RedisClusterService { @Inject(REDIS_CLUSTER) private readonly provider: RedisClusterProvider, ) {} - getCluster(name?: string): Redis { + getCluster(name?: string): Cluster { if (!name) { name = this.provider.defaultKey; } @@ -20,7 +20,7 @@ export class RedisClusterService { return this.provider.clusters.get(name); } - getClusters(): Map { + getClusters(): Map { return this.provider.clusters; } } diff --git a/lib/redis.provider.ts b/lib/redis.provider.ts index c51def2..2e27db9 100644 --- a/lib/redis.provider.ts +++ b/lib/redis.provider.ts @@ -1,5 +1,5 @@ import Redis from 'ioredis'; -import { v4 as uuidv4 } from 'uuid'; +import { v4 as uuid } from 'uuid'; import { Provider } from '@nestjs/common'; import { REDIS_CLIENT, REDIS_MODULE_OPTIONS } from './redis.constants'; @@ -25,7 +25,7 @@ export const createClient = (): Provider => ({ provide: REDIS_CLIENT, useFactory: async (options: RedisModuleOptions | RedisModuleOptions[]): Promise => { const clients = new Map(); - let defaultKey = uuidv4(); + let defaultKey = uuid(); if (Array.isArray(options)) { await Promise.all( diff --git a/lib/redis.service.ts b/lib/redis.service.ts index 4a708f7..7988bd9 100644 --- a/lib/redis.service.ts +++ b/lib/redis.service.ts @@ -1,7 +1,7 @@ import { Injectable, Inject } from '@nestjs/common'; import { REDIS_CLIENT } from './redis.constants'; import { Redis } from 'ioredis'; -import { RedisClient, RedisClientError } from './redis-client.provider'; +import { RedisClient, RedisClientError } from './redis.provider'; @Injectable() export class RedisService { From d9164b0bfb1012a5ca91d26dcd08e90ed5f634e5 Mon Sep 17 00:00:00 2001 From: Stanislav V Vyaliy Date: Fri, 6 Nov 2020 12:54:56 +0300 Subject: [PATCH 17/19] README --- README.md | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..632465c --- /dev/null +++ b/README.md @@ -0,0 +1,219 @@ +# Nestjs Redis + +Redis component for NestJs. + +### Installation + +**Yarn** + +```bash +yarn add nestjs-redis +``` + +**NPM** + +```bash +npm install nestjs-redis --save +``` + +### Getting Started + +Let's register the RedisModule in `app.module.ts` + +```typescript +import { Module } from '@nestjs/common'; +import { RedisModule } from 'nestjs-redis'; + +@Module({ + imports: [RedisModule.register(options)], +}) +export class AppModule {} +``` + +With Async + +```typescript +import { Module } from '@nestjs/common'; +import { RedisModule } from 'nestjs-redis'; + +@Module({ + imports: [ + RedisModule.forRootAsync({ + useFactory: (configService: ConfigService) => configService.get('redis'), // or use async method + //useFactory: async (configService: ConfigService) => configService.get('redis'), + inject: [ConfigService], + }), + ], +}) +export class AppModule {} +``` + +And the config file look like this +With single client + +```typescript +export default { + host: process.env.REDIS_HOST, + port: parseInt(process.env.REDIS_PORT), + db: parseInt(process.env.REDIS_DB), + password: process.env.REDIS_PASSWORD, + keyPrefix: process.env.REDIS_PREFIX, +}; +Or; +export default { + url: 'redis://:authpassword@127.0.0.1:6380/4', +}; +``` + +With custom error handler + +```typescript +export default { + url: 'redis://:authpassword@127.0.0.1:6380/4', + onClientReady: (client) => { + client.on('error', (err) => {}); + }, +}; +``` + +With multi client + +```typescript +export default [ + { + clientName: 'test1', + url: 'redis://:authpassword@127.0.0.1:6380/4', + }, + { + clientName: 'test2', + host: process.env.REDIS_HOST, + port: parseInt(process.env.REDIS_PORT), + db: parseInt(process.env.REDIS_DB), + password: process.env.REDIS_PASSWORD, + keyPrefix: process.env.REDIS_PRIFIX, + }, +]; +``` + +And use in your service + +```typescript +import { Injectable } from '@nestjs/common'; +import { RedisService } from 'nestjs-redis'; + +@Injectable() +export class TestService { + constructor(private readonly redisService: RedisService) {} + async root(): Promise { + const client = await this.redisService.getClient('test'); + return true; + } +} +``` + +Options + +```typescript +interface RedisOptions { + /** + * client name. default is a uuid, unique. + */ + clientName?: string; + url?: string; + port?: number; + host?: string; + /** + * 4 (IPv4) or 6 (IPv6), Defaults to 4. + */ + family?: number; + /** + * Local domain socket path. If set the port, host and family will be ignored. + */ + path?: string; + /** + * TCP KeepAlive on the socket with a X ms delay before start. Set to a non-number value to disable keepAlive. + */ + keepAlive?: number; + connectionName?: string; + /** + * If set, client will send AUTH command with the value of this option when connected. + */ + password?: string; + /** + * Database index to use. + */ + db?: number; + /** + * When a connection is established to the Redis server, the server might still be loading + * the database from disk. While loading, the server not respond to any commands. + * To work around this, when this option is true, ioredis will check the status of the Redis server, + * and when the Redis server is able to process commands, a ready event will be emitted. + */ + enableReadyCheck?: boolean; + keyPrefix?: string; + /** + * When the return value isn't a number, ioredis will stop trying to reconnect. + * Fixed in: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/15858 + */ + retryStrategy?(times: number): number | false; + /** + * By default, all pending commands will be flushed with an error every + * 20 retry attempts. That makes sure commands won't wait forever when + * the connection is down. You can change this behavior by setting + * `maxRetriesPerRequest`. + * + * Set maxRetriesPerRequest to `null` to disable this behavior, and + * every command will wait forever until the connection is alive again + * (which is the default behavior before ioredis v4). + */ + maxRetriesPerRequest?: number | null; + /** + * 1/true means reconnect, 2 means reconnect and resend failed command. Returning false will ignore + * the error and do nothing. + */ + reconnectOnError?(error: Error): boolean | 1 | 2; + /** + * By default, if there is no active connection to the Redis server, commands are added to a queue + * and are executed once the connection is "ready" (when enableReadyCheck is true, "ready" means + * the Redis server has loaded the database from disk, otherwise means the connection to the Redis + * server has been established). If this option is false, when execute the command when the connection + * isn't ready, an error will be returned. + */ + enableOfflineQueue?: boolean; + /** + * The milliseconds before a timeout occurs during the initial connection to the Redis server. + * default: 10000. + */ + connectTimeout?: number; + /** + * After reconnected, if the previous connection was in the subscriber mode, client will auto re-subscribe these channels. + * default: true. + */ + autoResubscribe?: boolean; + /** + * If true, client will resend unfulfilled commands(e.g. block commands) in the previous connection when reconnected. + * default: true. + */ + autoResendUnfulfilledCommands?: boolean; + lazyConnect?: boolean; + tls?: tls.ConnectionOptions; + sentinels?: Array<{ host: string; port: number }>; + name?: string; + /** + * Enable READONLY mode for the connection. Only available for cluster mode. + * default: false. + */ + readOnly?: boolean; + /** + * If you are using the hiredis parser, it's highly recommended to enable this option. + * Create another instance with dropBufferSupport disabled for other commands that you want to return binary instead of string + */ + dropBufferSupport?: boolean; + /** + * Whether to show a friendly error stack. Will decrease the performance significantly. + */ + showFriendlyErrorStack?: boolean; +} +``` + +That's it! From af25749f532bf3f0f05b34c5a9d332f3e7e19898 Mon Sep 17 00:00:00 2001 From: Stanislav V Vyaliy Date: Fri, 6 Nov 2020 13:11:28 +0300 Subject: [PATCH 18/19] reformat --- dist/cluster-core.module.d.ts | 2 +- dist/cluster-core.module.js.map | 2 +- dist/cluster.interface.d.ts | 6 +++--- dist/cluster.module.d.ts | 2 +- dist/cluster.provider.d.ts | 4 ++-- dist/cluster.provider.js | 10 +++++----- dist/cluster.provider.js.map | 2 +- dist/cluster.service.d.ts | 2 +- dist/cluster.service.js | 12 ++++++------ dist/cluster.service.js.map | 2 +- dist/redis-core.module.d.ts | 2 +- dist/redis-core.module.js | 2 +- dist/redis-core.module.js.map | 2 +- dist/redis.interface.d.ts | 4 ++-- dist/redis.module.d.ts | 2 +- dist/redis.module.js.map | 2 +- dist/redis.service.d.ts | 2 +- dist/redis.service.js.map | 2 +- lib/cluster-core.module.ts | 6 +++--- lib/cluster.interface.ts | 6 +++--- lib/cluster.module.ts | 4 ++-- lib/cluster.provider.ts | 18 +++++++++--------- lib/cluster.service.ts | 12 ++++++------ lib/redis-core.module.ts | 6 +++--- lib/redis.interface.ts | 4 ++-- lib/redis.module.ts | 2 +- lib/redis.service.ts | 3 ++- 27 files changed, 62 insertions(+), 61 deletions(-) diff --git a/dist/cluster-core.module.d.ts b/dist/cluster-core.module.d.ts index dd32474..2d511ba 100644 --- a/dist/cluster-core.module.d.ts +++ b/dist/cluster-core.module.d.ts @@ -1,6 +1,6 @@ import { DynamicModule, OnModuleDestroy } from '@nestjs/common'; import { ModuleRef } from '@nestjs/core'; -import { RedisClusterModuleAsyncOptions, RedisClusterModuleOptions } from './cluster.interface'; +import type { RedisClusterModuleAsyncOptions, RedisClusterModuleOptions } from './cluster.interface'; export declare class ClusterCoreModule implements OnModuleDestroy { private readonly options; private readonly moduleRef; diff --git a/dist/cluster-core.module.js.map b/dist/cluster-core.module.js.map index b97821d..65056cc 100644 --- a/dist/cluster-core.module.js.map +++ b/dist/cluster-core.module.js.map @@ -1 +1 @@ -{"version":3,"file":"cluster-core.module.js","sourceRoot":"","sources":["../lib/cluster-core.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAMwB;AACxB,uCAAyC;AAMzC,yDAI4B;AAE5B,2DAG6B;AAC7B,uDAAwD;AAOxD,IAAa,iBAAiB,yBAA9B,MAAa,iBAAiB;IAC5B,YAEmB,OAEc,EACd,SAAoB;QAHpB,YAAO,GAAP,OAAO,CAEO;QACd,cAAS,GAAT,SAAS,CAAW;IACpC,CAAC;IAEJ,MAAM,CAAC,QAAQ,CACb,OAAgE;QAEhE,OAAO;YACL,MAAM,EAAE,mBAAiB;YACzB,SAAS,EAAE;gBACT,gCAAa,EAAE;gBACf,EAAE,OAAO,EAAE,gDAA4B,EAAE,QAAQ,EAAE,OAAO,EAAE;aAC7D;YACD,OAAO,EAAE,CAAC,qCAAmB,CAAC;SAC/B,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAuC;QACzD,OAAO;YACL,MAAM,EAAE,mBAAiB;YACzB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,CAAC,gCAAa,EAAE,EAAE,4CAAyB,CAAC,OAAO,CAAC,CAAC;YAChE,OAAO,EAAE,CAAC,qCAAmB,CAAC;SAC/B,CAAC;IACJ,CAAC;IAED,eAAe;QACb,MAAM,eAAe,GAAG,CAAC,EACvB,QAAQ,EACR,UAAU,GACW,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE;YACpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;YACxC,MAAM,OAAO,GAAY,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAE5C,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;gBACjC,OAAO,CAAC,UAAU,EAAE,CAAC;aACtB;QACH,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAuB,iCAAa,CAAC,CAAC;QACzE,MAAM,sBAAsB,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAEzD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YAC/B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;SAC9C;aAAM;YACL,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACtC;IACH,CAAC;CACF,CAAA;AArDY,iBAAiB;IAL7B,eAAM,EAAE;IACR,eAAM,CAAC;QACN,SAAS,EAAE,CAAC,qCAAmB,CAAC;QAChC,OAAO,EAAE,CAAC,qCAAmB,CAAC;KAC/B,CAAC;IAGG,WAAA,eAAM,CAAC,gDAA4B,CAAC,CAAA;6CAIT,gBAAS;GAN5B,iBAAiB,CAqD7B;AArDY,8CAAiB"} \ No newline at end of file +{"version":3,"file":"cluster-core.module.js","sourceRoot":"","sources":["../lib/cluster-core.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,2CAMwB;AACxB,uCAAyC;AAMzC,yDAI4B;AAC5B,2DAG6B;AAC7B,uDAAwD;AAOxD,IAAa,iBAAiB,yBAA9B,MAAa,iBAAiB;IAC5B,YAEmB,OAEc,EACd,SAAoB;QAHpB,YAAO,GAAP,OAAO,CAEO;QACd,cAAS,GAAT,SAAS,CAAW;IACpC,CAAC;IAEJ,MAAM,CAAC,QAAQ,CACb,OAAgE;QAEhE,OAAO;YACL,MAAM,EAAE,mBAAiB;YACzB,SAAS,EAAE;gBACT,gCAAa,EAAE;gBACf,EAAE,OAAO,EAAE,gDAA4B,EAAE,QAAQ,EAAE,OAAO,EAAE;aAC7D;YACD,OAAO,EAAE,CAAC,qCAAmB,CAAC;SAC/B,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAuC;QACzD,OAAO;YACL,MAAM,EAAE,mBAAiB;YACzB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,CAAC,gCAAa,EAAE,EAAE,4CAAyB,CAAC,OAAO,CAAC,CAAC;YAChE,OAAO,EAAE,CAAC,qCAAmB,CAAC;SAC/B,CAAC;IACJ,CAAC;IAED,eAAe;QACb,MAAM,eAAe,GAAG,CAAC,EACvB,QAAQ,EACR,UAAU,GACW,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE;YACpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;YACxC,MAAM,OAAO,GAAY,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAE5C,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;gBACjC,OAAO,CAAC,UAAU,EAAE,CAAC;aACtB;QACH,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAuB,iCAAa,CAAC,CAAC;QACzE,MAAM,sBAAsB,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAEzD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YAC/B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;SAC9C;aAAM;YACL,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACtC;IACH,CAAC;CACF,CAAA;AArDY,iBAAiB;IAL7B,eAAM,EAAE;IACR,eAAM,CAAC;QACN,SAAS,EAAE,CAAC,qCAAmB,CAAC;QAChC,OAAO,EAAE,CAAC,qCAAmB,CAAC;KAC/B,CAAC;IAGG,WAAA,eAAM,CAAC,gDAA4B,CAAC,CAAA;6CAIT,gBAAS;GAN5B,iBAAiB,CAqD7B;AArDY,8CAAiB"} \ No newline at end of file diff --git a/dist/cluster.interface.d.ts b/dist/cluster.interface.d.ts index 159ece3..192681c 100644 --- a/dist/cluster.interface.d.ts +++ b/dist/cluster.interface.d.ts @@ -1,7 +1,7 @@ -import { ModuleMetadata } from '@nestjs/common/interfaces'; -import { Cluster, ClusterOptions } from 'ioredis'; +import type { ModuleMetadata } from '@nestjs/common/interfaces'; +import type { Cluster, ClusterOptions } from 'ioredis'; export interface RedisClusterModuleOptions extends ClusterOptions { - name?: string; + clientName?: string; nodes: (string | number | object)[]; onClusterReady?(cluster: Cluster): Promise; } diff --git a/dist/cluster.module.d.ts b/dist/cluster.module.d.ts index dbeec69..3feff9e 100644 --- a/dist/cluster.module.d.ts +++ b/dist/cluster.module.d.ts @@ -1,5 +1,5 @@ import { DynamicModule } from '@nestjs/common'; -import { RedisClusterModuleAsyncOptions, RedisClusterModuleOptions } from './cluster.interface'; +import type { RedisClusterModuleAsyncOptions, RedisClusterModuleOptions } from './cluster.interface'; export declare class RedisClusterModule { static register(options: RedisClusterModuleOptions | RedisClusterModuleOptions[]): DynamicModule; static forRootAsync(options: RedisClusterModuleAsyncOptions): DynamicModule; diff --git a/dist/cluster.provider.d.ts b/dist/cluster.provider.d.ts index 47bcee3..855518b 100644 --- a/dist/cluster.provider.d.ts +++ b/dist/cluster.provider.d.ts @@ -1,6 +1,6 @@ -import { Cluster } from 'ioredis'; import { Provider } from '@nestjs/common'; -import { RedisClusterModuleAsyncOptions, RedisClusterModuleOptions } from './cluster.interface'; +import { Cluster } from 'ioredis'; +import type { RedisClusterModuleAsyncOptions, RedisClusterModuleOptions } from './cluster.interface'; export declare class RedisClusterError extends Error { } export interface RedisClusterProvider { diff --git a/dist/cluster.provider.js b/dist/cluster.provider.js index 9567140..33896df 100644 --- a/dist/cluster.provider.js +++ b/dist/cluster.provider.js @@ -1,8 +1,8 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createAsyncClusterOptions = exports.createCluster = exports.RedisClusterError = void 0; -const ioredis_1 = require("ioredis"); const uuid_1 = require("uuid"); +const ioredis_1 = require("ioredis"); const cluster_constants_1 = require("./cluster.constants"); class RedisClusterError extends Error { } @@ -22,16 +22,16 @@ exports.createCluster = () => ({ let defaultKey = uuid_1.v4(); if (Array.isArray(options)) { await Promise.all(options.map(async (o) => { - const key = o.name || defaultKey; + const key = o.clientName || defaultKey; if (clusters.has(key)) { - throw new RedisClusterError(`${o.name || 'default'} cluster already exists`); + throw new RedisClusterError(`${o.clientName || 'default'} cluster already exists`); } clusters.set(key, await getCluster(o)); })); } else { - if (options.name && options.name.length !== 0) { - defaultKey = options.name; + if (options.clientName && options.clientName.length !== 0) { + defaultKey = options.clientName; } clusters.set(defaultKey, await getCluster(options)); } diff --git a/dist/cluster.provider.js.map b/dist/cluster.provider.js.map index 4d380ab..691f58f 100644 --- a/dist/cluster.provider.js.map +++ b/dist/cluster.provider.js.map @@ -1 +1 @@ -{"version":3,"file":"cluster.provider.js","sourceRoot":"","sources":["../lib/cluster.provider.ts"],"names":[],"mappings":";;;AAAA,qCAAyC;AACzC,+BAAkC;AAGlC,2DAG6B;AAM7B,MAAa,iBAAkB,SAAQ,KAAK;CAAG;AAA/C,8CAA+C;AAO/C,KAAK,UAAU,UAAU,CAAC,OAAkC;IAC1D,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAExC,IAAI,cAAc,EAAE;QAClB,cAAc,CAAC,OAAO,CAAC,CAAC;KACzB;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAEY,QAAA,aAAa,GAAG,GAAa,EAAE,CAAC,CAAC;IAC5C,OAAO,EAAE,iCAAa;IACtB,UAAU,EAAE,KAAK,EACf,OAAgE,EACjC,EAAE;QACjC,MAAM,QAAQ,GAAyB,IAAI,GAAG,EAAmB,CAAC;QAClE,IAAI,UAAU,GAAG,SAAI,EAAE,CAAC;QAExB,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAC1B,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAC,CAAC,EAAC,EAAE;gBACpB,MAAM,GAAG,GAAW,CAAC,CAAC,IAAI,IAAI,UAAU,CAAC;gBACzC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBACrB,MAAM,IAAI,iBAAiB,CACzB,GAAG,CAAC,CAAC,IAAI,IAAI,SAAS,yBAAyB,CAChD,CAAC;iBACH;gBACD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,CAAC,CAAC,CACH,CAAC;SACH;aAAM;YACL,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC7C,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;aAC3B;YACD,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;SACrD;QAED,OAAO;YACL,UAAU;YACV,QAAQ;YACR,IAAI,EAAE,QAAQ,CAAC,IAAI;SACpB,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,CAAC,gDAA4B,CAAC;CACvC,CAAC,CAAC;AAEU,QAAA,yBAAyB,GAAG,CACvC,OAAuC,EACvC,EAAE,CAAC,CAAC;IACJ,OAAO,EAAE,gDAA4B;IACrC,UAAU,EAAE,OAAO,CAAC,UAAU;IAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;CACvB,CAAC,CAAC"} \ No newline at end of file +{"version":3,"file":"cluster.provider.js","sourceRoot":"","sources":["../lib/cluster.provider.ts"],"names":[],"mappings":";;;AAAA,+BAAkC;AAElC,qCAAkC;AAMlC,2DAG6B;AAE7B,MAAa,iBAAkB,SAAQ,KAAK;CAAG;AAA/C,8CAA+C;AAO/C,KAAK,UAAU,UAAU,CAAC,OAAkC;IAC1D,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAExC,IAAI,cAAc,EAAE;QAClB,cAAc,CAAC,OAAO,CAAC,CAAC;KACzB;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAEY,QAAA,aAAa,GAAG,GAAa,EAAE,CAAC,CAAC;IAC5C,OAAO,EAAE,iCAAa;IACtB,UAAU,EAAE,KAAK,EACf,OAAgE,EACjC,EAAE;QACjC,MAAM,QAAQ,GAAyB,IAAI,GAAG,EAAmB,CAAC;QAClE,IAAI,UAAU,GAAG,SAAI,EAAE,CAAC;QAExB,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAC1B,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAC,CAAC,EAAC,EAAE;gBACpB,MAAM,GAAG,GAAW,CAAC,CAAC,UAAU,IAAI,UAAU,CAAC;gBAC/C,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBACrB,MAAM,IAAI,iBAAiB,CACzB,GAAG,CAAC,CAAC,UAAU,IAAI,SAAS,yBAAyB,CACtD,CAAC;iBACH;gBACD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,CAAC,CAAC,CACH,CAAC;SACH;aAAM;YACL,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;gBACzD,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;aACjC;YACD,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;SACrD;QAED,OAAO;YACL,UAAU;YACV,QAAQ;YACR,IAAI,EAAE,QAAQ,CAAC,IAAI;SACpB,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,CAAC,gDAA4B,CAAC;CACvC,CAAC,CAAC;AAEU,QAAA,yBAAyB,GAAG,CACvC,OAAuC,EACvC,EAAE,CAAC,CAAC;IACJ,OAAO,EAAE,gDAA4B;IACrC,UAAU,EAAE,OAAO,CAAC,UAAU;IAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;CACvB,CAAC,CAAC"} \ No newline at end of file diff --git a/dist/cluster.service.d.ts b/dist/cluster.service.d.ts index e53cbfd..00ca5ef 100644 --- a/dist/cluster.service.d.ts +++ b/dist/cluster.service.d.ts @@ -3,6 +3,6 @@ import { RedisClusterProvider } from './cluster.provider'; export declare class RedisClusterService { private readonly provider; constructor(provider: RedisClusterProvider); - getCluster(name?: string): Cluster; + getCluster(clientName?: string): Cluster; getClusters(): Map; } diff --git a/dist/cluster.service.js b/dist/cluster.service.js index 833d44b..35954e0 100644 --- a/dist/cluster.service.js +++ b/dist/cluster.service.js @@ -20,14 +20,14 @@ let RedisClusterService = class RedisClusterService { constructor(provider) { this.provider = provider; } - getCluster(name) { - if (!name) { - name = this.provider.defaultKey; + getCluster(clientName) { + if (!clientName) { + clientName = this.provider.defaultKey; } - if (!this.provider.clusters.has(name)) { - throw new cluster_provider_1.RedisClusterError(`cluster ${name} does not exist`); + if (!this.provider.clusters.has(clientName)) { + throw new cluster_provider_1.RedisClusterError(`cluster ${clientName} does not exist`); } - return this.provider.clusters.get(name); + return this.provider.clusters.get(clientName); } getClusters() { return this.provider.clusters; diff --git a/dist/cluster.service.js.map b/dist/cluster.service.js.map index 0fa8f67..dbd152d 100644 --- a/dist/cluster.service.js.map +++ b/dist/cluster.service.js.map @@ -1 +1 @@ -{"version":3,"file":"cluster.service.js","sourceRoot":"","sources":["../lib/cluster.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,2DAAoD;AAEpD,yDAA6E;AAG7E,IAAa,mBAAmB,GAAhC,MAAa,mBAAmB;IAC9B,YAC0C,QAA8B;QAA9B,aAAQ,GAAR,QAAQ,CAAsB;IACrE,CAAC;IAEJ,UAAU,CAAC,IAAa;QACtB,IAAI,CAAC,IAAI,EAAE;YACT,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;SACjC;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACrC,MAAM,IAAI,oCAAiB,CAAC,WAAW,IAAI,iBAAiB,CAAC,CAAC;SAC/D;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAChC,CAAC;CACF,CAAA;AAnBY,mBAAmB;IAD/B,mBAAU,EAAE;IAGR,WAAA,eAAM,CAAC,iCAAa,CAAC,CAAA;;GAFb,mBAAmB,CAmB/B;AAnBY,kDAAmB"} \ No newline at end of file +{"version":3,"file":"cluster.service.js","sourceRoot":"","sources":["../lib/cluster.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,2DAAoD;AAEpD,yDAA6E;AAG7E,IAAa,mBAAmB,GAAhC,MAAa,mBAAmB;IAC9B,YAC0C,QAA8B;QAA9B,aAAQ,GAAR,QAAQ,CAAsB;IACrE,CAAC;IAEJ,UAAU,CAAC,UAAmB;QAC5B,IAAI,CAAC,UAAU,EAAE;YACf,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;SACvC;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;YAC3C,MAAM,IAAI,oCAAiB,CAAC,WAAW,UAAU,iBAAiB,CAAC,CAAC;SACrE;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAChC,CAAC;CACF,CAAA;AAnBY,mBAAmB;IAD/B,mBAAU,EAAE;IAGR,WAAA,eAAM,CAAC,iCAAa,CAAC,CAAA;;GAFb,mBAAmB,CAmB/B;AAnBY,kDAAmB"} \ No newline at end of file diff --git a/dist/redis-core.module.d.ts b/dist/redis-core.module.d.ts index 7dae789..1df24c8 100644 --- a/dist/redis-core.module.d.ts +++ b/dist/redis-core.module.d.ts @@ -1,6 +1,6 @@ +import type { RedisModuleAsyncOptions, RedisModuleOptions } from './redis.interface'; import { DynamicModule, OnModuleDestroy } from '@nestjs/common'; import { ModuleRef } from '@nestjs/core'; -import { RedisModuleAsyncOptions, RedisModuleOptions } from './redis.interface'; export declare class RedisCoreModule implements OnModuleDestroy { private readonly options; private readonly moduleRef; diff --git a/dist/redis-core.module.js b/dist/redis-core.module.js index 91c6ee3..6d7691d 100644 --- a/dist/redis-core.module.js +++ b/dist/redis-core.module.js @@ -16,8 +16,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.RedisCoreModule = void 0; const common_1 = require("@nestjs/common"); const core_1 = require("@nestjs/core"); -const redis_provider_1 = require("./redis.provider"); const redis_constants_1 = require("./redis.constants"); +const redis_provider_1 = require("./redis.provider"); const redis_service_1 = require("./redis.service"); let RedisCoreModule = RedisCoreModule_1 = class RedisCoreModule { constructor(options, moduleRef) { diff --git a/dist/redis-core.module.js.map b/dist/redis-core.module.js.map index c5877f6..f0b3d14 100644 --- a/dist/redis-core.module.js.map +++ b/dist/redis-core.module.js.map @@ -1 +1 @@ -{"version":3,"file":"redis-core.module.js","sourceRoot":"","sources":["../lib/redis-core.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAMwB;AACxB,uCAAyC;AAEzC,qDAI0B;AAE1B,uDAAuE;AACvE,mDAA+C;AAO/C,IAAa,eAAe,uBAA5B,MAAa,eAAe;IAC1B,YAEmB,OAAkD,EAClD,SAAoB;QADpB,YAAO,GAAP,OAAO,CAA2C;QAClD,cAAS,GAAT,SAAS,CAAW;IACpC,CAAC;IAEJ,MAAM,CAAC,QAAQ,CACb,OAAkD;QAElD,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,SAAS,EAAE;gBACT,6BAAY,EAAE;gBACd,EAAE,OAAO,EAAE,sCAAoB,EAAE,QAAQ,EAAE,OAAO,EAAE;aACrD;YACD,OAAO,EAAE,CAAC,4BAAY,CAAC;SACxB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAgC;QAClD,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,CAAC,6BAAY,EAAE,EAAE,yCAAwB,CAAC,OAAO,CAAC,CAAC;YAC9D,OAAO,EAAE,CAAC,4BAAY,CAAC;SACxB,CAAC;IACJ,CAAC;IAED,eAAe;QACb,MAAM,eAAe,GAAG,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE;YAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;YACxC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEjC,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;gBAChC,MAAM,CAAC,UAAU,EAAE,CAAC;aACrB;QACH,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAc,8BAAY,CAAC,CAAC;QAClE,MAAM,qBAAqB,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QAE3D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YAC/B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;SAC7C;aAAM;YACL,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACrC;IACH,CAAC;CACF,CAAA;AAhDY,eAAe;IAL3B,eAAM,EAAE;IACR,eAAM,CAAC;QACN,SAAS,EAAE,CAAC,4BAAY,CAAC;QACzB,OAAO,EAAE,CAAC,4BAAY,CAAC;KACxB,CAAC;IAGG,WAAA,eAAM,CAAC,sCAAoB,CAAC,CAAA;6CAED,gBAAS;GAJ5B,eAAe,CAgD3B;AAhDY,0CAAe"} \ No newline at end of file +{"version":3,"file":"redis-core.module.js","sourceRoot":"","sources":["../lib/redis-core.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,2CAMwB;AACxB,uCAAyC;AAEzC,uDAAuE;AACvE,qDAI0B;AAC1B,mDAA+C;AAO/C,IAAa,eAAe,uBAA5B,MAAa,eAAe;IAC1B,YAEmB,OAAkD,EAClD,SAAoB;QADpB,YAAO,GAAP,OAAO,CAA2C;QAClD,cAAS,GAAT,SAAS,CAAW;IACpC,CAAC;IAEJ,MAAM,CAAC,QAAQ,CACb,OAAkD;QAElD,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,SAAS,EAAE;gBACT,6BAAY,EAAE;gBACd,EAAE,OAAO,EAAE,sCAAoB,EAAE,QAAQ,EAAE,OAAO,EAAE;aACrD;YACD,OAAO,EAAE,CAAC,4BAAY,CAAC;SACxB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAgC;QAClD,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,CAAC,6BAAY,EAAE,EAAE,yCAAwB,CAAC,OAAO,CAAC,CAAC;YAC9D,OAAO,EAAE,CAAC,4BAAY,CAAC;SACxB,CAAC;IACJ,CAAC;IAED,eAAe;QACb,MAAM,eAAe,GAAG,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE;YAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,UAAU,CAAC;YACxC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEjC,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;gBAChC,MAAM,CAAC,UAAU,EAAE,CAAC;aACrB;QACH,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAc,8BAAY,CAAC,CAAC;QAClE,MAAM,qBAAqB,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QAE3D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YAC/B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;SAC7C;aAAM;YACL,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACrC;IACH,CAAC;CACF,CAAA;AAhDY,eAAe;IAL3B,eAAM,EAAE;IACR,eAAM,CAAC;QACN,SAAS,EAAE,CAAC,4BAAY,CAAC;QACzB,OAAO,EAAE,CAAC,4BAAY,CAAC;KACxB,CAAC;IAGG,WAAA,eAAM,CAAC,sCAAoB,CAAC,CAAA;6CAED,gBAAS;GAJ5B,eAAe,CAgD3B;AAhDY,0CAAe"} \ No newline at end of file diff --git a/dist/redis.interface.d.ts b/dist/redis.interface.d.ts index ed33535..fbbc05e 100644 --- a/dist/redis.interface.d.ts +++ b/dist/redis.interface.d.ts @@ -1,5 +1,5 @@ -import { ModuleMetadata } from '@nestjs/common/interfaces'; -import { Redis, RedisOptions } from 'ioredis'; +import type { ModuleMetadata } from '@nestjs/common/interfaces'; +import type { Redis, RedisOptions } from 'ioredis'; export interface RedisModuleOptions extends RedisOptions { clientName?: string; url?: string; diff --git a/dist/redis.module.d.ts b/dist/redis.module.d.ts index e44de87..4548f8e 100644 --- a/dist/redis.module.d.ts +++ b/dist/redis.module.d.ts @@ -1,5 +1,5 @@ +import type { RedisModuleAsyncOptions, RedisModuleOptions } from './redis.interface'; import { DynamicModule } from '@nestjs/common'; -import { RedisModuleAsyncOptions, RedisModuleOptions } from './redis.interface'; export declare class RedisModule { static register(options: RedisModuleOptions | RedisModuleOptions[]): DynamicModule; static forRootAsync(options: RedisModuleAsyncOptions): DynamicModule; diff --git a/dist/redis.module.js.map b/dist/redis.module.js.map index 7ee4c4a..1871fe4 100644 --- a/dist/redis.module.js.map +++ b/dist/redis.module.js.map @@ -1 +1 @@ -{"version":3,"file":"redis.module.js","sourceRoot":"","sources":["../lib/redis.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AAGvD,2DAAsD;AAGtD,IAAa,WAAW,mBAAxB,MAAa,WAAW;IACtB,MAAM,CAAC,QAAQ,CACb,OAAkD;QAElD,OAAO;YACL,MAAM,EAAE,aAAW;YACnB,OAAO,EAAE,CAAC,mCAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SAC7C,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAgC;QAClD,OAAO;YACL,MAAM,EAAE,aAAW;YACnB,OAAO,EAAE,CAAC,mCAAe,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;SACjD,CAAC;IACJ,CAAC;CACF,CAAA;AAhBY,WAAW;IADvB,eAAM,CAAC,EAAE,CAAC;GACE,WAAW,CAgBvB;AAhBY,kCAAW"} \ No newline at end of file +{"version":3,"file":"redis.module.js","sourceRoot":"","sources":["../lib/redis.module.ts"],"names":[],"mappings":";;;;;;;;;;AACA,2CAAuD;AAEvD,2DAAsD;AAGtD,IAAa,WAAW,mBAAxB,MAAa,WAAW;IACtB,MAAM,CAAC,QAAQ,CACb,OAAkD;QAElD,OAAO;YACL,MAAM,EAAE,aAAW;YACnB,OAAO,EAAE,CAAC,mCAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SAC7C,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAgC;QAClD,OAAO;YACL,MAAM,EAAE,aAAW;YACnB,OAAO,EAAE,CAAC,mCAAe,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;SACjD,CAAC;IACJ,CAAC;CACF,CAAA;AAhBY,WAAW;IADvB,eAAM,CAAC,EAAE,CAAC;GACE,WAAW,CAgBvB;AAhBY,kCAAW"} \ No newline at end of file diff --git a/dist/redis.service.d.ts b/dist/redis.service.d.ts index 49e8fad..b20f9a8 100644 --- a/dist/redis.service.d.ts +++ b/dist/redis.service.d.ts @@ -1,4 +1,4 @@ -import { Redis } from 'ioredis'; +import type { Redis } from 'ioredis'; import { RedisClient } from './redis.provider'; export declare class RedisService { private readonly redisClient; diff --git a/dist/redis.service.js.map b/dist/redis.service.js.map index c96f702..09efce5 100644 --- a/dist/redis.service.js.map +++ b/dist/redis.service.js.map @@ -1 +1 @@ -{"version":3,"file":"redis.service.js","sourceRoot":"","sources":["../lib/redis.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,uDAAiD;AAEjD,qDAAiE;AAGjE,IAAa,YAAY,GAAzB,MAAa,YAAY;IACvB,YACyC,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;IAC9D,CAAC;IAEJ,SAAS,CAAC,UAAmB;QAC3B,IAAI,CAAC,UAAU,EAAE;YACf,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;SAC1C;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;YAC7C,MAAM,IAAI,iCAAgB,CAAC,UAAU,UAAU,iBAAiB,CAAC,CAAC;SACnE;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;IAClC,CAAC;CACF,CAAA;AAlBY,YAAY;IADxB,mBAAU,EAAE;IAGR,WAAA,eAAM,CAAC,8BAAY,CAAC,CAAA;;GAFZ,YAAY,CAkBxB;AAlBY,oCAAY"} \ No newline at end of file +{"version":3,"file":"redis.service.js","sourceRoot":"","sources":["../lib/redis.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,2CAAoD;AAEpD,uDAAiD;AACjD,qDAAiE;AAGjE,IAAa,YAAY,GAAzB,MAAa,YAAY;IACvB,YACyC,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;IAC9D,CAAC;IAEJ,SAAS,CAAC,UAAmB;QAC3B,IAAI,CAAC,UAAU,EAAE;YACf,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;SAC1C;QACD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;YAC7C,MAAM,IAAI,iCAAgB,CAAC,UAAU,UAAU,iBAAiB,CAAC,CAAC;SACnE;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;IAClC,CAAC;CACF,CAAA;AAlBY,YAAY;IADxB,mBAAU,EAAE;IAGR,WAAA,eAAM,CAAC,8BAAY,CAAC,CAAA;;GAFZ,YAAY,CAkBxB;AAlBY,oCAAY"} \ No newline at end of file diff --git a/lib/cluster-core.module.ts b/lib/cluster-core.module.ts index a72b33a..979fc75 100644 --- a/lib/cluster-core.module.ts +++ b/lib/cluster-core.module.ts @@ -1,3 +1,4 @@ +import type { Cluster } from 'ioredis'; import { DynamicModule, Global, @@ -6,8 +7,8 @@ import { OnModuleDestroy, } from '@nestjs/common'; import { ModuleRef } from '@nestjs/core'; -import { Cluster } from 'ioredis'; -import { + +import type { RedisClusterModuleAsyncOptions, RedisClusterModuleOptions, } from './cluster.interface'; @@ -16,7 +17,6 @@ import { createCluster, RedisClusterProvider, } from './cluster.provider'; - import { REDIS_CLUSTER_MODULE_OPTIONS, REDIS_CLUSTER, diff --git a/lib/cluster.interface.ts b/lib/cluster.interface.ts index 987da4c..dfd5538 100644 --- a/lib/cluster.interface.ts +++ b/lib/cluster.interface.ts @@ -1,8 +1,8 @@ -import { ModuleMetadata } from '@nestjs/common/interfaces'; -import { Cluster, ClusterOptions } from 'ioredis'; +import type { ModuleMetadata } from '@nestjs/common/interfaces'; +import type { Cluster, ClusterOptions } from 'ioredis'; export interface RedisClusterModuleOptions extends ClusterOptions { - name?: string; + clientName?: string; nodes: (string | number | object)[]; onClusterReady?(cluster: Cluster): Promise; } diff --git a/lib/cluster.module.ts b/lib/cluster.module.ts index ad88054..f77702c 100644 --- a/lib/cluster.module.ts +++ b/lib/cluster.module.ts @@ -1,9 +1,9 @@ import { DynamicModule, Module } from '@nestjs/common'; -import { + +import type { RedisClusterModuleAsyncOptions, RedisClusterModuleOptions, } from './cluster.interface'; - import { ClusterCoreModule } from './cluster-core.module'; @Module({}) diff --git a/lib/cluster.provider.ts b/lib/cluster.provider.ts index c63b13d..fef9675 100644 --- a/lib/cluster.provider.ts +++ b/lib/cluster.provider.ts @@ -1,15 +1,15 @@ -import { Cluster, Redis } from 'ioredis'; import { v4 as uuid } from 'uuid'; import { Provider } from '@nestjs/common'; +import { Cluster } from 'ioredis'; +import type { + RedisClusterModuleAsyncOptions, + RedisClusterModuleOptions, +} from './cluster.interface'; import { REDIS_CLUSTER, REDIS_CLUSTER_MODULE_OPTIONS, } from './cluster.constants'; -import { - RedisClusterModuleAsyncOptions, - RedisClusterModuleOptions, -} from './cluster.interface'; export class RedisClusterError extends Error {} export interface RedisClusterProvider { @@ -40,18 +40,18 @@ export const createCluster = (): Provider => ({ if (Array.isArray(options)) { await Promise.all( options.map(async o => { - const key: string = o.name || defaultKey; + const key: string = o.clientName || defaultKey; if (clusters.has(key)) { throw new RedisClusterError( - `${o.name || 'default'} cluster already exists`, + `${o.clientName || 'default'} cluster already exists`, ); } clusters.set(key, await getCluster(o)); }), ); } else { - if (options.name && options.name.length !== 0) { - defaultKey = options.name; + if (options.clientName && options.clientName.length !== 0) { + defaultKey = options.clientName; } clusters.set(defaultKey, await getCluster(options)); } diff --git a/lib/cluster.service.ts b/lib/cluster.service.ts index 9a8e048..1734e36 100644 --- a/lib/cluster.service.ts +++ b/lib/cluster.service.ts @@ -9,15 +9,15 @@ export class RedisClusterService { @Inject(REDIS_CLUSTER) private readonly provider: RedisClusterProvider, ) {} - getCluster(name?: string): Cluster { - if (!name) { - name = this.provider.defaultKey; + getCluster(clientName?: string): Cluster { + if (!clientName) { + clientName = this.provider.defaultKey; } - if (!this.provider.clusters.has(name)) { - throw new RedisClusterError(`cluster ${name} does not exist`); + if (!this.provider.clusters.has(clientName)) { + throw new RedisClusterError(`cluster ${clientName} does not exist`); } - return this.provider.clusters.get(name); + return this.provider.clusters.get(clientName); } getClusters(): Map { diff --git a/lib/redis-core.module.ts b/lib/redis-core.module.ts index fd8ce1c..650b83b 100644 --- a/lib/redis-core.module.ts +++ b/lib/redis-core.module.ts @@ -1,3 +1,4 @@ +import type { RedisModuleAsyncOptions, RedisModuleOptions } from './redis.interface'; import { DynamicModule, Global, @@ -6,14 +7,13 @@ import { OnModuleDestroy, } from '@nestjs/common'; import { ModuleRef } from '@nestjs/core'; -import { RedisModuleAsyncOptions, RedisModuleOptions } from './redis.interface'; + +import { REDIS_MODULE_OPTIONS, REDIS_CLIENT } from './redis.constants'; import { createAsyncClientOptions, createClient, RedisClient, } from './redis.provider'; - -import { REDIS_MODULE_OPTIONS, REDIS_CLIENT } from './redis.constants'; import { RedisService } from './redis.service'; @Global() diff --git a/lib/redis.interface.ts b/lib/redis.interface.ts index f206813..9391746 100644 --- a/lib/redis.interface.ts +++ b/lib/redis.interface.ts @@ -1,5 +1,5 @@ -import { ModuleMetadata } from '@nestjs/common/interfaces'; -import { Redis, RedisOptions } from 'ioredis'; +import type { ModuleMetadata } from '@nestjs/common/interfaces'; +import type { Redis, RedisOptions } from 'ioredis'; export interface RedisModuleOptions extends RedisOptions { clientName?: string; diff --git a/lib/redis.module.ts b/lib/redis.module.ts index c521eda..dc99ae5 100644 --- a/lib/redis.module.ts +++ b/lib/redis.module.ts @@ -1,5 +1,5 @@ +import type { RedisModuleAsyncOptions, RedisModuleOptions } from './redis.interface'; import { DynamicModule, Module } from '@nestjs/common'; -import { RedisModuleAsyncOptions, RedisModuleOptions } from './redis.interface'; import { RedisCoreModule } from './redis-core.module'; diff --git a/lib/redis.service.ts b/lib/redis.service.ts index 7988bd9..4bddcd3 100644 --- a/lib/redis.service.ts +++ b/lib/redis.service.ts @@ -1,6 +1,7 @@ +import type { Redis } from 'ioredis'; import { Injectable, Inject } from '@nestjs/common'; + import { REDIS_CLIENT } from './redis.constants'; -import { Redis } from 'ioredis'; import { RedisClient, RedisClientError } from './redis.provider'; @Injectable() From 98f44cac0926717b745038e165378f48b4800f55 Mon Sep 17 00:00:00 2001 From: Stanislav V Vyaliy Date: Fri, 6 Nov 2020 13:11:35 +0300 Subject: [PATCH 19/19] package version upgrade --- package.json | 2 +- yarn.lock | 4770 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 4771 insertions(+), 1 deletion(-) create mode 100644 yarn.lock diff --git a/package.json b/package.json index 1ed5083..5a8f960 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nestjs-redis", - "version": "1.3.8", + "version": "1.4.1", "description": "a NestJS ioRedis module", "author": "skunight", "license": "MIT", diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..b9c3ae6 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4770 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0", "@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== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/core@^7.1.0", "@babel/core@^7.7.5": + version "7.12.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8" + integrity sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.1" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.1" + "@babel/parser" "^7.12.3" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.12.1", "@babel/generator@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.5.tgz#a2c50de5c8b6d708ab95be5e6053936c1884a4de" + integrity sha512-m16TQQJ8hPt7E+OS/XVQg/7U184MLXtvuGbCdA7na61vha+ImkyyNM/9DDA0unYCVZn3ZOhng+qz48/KBOT96A== + dependencies: + "@babel/types" "^7.12.5" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-function-name@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a" + integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ== + dependencies: + "@babel/helper-get-function-arity" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/helper-get-function-arity@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" + integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-member-expression-to-functions@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz#fba0f2fcff3fba00e6ecb664bb5e6e26e2d6165c" + integrity sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-module-imports@^7.12.1": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" + integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== + dependencies: + "@babel/types" "^7.12.5" + +"@babel/helper-module-transforms@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" + integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== + dependencies: + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-simple-access" "^7.12.1" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/helper-validator-identifier" "^7.10.4" + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + lodash "^4.17.19" + +"@babel/helper-optimise-call-expression@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673" + integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg== + dependencies: + "@babel/types" "^7.10.4" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" + integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== + +"@babel/helper-replace-supers@^7.12.1": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz#f009a17543bbbbce16b06206ae73b63d3fca68d9" + integrity sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.12.1" + "@babel/helper-optimise-call-expression" "^7.10.4" + "@babel/traverse" "^7.12.5" + "@babel/types" "^7.12.5" + +"@babel/helper-simple-access@^7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" + integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA== + dependencies: + "@babel/types" "^7.12.1" + +"@babel/helper-split-export-declaration@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" + integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== + dependencies: + "@babel/types" "^7.11.0" + +"@babel/helper-validator-identifier@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" + integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw== + +"@babel/helpers@^7.12.1": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" + integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== + dependencies: + "@babel/template" "^7.10.4" + "@babel/traverse" "^7.12.5" + "@babel/types" "^7.12.5" + +"@babel/highlight@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143" + integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.12.3", "@babel/parser@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.5.tgz#b4af32ddd473c0bfa643bd7ff0728b8e71b81ea0" + integrity sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ== + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz#bcb297c5366e79bebadef509549cd93b04f19978" + integrity sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz#dd6c0b357ac1bb142d98537450a319625d13d2a0" + integrity sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/template@^7.10.4", "@babel/template@^7.3.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.5.tgz#78a0c68c8e8a35e4cacfd31db8bb303d5606f095" + integrity sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.5" + "@babel/helper-function-name" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/parser" "^7.12.5" + "@babel/types" "^7.12.5" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.19" + +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.12.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.6.tgz#ae0e55ef1cce1fbc881cd26f8234eb3e657edc96" + integrity sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA== + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + lodash "^4.17.19" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@cnakazawa/watch@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" + integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@commitlint/execute-rule@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-11.0.0.tgz#3ed60ab7a33019e58d90e2d891b75d7df77b4b4d" + integrity sha512-g01p1g4BmYlZ2+tdotCavrMunnPFPhTzG1ZiLKTCYrooHRbmvqo42ZZn4QMStUEIcn+jfLb6BRZX3JzIwA1ezQ== + +"@commitlint/load@>6.1.1": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-11.0.0.tgz#f736562f0ffa7e773f8808fea93319042ee18211" + integrity sha512-t5ZBrtgvgCwPfxmG811FCp39/o3SJ7L+SNsxFL92OR4WQxPcu6c8taD0CG2lzOHGuRyuMxZ7ps3EbngT2WpiCg== + dependencies: + "@commitlint/execute-rule" "^11.0.0" + "@commitlint/resolve-extends" "^11.0.0" + "@commitlint/types" "^11.0.0" + chalk "4.1.0" + cosmiconfig "^7.0.0" + lodash "^4.17.19" + resolve-from "^5.0.0" + +"@commitlint/resolve-extends@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-11.0.0.tgz#158ecbe27d4a2a51d426111a01478e216fbb1036" + integrity sha512-WinU6Uv6L7HDGLqn/To13KM1CWvZ09VHZqryqxXa1OY+EvJkfU734CwnOEeNlSCK7FVLrB4kmodLJtL1dkEpXw== + dependencies: + import-fresh "^3.0.0" + lodash "^4.17.19" + resolve-from "^5.0.0" + resolve-global "^1.0.0" + +"@commitlint/types@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-11.0.0.tgz#719cf05fcc1abb6533610a2e0f5dd1e61eac14fe" + integrity sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ== + +"@eslint/eslintrc@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.1.tgz#f72069c330461a06684d119384435e12a5d76e3c" + integrity sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA== + 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" + lodash "^4.17.19" + 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" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" + integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== + +"@jest/console@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" + integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^26.6.2" + jest-util "^26.6.2" + slash "^3.0.0" + +"@jest/core@^26.6.3": + version "26.6.3" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" + integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== + dependencies: + "@jest/console" "^26.6.2" + "@jest/reporters" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-changed-files "^26.6.2" + jest-config "^26.6.3" + jest-haste-map "^26.6.2" + jest-message-util "^26.6.2" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-resolve-dependencies "^26.6.3" + jest-runner "^26.6.3" + jest-runtime "^26.6.3" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + jest-watcher "^26.6.2" + micromatch "^4.0.2" + p-each-series "^2.1.0" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/create-cache-key-function@^26.5.0": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-26.6.2.tgz#04cf439207a4fd12418d8aee551cddc86f9ac5f5" + integrity sha512-LgEuqU1f/7WEIPYqwLPIvvHuc1sB6gMVbT6zWhin3txYUNYK/kGQrC1F2WR4gR34YlI9bBtViTm5z98RqVZAaw== + dependencies: + "@jest/types" "^26.6.2" + +"@jest/environment@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" + integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== + dependencies: + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + +"@jest/fake-timers@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" + integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== + dependencies: + "@jest/types" "^26.6.2" + "@sinonjs/fake-timers" "^6.0.1" + "@types/node" "*" + jest-message-util "^26.6.2" + jest-mock "^26.6.2" + jest-util "^26.6.2" + +"@jest/globals@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" + integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/types" "^26.6.2" + expect "^26.6.2" + +"@jest/reporters@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" + integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.4" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^4.0.3" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + jest-haste-map "^26.6.2" + jest-resolve "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^7.0.0" + optionalDependencies: + node-notifier "^8.0.0" + +"@jest/source-map@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" + integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.4" + source-map "^0.6.0" + +"@jest/test-result@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" + integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== + dependencies: + "@jest/console" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^26.6.3": + version "26.6.3" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" + integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== + dependencies: + "@jest/test-result" "^26.6.2" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-runner "^26.6.3" + jest-runtime "^26.6.3" + +"@jest/transform@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" + integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^26.6.2" + babel-plugin-istanbul "^6.0.0" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.4" + jest-haste-map "^26.6.2" + jest-regex-util "^26.0.0" + jest-util "^26.6.2" + micromatch "^4.0.2" + pirates "^4.0.1" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@nestjs/common@^7": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-7.5.1.tgz#a4bbe1f69f48d0f46839f5e26d9cb244bb4db3bf" + integrity sha512-UKTWa/MFTryRm4L9b+lsKFg+m/B4zDCsx/pQAMZVCYMW4FRg6QH4BIaq5fMz5G2hL5IFlFVoOC/eXJwhGDOrYA== + dependencies: + axios "0.21.0" + iterare "1.2.1" + tslib "2.0.3" + uuid "8.3.1" + +"@nestjs/core@^7": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-7.5.1.tgz#5de809d85fb5d3bbb008fffeb4297c3bb5591aa9" + integrity sha512-aJ1w5tQPkVEmH5QRe1echV5NFWAcHAVQJX/jvfCSK4M5VSkIBN9zreZg8UnYf8sbW5YEaizPts07veeTPsG3FQ== + dependencies: + "@nuxtjs/opencollective" "0.2.2" + fast-safe-stringify "2.0.7" + iterare "1.2.1" + object-hash "2.0.3" + path-to-regexp "3.2.0" + tslib "2.0.3" + uuid "8.3.1" + +"@nestjs/testing@^7": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@nestjs/testing/-/testing-7.5.1.tgz#8e537852512a2bfc5824b846aafc649b63a8d48e" + integrity sha512-ISuDhySnD+pjEEFGhRhtN/R/yWRvlWGsMHz7VQ8Q43feSoVPNzKeJr9Jz2lukSH1pSQHsFliHbs7mKOaDP7pSQ== + dependencies: + optional "0.1.4" + tslib "2.0.3" + +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + +"@nuxtjs/opencollective@0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@nuxtjs/opencollective/-/opencollective-0.2.2.tgz#26a761ebf588cc92a422d7cee996a66bd6e2761e" + integrity sha512-69gFVDs7mJfNjv9Zs5DFVD+pvBW+k1TaHSOqUWqAyTTfLcKI/EMYQgvEvziRd+zAFtUOoye6MfWh0qvinGISPw== + dependencies: + chalk "^2.4.1" + consola "^2.3.0" + node-fetch "^2.3.0" + +"@sinonjs/commons@^1.7.0": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217" + integrity sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" + integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": + version "7.1.12" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.12.tgz#4d8e9e51eb265552a7e4f1ff2219ab6133bdfb2d" + integrity sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" + integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.3.tgz#b8aaeba0a45caca7b56a5de9459872dde3727214" + integrity sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.15.tgz#db9e4238931eb69ef8aab0ad6523d4d4caa39d03" + integrity sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A== + dependencies: + "@babel/types" "^7.3.0" + +"@types/graceful-fs@^4.1.2": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.4.tgz#4ff9f641a7c6d1a3508ff88bc3141b152772e753" + integrity sha512-mWA/4zFQhfvOA8zWkXobwJvBD7vzcxgrOQ0J5CH1votGqdq9m7+FwtGaqyCZqC3NyyBkc9z4m+iry4LlqcMWJg== + dependencies: + "@types/node" "*" + +"@types/ioredis@*": + version "4.17.7" + resolved "https://registry.yarnpkg.com/@types/ioredis/-/ioredis-4.17.7.tgz#5007a56380fd387315efabc6c777c050feabb121" + integrity sha512-M8/KDSGmNYhPFMn+CxDDpIEHP27b2muEHgnK1UgIQIMEO2KXH9mznHx3epeRlD+AjF94HFh3dy2/9zqO+pPDqQ== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821" + integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@26.x": + version "26.0.15" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.15.tgz#12e02c0372ad0548e07b9f4e19132b834cb1effe" + integrity sha512-s2VMReFXRg9XXxV+CW9e5Nz8fH2K1aEhwgjUqPPbQd7g95T0laAcvLv032EhFHIa5GHsZ8W7iJEQVaJq6k3Gog== + dependencies: + jest-diff "^26.0.0" + pretty-format "^26.0.0" + +"@types/json-schema@^7.0.3": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" + integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== + +"@types/node@*": + version "14.14.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.6.tgz#146d3da57b3c636cc0d1769396ce1cfa8991147f" + integrity sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw== + +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/prettier@^2.0.0": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.1.5.tgz#b6ab3bba29e16b821d84e09ecfaded462b816b00" + integrity sha512-UEyp8LwZ4Dg30kVU2Q3amHHyTn1jEdhCIE59ANed76GaT1Vp76DD3ZWSAxgCrw6wJ0TqeoBpqmfUHiUDPs//HQ== + +"@types/stack-utils@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" + integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== + +"@types/uuid@*": + version "8.3.0" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.0.tgz#215c231dff736d5ba92410e6d602050cce7e273f" + integrity sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ== + +"@types/yargs-parser@*": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" + integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== + +"@types/yargs@^15.0.0": + version "15.0.9" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.9.tgz#524cd7998fe810cdb02f26101b699cccd156ff19" + integrity sha512-HmU8SeIRhZCWcnRskCs36Q1Q00KBV6Cqh/ora8WN1+22dY07AZdn6Gel8QZ3t26XYPImtcL8WV/eqjhVmMEw4g== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^4": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.6.1.tgz#99d77eb7a016fd5a5e749d2c44a7e4c317eb7da3" + integrity sha512-SNZyflefTMK2JyrPfFFzzoy2asLmZvZJ6+/L5cIqg4HfKGiW2Gr1Go1OyEVqne/U4QwmoasuMwppoBHWBWF2nA== + dependencies: + "@typescript-eslint/experimental-utils" "4.6.1" + "@typescript-eslint/scope-manager" "4.6.1" + debug "^4.1.1" + functional-red-black-tree "^1.0.1" + regexpp "^3.0.0" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/experimental-utils@4.6.1", "@typescript-eslint/experimental-utils@^4.0.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.6.1.tgz#a9c691dfd530a9570274fe68907c24c07a06c4aa" + integrity sha512-qyPqCFWlHZXkEBoV56UxHSoXW2qnTr4JrWVXOh3soBP3q0o7p4pUEMfInDwIa0dB/ypdtm7gLOS0hg0a73ijfg== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/scope-manager" "4.6.1" + "@typescript-eslint/types" "4.6.1" + "@typescript-eslint/typescript-estree" "4.6.1" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + +"@typescript-eslint/parser@^4": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.6.1.tgz#b801bff67b536ecc4a840ac9289ba2be57e02428" + integrity sha512-lScKRPt1wM9UwyKkGKyQDqf0bh6jm8DQ5iN37urRIXDm16GEv+HGEmum2Fc423xlk5NUOkOpfTnKZc/tqKZkDQ== + dependencies: + "@typescript-eslint/scope-manager" "4.6.1" + "@typescript-eslint/types" "4.6.1" + "@typescript-eslint/typescript-estree" "4.6.1" + debug "^4.1.1" + +"@typescript-eslint/scope-manager@4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.6.1.tgz#21872b91cbf7adfc7083f17b8041149148baf992" + integrity sha512-f95+80r6VdINYscJY1KDUEDcxZ3prAWHulL4qRDfNVD0I5QAVSGqFkwHERDoLYJJWmEAkUMdQVvx7/c2Hp+Bjg== + dependencies: + "@typescript-eslint/types" "4.6.1" + "@typescript-eslint/visitor-keys" "4.6.1" + +"@typescript-eslint/types@4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.6.1.tgz#d3ad7478f53f22e7339dc006ab61aac131231552" + integrity sha512-k2ZCHhJ96YZyPIsykickez+OMHkz06xppVLfJ+DY90i532/Cx2Z+HiRMH8YZQo7a4zVd/TwNBuRCdXlGK4yo8w== + +"@typescript-eslint/typescript-estree@4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.6.1.tgz#6025cce724329413f57e4959b2d676fceeca246f" + integrity sha512-/J/kxiyjQQKqEr5kuKLNQ1Finpfb8gf/NpbwqFFYEBjxOsZ621r9AqwS9UDRA1Rrr/eneX/YsbPAIhU2rFLjXQ== + dependencies: + "@typescript-eslint/types" "4.6.1" + "@typescript-eslint/visitor-keys" "4.6.1" + debug "^4.1.1" + globby "^11.0.1" + is-glob "^4.0.1" + lodash "^4.17.15" + semver "^7.3.2" + tsutils "^3.17.1" + +"@typescript-eslint/visitor-keys@4.6.1": + version "4.6.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.6.1.tgz#6b125883402d8939df7b54528d879e88f7ba3614" + integrity sha512-owABze4toX7QXwOLT3/D5a8NecZEjEWU1srqxENTfqsY3bwVnl3YYbOh6s1rp2wQKO9RTHFGjKes08FgE7SVMw== + dependencies: + "@typescript-eslint/types" "4.6.1" + eslint-visitor-keys "^2.0.0" + +abab@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-jsx@^5.2.0: + 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-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn@^7.1.1, 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== + +ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, 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" + +ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +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" + integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + +ansi-styles@^3.2.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.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +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== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +axios@0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.0.tgz#26df088803a2350dff2c27f96fef99fe49442aca" + integrity sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw== + dependencies: + follow-redirects "^1.10.0" + +babel-jest@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" + integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== + dependencies: + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/babel__core" "^7.1.7" + babel-plugin-istanbul "^6.0.0" + babel-preset-jest "^26.6.2" + chalk "^4.0.0" + graceful-fs "^4.2.4" + slash "^3.0.0" + +babel-plugin-istanbul@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" + integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^4.0.0" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" + integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz#cf5feef29551253471cfa82fc8e0f5063df07a77" + integrity sha512-mGkvkpocWJes1CmMKtgGUwCeeq0pOhALyymozzDWYomHTbDLwueDYG6p4TK1YOeYHCzBzYPsWkgTto10JubI1Q== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" + integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== + dependencies: + babel-plugin-jest-hoist "^26.6.2" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@1.x, buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cachedir@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.2.0.tgz#19afa4305e05d79e417566882e0c8f960f62ff0e" + integrity sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ== + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0, camelcase@^5.3.1: + version "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== + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@4.1.0, chalk@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^2.0.0, chalk@^2.4.1, 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" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cjs-module-lexer@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" + integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cluster-key-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d" + integrity sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +collect-v8-coverage@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" + integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commitizen@^4.0.3: + version "4.2.2" + resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-4.2.2.tgz#1a93dd07208521ea1ebbf832593542dac714cc79" + integrity sha512-uz+E6lGsDBDI2mYA4QfOxFeqdWUYwR1ky11YmLgg2BnEEP3YbeejpT4lxzGjkYqumnXr062qTOGavR9NtX/iwQ== + dependencies: + cachedir "2.2.0" + cz-conventional-changelog "3.3.0" + dedent "0.7.0" + detect-indent "6.0.0" + find-node-modules "2.0.0" + find-root "1.1.0" + fs-extra "8.1.0" + glob "7.1.4" + inquirer "6.5.2" + is-utf8 "^0.2.1" + lodash "^4.17.20" + minimist "1.2.5" + strip-bom "4.0.0" + strip-json-comments "3.0.1" + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +consola@^2.3.0: + version "2.15.0" + resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.0.tgz#40fc4eefa4d2f8ef2e2806147f056ea207fcc0e9" + integrity sha512-vlcSGgdYS26mPf7qNi+dCisbhiyDnrN1zaRbw3CSuc2wGOMEGGPsp46PdRG5gqXwgtJfjxDkxRNAgRPr1B77vQ== + +conventional-commit-types@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz#7c9214e58eae93e85dd66dbfbafe7e4fffa2365b" + integrity sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg== + +convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" + integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +cz-conventional-changelog@3.3.0, cz-conventional-changelog@^3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz#9246947c90404149b3fe2cf7ee91acad3b7d22d2" + integrity sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw== + dependencies: + chalk "^2.4.1" + commitizen "^4.0.3" + conventional-commit-types "^3.0.0" + lodash.map "^4.5.1" + longest "^2.0.1" + word-wrap "^1.0.3" + optionalDependencies: + "@commitlint/load" ">6.1.1" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" + integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== + dependencies: + ms "2.1.2" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decimal.js@^10.2.0: + version "10.2.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" + integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +dedent@0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" + integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +denque@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/denque/-/denque-1.4.1.tgz#6744ff7641c148c3f8a69c307e51235c1f4a37cf" + integrity sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ== + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +detect-indent@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd" + integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" + integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +emittery@^0.7.1: + version "0.7.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" + integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== + +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" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +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" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escodegen@^1.14.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-prettier@^6: + version "6.15.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9" + integrity sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw== + dependencies: + get-stdin "^6.0.0" + +eslint-plugin-jest@^24: + version "24.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.1.0.tgz#6708037d7602e5288ce877fd0103f329dc978361" + integrity sha512-827YJ+E8B9PvXu/0eiVSNFfxxndbKv+qE/3GSMhdorCaeaOehtqHGX2YDW9B85TEOre9n/zscledkFW/KbnyGg== + dependencies: + "@typescript-eslint/experimental-utils" "^4.0.1" + +eslint-plugin-prettier@^3: + version "3.1.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz#168ab43154e2ea57db992a2cd097c828171f75c2" + integrity sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-scope@^5.0.0, 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.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.0.0, eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "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-visitor-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" + integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + +eslint@*: + version "7.12.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.12.1.tgz#bd9a81fa67a6cfd51656cdb88812ce49ccec5801" + integrity sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.2.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.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.0" + esquery "^1.2.0" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^12.1.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash "^4.17.19" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.0.tgz#dc30437cf67947cf576121ebd780f15eeac72348" + integrity sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.2.0" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +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== + dependencies: + estraverse "^5.1.0" + +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 "^5.2.0" + +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, 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.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +exec-sh@^0.3.2: + version "0.3.4" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" + integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +expect@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" + integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== + dependencies: + "@jest/types" "^26.6.2" + ansi-styles "^4.0.0" + jest-get-type "^26.3.0" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-regex-util "^26.0.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fast-deep-equal@^3.1.1: + 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== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.1.1: + version "3.2.4" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" + integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fast-safe-stringify@2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" + integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== + +fastq@^1.6.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.9.0.tgz#e16a72f338eaca48e91b5c23593bcc2ef66b7947" + integrity sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +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== + dependencies: + flat-cache "^2.0.1" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-node-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-2.0.0.tgz#5db1fb9e668a3d451db3d618cd167cdd59e41b69" + integrity sha512-8MWIBRgJi/WpjjfVXumjPKCtmQ10B+fjx6zmSA+770GMJirLhWIzg8l763rhjl9xaeaHbnxPNRQKq2mgMhr+aw== + dependencies: + findup-sync "^3.0.0" + merge "^1.2.1" + +find-root@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +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== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +findup-sync@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +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" + +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== + +follow-redirects@^1.10.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" + integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fs-extra@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^2.1.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.2.1.tgz#1fb02ded2036a8ac288d507a65962bd87b97628d" + integrity sha512-bTLYHSeC0UH/EFXS9KqWnXuOl/wHK5Z/d+ghd5AsFMYN7wIGkUCOJyzy88+wJKkZPGON8u4Z9f6U4FdgURE9qA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +gensync@^1.0.0-beta.1: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1: + 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== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stdin@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" + integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^5.0.0, glob-parent@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob@7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-dirs@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^12.1.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" + integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== + dependencies: + type-fest "^0.8.1" + +globby@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" + integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +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" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +iconv-lite@0.4.24, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.2.tgz#fc129c160c5d68235507f4331a6baad186bdbc3e" + integrity sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inquirer@6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + +ioredis@*: + version "4.19.2" + resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.19.2.tgz#e3eab394c653cea5aea07c0c784d8c772dce8801" + integrity sha512-SZSIwMrbd96b7rJvJwyTWSP6XQ0m1kAIIqBnwglJKrIJ6na7TeY4F2EV2vDY0xm/fLrUY8cEg81dR7kVFt2sKA== + dependencies: + cluster-key-slot "^1.1.0" + debug "^4.1.1" + denque "^1.1.0" + lodash.defaults "^4.2.0" + lodash.flatten "^4.4.0" + p-map "^2.1.0" + redis-commands "1.6.0" + redis-errors "^1.2.0" + redis-parser "^3.0.0" + standard-as-callback "^2.0.1" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-core-module@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.1.0.tgz#a4cc031d9b1aca63eecbd18a650e13cb4eeab946" + integrity sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-docker@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" + integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +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-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-potential-custom-element-name@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" + integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +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-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" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-utf8@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" + integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== + +istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" + integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" + integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +iterare@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/iterare/-/iterare-1.2.1.tgz#139c400ff7363690e33abffa33cbba8920f00042" + integrity sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q== + +jest-changed-files@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" + integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== + dependencies: + "@jest/types" "^26.6.2" + execa "^4.0.0" + throat "^5.0.0" + +jest-cli@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" + integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== + dependencies: + "@jest/core" "^26.6.3" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.4" + import-local "^3.0.2" + is-ci "^2.0.0" + jest-config "^26.6.3" + jest-util "^26.6.2" + jest-validate "^26.6.2" + prompts "^2.0.1" + yargs "^15.4.1" + +jest-config@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" + integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^26.6.3" + "@jest/types" "^26.6.2" + babel-jest "^26.6.3" + chalk "^4.0.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.4" + jest-environment-jsdom "^26.6.2" + jest-environment-node "^26.6.2" + jest-get-type "^26.3.0" + jest-jasmine2 "^26.6.3" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + micromatch "^4.0.2" + pretty-format "^26.6.2" + +jest-diff@^26.0.0, jest-diff@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" + integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== + dependencies: + chalk "^4.0.0" + diff-sequences "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-docblock@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" + integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== + dependencies: + detect-newline "^3.0.0" + +jest-each@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" + integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== + dependencies: + "@jest/types" "^26.6.2" + chalk "^4.0.0" + jest-get-type "^26.3.0" + jest-util "^26.6.2" + pretty-format "^26.6.2" + +jest-environment-jsdom@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" + integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + jest-util "^26.6.2" + jsdom "^16.4.0" + +jest-environment-node@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" + integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== + dependencies: + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + jest-mock "^26.6.2" + jest-util "^26.6.2" + +jest-get-type@^26.3.0: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" + integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== + +jest-haste-map@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" + integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== + dependencies: + "@jest/types" "^26.6.2" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + jest-regex-util "^26.0.0" + jest-serializer "^26.6.2" + jest-util "^26.6.2" + jest-worker "^26.6.2" + micromatch "^4.0.2" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.1.2" + +jest-jasmine2@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" + integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^26.6.2" + "@jest/source-map" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^26.6.2" + is-generator-fn "^2.0.0" + jest-each "^26.6.2" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-runtime "^26.6.3" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + pretty-format "^26.6.2" + throat "^5.0.0" + +jest-leak-detector@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" + integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== + dependencies: + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-matcher-utils@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" + integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== + dependencies: + chalk "^4.0.0" + jest-diff "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + +jest-message-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" + integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/types" "^26.6.2" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.4" + micromatch "^4.0.2" + pretty-format "^26.6.2" + slash "^3.0.0" + stack-utils "^2.0.2" + +jest-mock@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" + integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== + +jest-regex-util@^26.0.0: + version "26.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" + integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== + +jest-resolve-dependencies@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" + integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== + dependencies: + "@jest/types" "^26.6.2" + jest-regex-util "^26.0.0" + jest-snapshot "^26.6.2" + +jest-resolve@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" + integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== + dependencies: + "@jest/types" "^26.6.2" + chalk "^4.0.0" + graceful-fs "^4.2.4" + jest-pnp-resolver "^1.2.2" + jest-util "^26.6.2" + read-pkg-up "^7.0.1" + resolve "^1.18.1" + slash "^3.0.0" + +jest-runner@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" + integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== + dependencies: + "@jest/console" "^26.6.2" + "@jest/environment" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.7.1" + exit "^0.1.2" + graceful-fs "^4.2.4" + jest-config "^26.6.3" + jest-docblock "^26.0.0" + jest-haste-map "^26.6.2" + jest-leak-detector "^26.6.2" + jest-message-util "^26.6.2" + jest-resolve "^26.6.2" + jest-runtime "^26.6.3" + jest-util "^26.6.2" + jest-worker "^26.6.2" + source-map-support "^0.5.6" + throat "^5.0.0" + +jest-runtime@^26.6.3: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" + integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== + dependencies: + "@jest/console" "^26.6.2" + "@jest/environment" "^26.6.2" + "@jest/fake-timers" "^26.6.2" + "@jest/globals" "^26.6.2" + "@jest/source-map" "^26.6.2" + "@jest/test-result" "^26.6.2" + "@jest/transform" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + cjs-module-lexer "^0.6.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.4" + jest-config "^26.6.3" + jest-haste-map "^26.6.2" + jest-message-util "^26.6.2" + jest-mock "^26.6.2" + jest-regex-util "^26.0.0" + jest-resolve "^26.6.2" + jest-snapshot "^26.6.2" + jest-util "^26.6.2" + jest-validate "^26.6.2" + slash "^3.0.0" + strip-bom "^4.0.0" + yargs "^15.4.1" + +jest-serializer@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" + integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.4" + +jest-snapshot@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" + integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^26.6.2" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.0.0" + chalk "^4.0.0" + expect "^26.6.2" + graceful-fs "^4.2.4" + jest-diff "^26.6.2" + jest-get-type "^26.3.0" + jest-haste-map "^26.6.2" + jest-matcher-utils "^26.6.2" + jest-message-util "^26.6.2" + jest-resolve "^26.6.2" + natural-compare "^1.4.0" + pretty-format "^26.6.2" + semver "^7.3.2" + +jest-util@^26.1.0, jest-util@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" + integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== + dependencies: + "@jest/types" "^26.6.2" + "@types/node" "*" + chalk "^4.0.0" + graceful-fs "^4.2.4" + is-ci "^2.0.0" + micromatch "^4.0.2" + +jest-validate@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" + integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== + dependencies: + "@jest/types" "^26.6.2" + camelcase "^6.0.0" + chalk "^4.0.0" + jest-get-type "^26.3.0" + leven "^3.1.0" + pretty-format "^26.6.2" + +jest-watcher@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" + integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== + dependencies: + "@jest/test-result" "^26.6.2" + "@jest/types" "^26.6.2" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^26.6.2" + string-length "^4.0.1" + +jest-worker@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest@^26: + version "26.6.3" + resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef" + integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q== + dependencies: + "@jest/core" "^26.6.3" + import-local "^3.0.2" + jest-cli "^26.6.3" + +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.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^16.4.0: + version "16.4.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.4.0.tgz#36005bde2d136f73eee1a830c6d45e55408edddb" + integrity sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w== + dependencies: + abab "^2.0.3" + acorn "^7.1.1" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.2.0" + data-urls "^2.0.0" + decimal.js "^10.2.0" + domexception "^2.0.1" + escodegen "^1.14.1" + html-encoding-sniffer "^2.0.1" + is-potential-custom-element-name "^1.0.0" + nwsapi "^2.2.0" + parse5 "5.1.1" + request "^2.88.2" + request-promise-native "^1.0.8" + saxes "^5.0.0" + symbol-tree "^3.2.4" + tough-cookie "^3.0.1" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + ws "^7.2.3" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "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@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@2.x, json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + +lodash.map@^4.5.1: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= + +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + +longest@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-2.0.1.tgz#781e183296aa94f6d4d916dc335d0d17aefa23f8" + integrity sha1-eB4YMpaqlPbU2RbcM10NF676I/g= + +make-dir@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@1.x: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +merge@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== + +micromatch@^3.0.4, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + +mime-db@1.44.0: + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + dependencies: + mime-db "1.44.0" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@1.2.5, minimist@^1.1.1, minimist@^1.2.0, 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== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@1.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@^0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-fetch@^2.3.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.0.tgz#a7eee2d51da6d0f7ff5094bc7108c911240c1620" + integrity sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA== + dependencies: + growly "^1.3.0" + is-wsl "^2.2.0" + semver "^7.3.2" + shellwords "^0.1.1" + uuid "^8.3.0" + which "^2.0.2" + +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-hash@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea" + integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +optional@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/optional/-/optional-0.1.4.tgz#cdb1a9bedc737d2025f690ceeb50e049444fd5b3" + integrity sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw== + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-each-series@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.1.0.tgz#961c8dd3f195ea96c747e636b262b800a6b1af48" + integrity sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +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@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.1.0.tgz#f96088cdf24a8faa9aea9a009f2d9d942c999646" + integrity sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +parse5@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-to-regexp@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-3.2.0.tgz#fa7877ecbc495c601907562222453c43cc204a5f" + integrity sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.1.2.tgz#3050700dae2e4c8b67c4c3f666cdb8af405e1ce5" + integrity sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg== + +pretty-format@^26.0.0, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +prompts@^2.0.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" + integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +react-is@^17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" + integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +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" + integrity sha1-62LSrbFeTq9GEMBK/hUpOEJQq60= + +redis-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" + integrity sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ= + dependencies: + redis-errors "^1.0.0" + +reflect-metadata@*: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^3.0.0, regexpp@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.8: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.88.2: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +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" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-global@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" + integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== + dependencies: + global-dirs "^0.1.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@^1.10.0, resolve@^1.18.1, resolve@^1.3.2: + version "1.18.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" + integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== + dependencies: + is-core-module "^2.0.0" + path-parse "^1.0.6" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@*, rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +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" + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +run-async@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.1.10" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" + integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== + +rxjs@^6, rxjs@^6.4.0: + version "6.6.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" + integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== + dependencies: + tslib "^1.9.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +saxes@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@7.x, semver@^7.2.1, semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + +semver@^6.0.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +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== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.6: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.6" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce" + integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +stack-utils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.2.tgz#5cf48b4557becb4638d0bc4f21d23f5d19586593" + integrity sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg== + dependencies: + escape-string-regexp "^2.0.0" + +standard-as-callback@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.0.1.tgz#ed8bb25648e15831759b6023bdb87e6b60b38126" + integrity sha512-NQOxSeB8gOI5WjSaxjBgog2QFw55FV8TkS6Y07BiB3VJ8xNTvUYm0wl0s8ObgQ5NhdpnNfigMIKjgPESzgr4tg== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +string-length@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" + integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.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" + integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.1.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" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-bom@4.0.0, strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +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: + 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@^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== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" + integrity sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +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== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tough-cookie@^2.3.3, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-3.0.1.tgz#9df4f57e739c26930a018184887f4adb7dca73b2" + integrity sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg== + dependencies: + ip-regex "^2.1.0" + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479" + integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg== + dependencies: + punycode "^2.1.1" + +ts-jest@^26: + version "26.4.3" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-26.4.3.tgz#d153a616033e7ec8544b97ddbe2638cbe38d53db" + integrity sha512-pFDkOKFGY+nL9v5pkhm+BIFpoAuno96ff7GMnIYr/3L6slFOS365SI0fGEVYx2RKGji5M2elxhWjDMPVcOCdSw== + dependencies: + "@jest/create-cache-key-function" "^26.5.0" + "@types/jest" "26.x" + bs-logger "0.x" + buffer-from "1.x" + fast-json-stable-stringify "2.x" + jest-util "^26.1.0" + json5 "2.x" + lodash.memoize "4.x" + make-error "1.x" + mkdirp "1.x" + semver "7.x" + yargs-parser "20.x" + +tslib@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c" + integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ== + +tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.17.1: + version "3.17.1" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" + integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== + dependencies: + tslib "^1.8.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: + version "4.0.8" + 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.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typescript@^4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.5.tgz#ae9dddfd1069f1cb5beb3ef3b2170dd7c1332389" + integrity sha512-ywmr/VrTVCmNTJ6iV2LwIrfG1P+lv6luD8sUJs+2eI9NLGigaN+nUQc13iHqisq7bra9lnmUSYqbJvegraBOPQ== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +uri-js@^4.2.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" + integrity sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +uuid@8.3.1, uuid@^8, uuid@^8.3.0: + version "8.3.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" + integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@^2.0.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" + integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== + +v8-to-istanbul@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.0.0.tgz#b4fe00e35649ef7785a9b7fcebcea05f37c332fc" + integrity sha512-fLL2rFuQpMtm9r8hrAV2apXX/WqHJ6+IC4/eQVdMDGBUgH/YMV4Gv3duk3kjmyg6uiQWBAA9nJwue4iJUOkHeA== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^8.0.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.4.0.tgz#50fb9615b05469591d2b2bd6dfaed2942ed72837" + integrity sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^2.0.2" + webidl-conversions "^6.1.0" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.14, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.0.3, word-wrap@^1.2.3, word-wrap@~1.2.3: + version "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== + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + 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" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.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" + +ws@^7.2.3: + version "7.3.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" + integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +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== + +yaml@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + +yargs-parser@20.x: + version "20.2.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.3.tgz#92419ba867b858c868acf8bae9bf74af0dd0ce26" + integrity sha512-emOFRT9WVHw03QSvN5qor9QQT9+sw5vwxfYweivSMHTcAXPefwVae2FjO7JJjj8hCE4CzPOPeFM83VwT29HCww== + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^15.4.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2"