From b1a5bf85eca3a65130ea8a38af9e17cbb92abee8 Mon Sep 17 00:00:00 2001 From: Eugene Poyarkov Date: Wed, 21 Oct 2020 20:07:07 +0100 Subject: [PATCH 1/2] feat: ts refactoring - wip --- .babelrc | 13 - .eslintrc | 2 +- .mdeprc | 9 +- .mocharc.json | 5 +- .nycrc | 2 +- bench/roundtrip.js | 14 +- package.json | 40 +- src/amqp-transport.ts | 827 ++++++ src/amqp.js | 10 +- src/constants.js | 5 - src/constants.ts | 10 + src/consumer/consumer.ts | 183 ++ src/consumer/factory.ts | 121 + src/consumer/index.ts | 3 + src/consumer/private-consumer.ts | 51 + src/exchange/factory.ts | 175 ++ src/exchange/index.ts | 2 + src/exchange/schema.ts | 34 + src/helpers.js | 137 - src/index.js | 1 - src/index.ts | 1 + src/loggers/index.js | 25 - src/loggers/index.ts | 33 + src/loggers/noop-logger.js | 10 - src/loggers/noop-logger.ts | 15 + src/loggers/pino-logger.js | 15 - src/loggers/pino-logger.ts | 21 + src/queue/factory.ts | 65 + src/queue/index.ts | 3 + src/queue/queue.ts | 113 + src/queue/schema.ts | 42 + src/schema.js | 323 --- src/schema/backoff.ts | 46 + src/schema/connection.ts | 88 + src/schema/dlx.ts | 27 + src/schema/helpers.ts | 32 + src/schema/index.ts | 119 + src/schema/logger-like.ts | 20 + src/schema/publishing.ts | 44 + src/types.ts | 81 + src/utils/backoff.ts | 28 + src/utils/cache.js | 57 - src/utils/cache.ts | 78 + src/utils/entity-store.ts | 46 + src/utils/{error.js => error.ts} | 74 +- src/utils/get-app-id.ts | 21 + src/utils/init-routing-fn.ts | 80 + src/utils/latency.js | 9 - src/utils/latency.ts | 9 + src/utils/parsing.ts | 65 + src/utils/recovery.js | 58 - src/utils/reply-storage.js | 86 - src/utils/reply-storage.ts | 123 + src/utils/response.ts | 61 + src/utils/serialization.js | 98 - src/utils/serialization.ts | 113 + src/utils/transport.js | 29 - src/utils/transport.ts | 140 ++ test/schema.ts | 302 +++ tsconfig.build.json | 16 + tsconfig.json | 36 + yarn.lock | 4057 ++++++++++++------------------ 62 files changed, 4932 insertions(+), 3421 deletions(-) delete mode 100644 .babelrc create mode 100644 src/amqp-transport.ts delete mode 100644 src/constants.js create mode 100644 src/constants.ts create mode 100644 src/consumer/consumer.ts create mode 100644 src/consumer/factory.ts create mode 100644 src/consumer/index.ts create mode 100644 src/consumer/private-consumer.ts create mode 100644 src/exchange/factory.ts create mode 100644 src/exchange/index.ts create mode 100644 src/exchange/schema.ts delete mode 100644 src/helpers.js delete mode 100644 src/index.js create mode 100644 src/index.ts delete mode 100644 src/loggers/index.js create mode 100644 src/loggers/index.ts delete mode 100644 src/loggers/noop-logger.js create mode 100644 src/loggers/noop-logger.ts delete mode 100644 src/loggers/pino-logger.js create mode 100644 src/loggers/pino-logger.ts create mode 100644 src/queue/factory.ts create mode 100644 src/queue/index.ts create mode 100644 src/queue/queue.ts create mode 100644 src/queue/schema.ts delete mode 100644 src/schema.js create mode 100644 src/schema/backoff.ts create mode 100644 src/schema/connection.ts create mode 100644 src/schema/dlx.ts create mode 100644 src/schema/helpers.ts create mode 100644 src/schema/index.ts create mode 100644 src/schema/logger-like.ts create mode 100644 src/schema/publishing.ts create mode 100644 src/types.ts create mode 100644 src/utils/backoff.ts delete mode 100644 src/utils/cache.js create mode 100644 src/utils/cache.ts create mode 100644 src/utils/entity-store.ts rename src/utils/{error.js => error.ts} (63%) create mode 100644 src/utils/get-app-id.ts create mode 100644 src/utils/init-routing-fn.ts delete mode 100644 src/utils/latency.js create mode 100644 src/utils/latency.ts create mode 100644 src/utils/parsing.ts delete mode 100644 src/utils/recovery.js delete mode 100644 src/utils/reply-storage.js create mode 100644 src/utils/reply-storage.ts create mode 100644 src/utils/response.ts delete mode 100644 src/utils/serialization.js create mode 100644 src/utils/serialization.ts delete mode 100644 src/utils/transport.js create mode 100644 src/utils/transport.ts create mode 100644 test/schema.ts create mode 100644 tsconfig.build.json create mode 100644 tsconfig.json diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 3350f57..0000000 --- a/.babelrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "plugins": [ - "@babel/plugin-transform-strict-mode", - "@babel/plugin-proposal-class-properties" - ], - "env": { - "test": { - "plugins": [ - "istanbul" - ] - } - } -} diff --git a/.eslintrc b/.eslintrc index b5154ea..2b97cfe 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,3 +1,3 @@ { - "extends": "makeomatic" + "extends": "makeomatic/typescript" } diff --git a/.mdeprc b/.mdeprc index ac3c9b7..697808a 100644 --- a/.mdeprc +++ b/.mdeprc @@ -1,5 +1,5 @@ { - "node": "12.14.1", + "node": "14.11.0", "auto_compose": true, "services": [ "rabbitmq" @@ -19,9 +19,12 @@ } }, "rabbitmq": { - "ports": ["15672:15672"] + "ports": [ + "5672:5672", + "15672:15672" + ] } }, - "tests": "./test/*.js", + "tests": "./test/**/*", "rebuild": ["microtime"] } diff --git a/.mocharc.json b/.mocharc.json index 19980d5..bd27576 100644 --- a/.mocharc.json +++ b/.mocharc.json @@ -1,5 +1,6 @@ { - "bail": true, + "bail": false, "timeout": 60000, - "report": "spec" + "report": "spec", + "require": "ts-node/register" } diff --git a/.nycrc b/.nycrc index 1cf4935..6fa46f6 100644 --- a/.nycrc +++ b/.nycrc @@ -6,7 +6,7 @@ "src/**/*.spec.js" ], "require": [ - "@babel/register" + "ts-node/register" ], "sourceMap": false, "instrument": false, diff --git a/bench/roundtrip.js b/bench/roundtrip.js index 4eb40b1..61cf53c 100644 --- a/bench/roundtrip.js +++ b/bench/roundtrip.js @@ -1,4 +1,3 @@ -const Promise = require('bluebird'); const Benchmark = require('benchmark'); const fmt = require('util').format; const AMQPTransport = require('../lib'); @@ -39,12 +38,13 @@ const opts = { const publisher = new AMQPTransport(configuration); let messagesSent = 0; -Promise.join( +Promise.all([ AMQPTransport.connect(opts, listener), publisher.connect() -) - .spread((consumer) => { +]) + .then(([consumer]) => { const suite = new Benchmark.Suite('RabbitMQ'); + suite.add('Round-trip', { defer: true, fn: function test(deferred) { @@ -57,11 +57,13 @@ Promise.join( }, }) .on('complete', function suiteCompleted() { - const { stats } = this.filter('fastest')[0]; - const { times } = this.filter('fastest')[0]; + const { stats } = this.filter('successful')[0]; + const { times } = this.filter('successful')[0]; process.stdout.write(fmt('Messages sent: %s\n', messagesSent)); process.stdout.write(fmt('Mean is %s ms ~ %s %\n', stats.mean * 1000, stats.rme)); process.stdout.write(fmt('Total time is %s s %s s\n', times.elapsed, times.period)); + process.stdout.write(fmt('Std. dev %s\n', stats.deviation)) + consumer.close(); publisher.close(); }) diff --git a/package.json b/package.json index 207e2cd..0b4c2c7 100644 --- a/package.json +++ b/package.json @@ -4,13 +4,16 @@ "version": "0.0.0-development", "main": "./lib/amqp.js", "scripts": { - "compile": "babel -d ./lib ./src", - "lint": "eslint ./src", + "lint": "eslint ./src --ext .ts,.js", "test": "yarn lint && yarn test:e2e", "test:e2e": "mdep test run", - "prepublishOnly": "yarn compile", - "bench": "yarn compile && node ./bench/roundtrip.js", - "semantic-release": "semantic-release" + "bench": "yarn build && node ./bench/roundtrip.js", + "prepublishOnly": "yarn build", + "semantic-release": "semantic-release", + "clean": "yarn build:clean", + "build:lib": "tsc --build tsconfig.build.json", + "build:clean": "rimraf ./lib", + "build": "yarn build:clean && yarn build:lib" }, "engines": { "node": ">= 10.15.0", @@ -27,12 +30,13 @@ }, "homepage": "https://github.com/microfleet/transport-amqp#readme", "devDependencies": { - "@babel/cli": "^7.10.1", - "@babel/core": "^7.10.2", - "@babel/plugin-proposal-class-properties": "^7.10.1", - "@babel/plugin-transform-strict-mode": "^7.10.1", - "@babel/register": "^7.10.1", "@makeomatic/deploy": "^10.2.1", + "@types/common-errors": "^1.0.1", + "@types/lodash": "^4.14.161", + "@types/mocha": "^8.0.3", + "@types/node": "^14.11.2", + "@types/object-hash": "^1.3.3", + "@types/pino": "^6.3.1", "babel-plugin-istanbul": "^6.0.0", "benchmark": "^2.1.4", "chai": "^4.2.0", @@ -48,29 +52,35 @@ "microtime": "^3.0.0", "mocha": "^8.0.1", "nyc": "^15.1.0", - "sinon": "^9.0.2" + "rimraf": "^3.0.2", + "sinon": "^9.0.2", + "ts-node": "^9.0.0", + "typescript": "^4.1.0-beta" }, "peerDependencies": { "common-errors": "~1.x.x", "stdout-stream": "~1.x.x" }, "dependencies": { - "@hapi/joi": "^17.1.1", "@microfleet/amqp-coffee": "^1.3.1", - "bluebird": "^3.7.2", + "@sindresorhus/is": "^3.1.2", "common-errors": "^1.0.5", "debug": "^4.1.1", + "delay": "^4.4.0", "eventemitter3": "^4.0.4", "flatstr": "^1.0.12", "hashlru": "^2.3.0", + "hyperid": "^2.0.5", "is": "^3.3.0", - "json-stringify-safe": "^5.0.1", + "joi": "^17.2.1", "lodash": "^4.17.15", "object-hash": "^2.0.3", "opentracing": "^0.14.4", + "p-timeout": "^3.2.0", "pino": "^6.3.2", + "safe-stable-stringify": "^1.1.1", "sonic-boom": "^1.0.1", - "uuid": "^8.1.0" + "zod": "^2.0.0-beta.8" }, "files": [ "lib/", diff --git a/src/amqp-transport.ts b/src/amqp-transport.ts new file mode 100644 index 0000000..43ac328 --- /dev/null +++ b/src/amqp-transport.ts @@ -0,0 +1,827 @@ +import is from '@sindresorhus/is' +import assert from 'assert' + +import { ArgumentError, ConnectionError, InvalidOperationError, NotPermittedError } from 'common-errors' +import delay from 'delay' +import EventEmitter from 'eventemitter3' +import defaults from 'lodash/defaults' +import merge from 'lodash/merge' +import opentracing from 'opentracing' +import stringify from 'safe-stable-stringify' +import { kReplyHeaders } from './constants' +import { Consumer, ConsumerFactory, ConsumerOpts, PrivateConsumer } from './consumer' +import { AnyExchangeOpts, ExchangeFactory } from './exchange' +import { getInstance as getLoggerInstance } from './loggers' + +import { Queue, QueueConfOpts, QueueFactory, QueueOpts } from './queue' + +import { Schema } from './schema' +import { BackoffPolicy } from './schema/backoff' + +import type { LoggerLike } from './schema/logger-like' +import type { AnyFunction, ConsumedQueue, MessageHandler, PublishingOpts } from './types' +import { AMQPTransportEvents } from './types' + +import { Backoff } from './utils/backoff' +import { Cache } from './utils/cache' +import { AppID, getAppID } from './utils/get-app-id' +import { initRoutingFn } from './utils/init-routing-fn' +import { ReplyStorage } from './utils/reply-storage' +import { Message, buildResponse, adaptResponse } from './utils/response' + +// TODO +import type { AMQP } from './utils/transport' +// TODO +import Transport from './utils/transport' +import { AmqpDLXError, wrapError } from './utils/error' +import { latency } from './utils/latency' + +export class AMQPTransport extends EventEmitter { + public config: Schema + public log: LoggerLike + + readonly #appIDString: string + readonly #appID: AppID + readonly #defaultOpts: PublishingOpts + readonly #extraQueueOpts: PublishingOpts = {} + + #replyTo?: string | false + #cache: Cache + #recovery: Backoff + #replyStorage: ReplyStorage + + // TODO right amqp type + #amqp: AMQP.Instance | null = null + #queues: QueueFactory + #consumers: ConsumerFactory + #exchangeFactory: ExchangeFactory + #reconnectionHandlers: WeakMap = new WeakMap() + + public static async create( + config: MessageHandler + ): Promise<[AMQPTransport, MessageHandler]> + public static async create( + config: Partial, + messageHandler: MessageHandler + ): Promise<[AMQPTransport, MessageHandler]> + public static async create( + config: any, + messageHandler?: MessageHandler + ): Promise<[AMQPTransport, MessageHandler | undefined]> { + let $config = config + let $messageHandler = messageHandler + + if (typeof config === 'function' && is.undefined(messageHandler)) { + $messageHandler = config + $config = {} + } + + const amqp = new AMQPTransport($config) + await amqp.connect() + + return [amqp, $messageHandler] + } + + public static async connect( + config: Partial, + messageHandler: MessageHandler, + opts: Partial = {} + ): Promise { + const [ + amqp, + $messageHandler + ] = await AMQPTransport.create(config, messageHandler) + + if (typeof $messageHandler === 'function' || amqp.config.listen) { + await amqp.createConsumedQueue( + $messageHandler, + amqp.config.listen, + opts + ) + } + + return amqp + } + + public static async multiConnect( + config: Partial, + messageHandler: MessageHandler, + opts: Partial = {} + ): Promise { + const [ + amqp, + $messageHandler + ] = await AMQPTransport.create(config, messageHandler) + + if (typeof $messageHandler !== 'function' && !amqp.config.listen) { + return amqp + } + + + await Promise.all(amqp.config.listen.map((route, idx) => { + // TODO + // @ts-expect-error + const queueOpts = opts[idx] ?? Object.create(null) + const queueName = config.queue + ? `${config.queue}-${route.replace(/[#*]/g, '.')}` + : config.queue + + const consumedQueueOpts = defaults(queueOpts, { + queue: queueName, + }) + + return amqp.createConsumedQueue(messageHandler, [route], consumedQueueOpts) + })) + + return amqp + } + + get amqp() { return this.#amqp } + get appID() { return this.#appID } + get appIDString() { return this.#appIDString } + // todo + get isConnected() { return this.amqp?.state === 'open' } + get isConnecting() { return this.#replyTo === false } + + /** + * Instantiate AMQP Transport + * @param {Object} opts, defaults to {} + */ + constructor(opts: Partial = {}) { + super() + + const config = this.config = Schema.parse(opts) + this.#appID = getAppID(this) + this.#appIDString = stringify(this.#appID) + + // init logger + this.log = getLoggerInstance(config) + this.log.debug({ config }, 'used configuration') + + // init cache + this.#cache = new Cache({ + size: this.config.cache, + log: this.log, + }) + + // reply storage, where we'd save correlation ids + // and callbacks to be called once we are done + this.#replyStorage = new ReplyStorage() + + // delay settings for reconnect + this.#recovery = new Backoff(config.recovery) + + // TODO tracer + // this.tracer = .... + + this.#defaultOpts = { + ...config.defaultOpts, + appId: this.appIDString, + } + + // DLX config + if (config.dlx.enabled) { + // there is a quirk - we must make sure that no routing key matches queue name + // to avoid useless redistributions of the message + this.#extraQueueOpts.arguments = { 'x-dead-letter-exchange': config.dlx.params.exchange } + } + } + + /** + * Connects to AMQP, if config.router is specified earlier, + * automatically invokes .consume function + * @return {Promise} + */ + async connect() { + const { amqp, config } = this + + if (amqp) { + switch (amqp.state) { + case 'opening': + case 'open': + case 'reconnecting': { + const msg = 'connection was already initialized, close it first' + throw new InvalidOperationError(msg) + } + + default: + // already closed, but make sure + amqp.close() + this.#amqp = null + } + } + + await new Promise((resolve, reject) => { + this.#amqp = new Transport(config.connection, (err: any, ...args: any[]) => { + if (err) { + return reject(err) + } + + resolve(...args) + }) + + this.#amqp.on('ready', this.#onConnect) + this.#amqp.on('close', this.#onClose) + }) + + return this + } + + async close() { + const amqp = this.#amqp + + if (amqp === null) { + throw new InvalidOperationError('connection was not initialized in the first place') + } + + switch (amqp.state) { + case 'opening': + case 'open': + case 'reconnecting': + return this.#close() + + default: + this.#amqp = null + return + } + } + + /** + * Send message to specified route + * + * @param {String} route - destination route + * @param {mixed} message - message to send - will be coerced to string via stringify + * @param {Object} options - additional options + * @param {Span} parentSpan + */ + async publish( + route: string, + message: RequestBody, + options: Partial = {}, + parentSpan?: opentracing.Span + ) {} + + /** + * Sends a message and then awaits for response + * @param {String} route + * @param {mixed} message + * @param {Object} options + * @param {Span} parentSpan + * @return {Promise} + */ + async publishAndWait< + RequestBody extends any, + ResponseBody extends any + > ( + route: string, + message: RequestBody, + options: Partial = {}, + parentSpan?: opentracing.Span + ) : Promise {} + + /** + * Send message to specified queue directly + * + * @param {String} queue - destination queue + * @param {mixed} message - message to send + * @param {Object} [options] - additional options + * @param {opentracing.Span} [parentSpan] - Existing span. + */ + async send( + queue: string, + message: RequestBody, + options: Partial = {}, + parentSpan?: opentracing.Span + ) {} + + /** + * Send message to specified queue directly and wait for answer + * + * @param {string} queue destination queue + * @param {any} message message to send + * @param {object} options additional options + * @param {Span} parentSpan + */ + async sendAndWait( + route: string, + message: RequestBody, + options: Partial = {}, + parentSpan?: opentracing.Span + ) {} + + /** + * @deprecated + * @param {Function} messageHandler + * @param {Array} listen + * @param {Object} options + */ + async createConsumedQueue< + RequestBody extends any, + ResponseBody extends any + >( + messageHandler: MessageHandler, + listen: string[] = [], + options: Partial & Pick & { queue?: string } = {} + ) { + const { + queue, + neck, + ...queueOpts + } = options + + return this.$createConsumedQueue( + messageHandler, + listen, + { + queue, + queueOpts, + consumerOpts: { + neck, + }, + } + ) + } + + async $createConsumedQueue< + RequestBody extends any, + ResponseBody extends any + >( + messageHandler: MessageHandler, + listen: string[] = [], + options: { + queue?: string + queueOpts?: Partial + consumerOpts?: Pick + } = {} + ) { + if (is.function_(messageHandler) === false || is.array(listen) === false) { + throw new ArgumentError('messageHandler and listen must be present') + } + + if (is.object(options) === false) { + throw new ArgumentError('options') + } + + const { config } = this + const router = initRoutingFn(messageHandler, this) + + const queueOpts: QueueOpts = { + queue: options.queue ?? config.queue ?? '', + options: merge( + config.defaultQueueOpts, + this.#extraQueueOpts, + ) + } + + const consumerOpts: Omit = { + neck: options.consumerOpts?.neck ?? config.neck, + onMessage: router + } + + const exchangesOpts: { regular: AnyExchangeOpts, headers?: AnyExchangeOpts } = { + regular: { + exchange: config.exchange, + exchangeArgs: config.exchangeArgs, + } + } + + if (config.bindPersistentQueueToHeadersExchange === true) { + for (const route of listen.values()) { + assert( + ExchangeFactory.isValidHeadersExchangeRoute(route), + 'with bindPersistentQueueToHeadersExchange: true routes must not have patterns' + ) + } + + exchangesOpts.headers = config.headersExchange + } + + // pipeline for establishing consumer + const establishConsumer = async (attempt = 0): Promise => { + const { log } = this + + log.debug({ attempt }, 'establish consumer') + const oldConsumer = this.#consumers + .get(establishConsumer) + const oldQueue = this.#queues + .get(establishConsumer) + + // if we have old consumer + if (oldConsumer) { + await this.#consumers.close(oldConsumer) + } + + let createdQueue + try { + const { queue } = createdQueue = await this.#createQueue( + queueOpts, + consumerOpts + ) + + await this.#exchangeFactory.bindQueueOnRoutes( + queue, + listen, + exchangesOpts, + oldQueue + ) + } catch (e) { + const err = new ConnectionError('failed to init queue or exchange', e) + log.warn({ err }, '[consumed-queue-down]') + await delay(this.#recovery.get(BackoffPolicy.Consumed, attempt + 1)) + return establishConsumer(attempt + 1) + } + + const { consumer, queue } = createdQueue + + // save refs + this.#reconnectionHandlers.set(consumer, establishConsumer) + this.#queues.store(establishConsumer, queue) + this.#consumers.store(establishConsumer, consumer) + + // emit event consumer & queue is ready + const queueName = queue.name + log.info({ queueName, consumerTag: consumer.consumerTag }, 'consumed-queue-reconnected') + this.emit(AMQPTransportEvents.ConsumedQueueReconnected, consumer, queue, establishConsumer) + + return queueName + } + + // make sure we recreate a queue and establish consumer on reconnect + this.log.debug({ listen, queue: queueOpts.queue }, 'creating consumed queue') + const queueName = await establishConsumer() + + this.log.debug({ listen, queue: queueName }, 'bound `ready` to establishConsumer') + this.on(AMQPTransportEvents.Ready, establishConsumer) + + return establishConsumer + } + + + // TODO legacy interface + /** + * Create queue with specified settings in current connection + * also emit new event on message in queue + * + * @param {Object} opts - queue parameters + */ + async createQueue(opts: string | (QueueOpts & { router: ReturnType })){ + const queueOpts = QueueFactory.ensureQueueOpts(opts) + const consumerOpts: Omit = is.string(opts) + ? {} as ConsumerOpts + : { + onMessage: opts.router, + onError: this.#handleConsumerError, + onClose: this.#handleConsumerClose, + onCancel: this.#rebindConsumer, + } + + return this.#createQueue(queueOpts, consumerOpts) + } + + /** + * Create unnamed private queue (used for reply events) + */ + async createPrivateQueue(attempt = 0): Promise { + try { + return this.#createPrivateQueue() + } catch (err) { + const to = this.#recovery.get(BackoffPolicy.Private, attempt) + + this.log.error( + { timeout: to, err, attempt }, + 'private queue creation failed - restarting' + ) + + await delay(to) + return this.createPrivateQueue(attempt + 1) + } + } + + #createQueue = async < + $ConsumerOpts extends Partial> = Partial> + >( + queueOpts: QueueOpts, + consumerOpts: $ConsumerOpts, + consumerType = Consumer + ): Promise<$ConsumerOpts extends Omit + ? Promise> + : Promise + > => { + const queue = await this.#queues.create(queueOpts) + const context: ConsumedQueue = { + queue, + options: queue.options, + } + + if (typeof consumerOpts.onMessage !== 'function') { + return context + } + + const consumer = await this.#consumers.create(consumerType, { + queue, + onMessage: consumerOpts.onMessage, + ...consumerOpts, + }) + + return { + consumer, + ...context, + } + } + + #createPrivateQueue = async () => { + const queueName = Queue.getName(this.#replyTo as string | undefined) + // reset current state + this.#replyTo = undefined + + const queueOpts = { + queue: queueName, + options: this.config.privateQueueOpts, + } + + const consumerOpts = { + onError: this.#handlePrivateConsumerError, + onCancel: this.#handlePrivateConsumerCancel, + onMessage: this.#handlePrivateMessage, + } + + const context = await this.#createQueue( + queueOpts, + consumerOpts, + PrivateConsumer + ) + + // declare _replyTo queueName + this.#replyTo = context.queue.name + + // bind temporary queue to headers exchange for DLX messages + // NOTE: if this fails we might have a problem where expired messages + // are not delivered & private queue is never ready + if (this.config.dlx.enabled) { + await this.#exchangeFactory.bindHeadersExchange( + context.queue, + this.#replyTo, + this.config.dlx.params, + 'reply-to' + ) + } + + // notify + this.log.debug({ queue: this.#replyTo }, AMQPTransportEvents.PrivateQueueReady) + this.emit(AMQPTransportEvents.PrivateQueueReady) + + return context + } + + #awaitPrivateQueue = () => { + return new Promise((resolve, reject) => { + let done: AnyFunction | null + let error: AnyFunction | null + + done = function onReady(this: AMQPTransport) { + this.removeAllListeners(AMQPTransportEvents.Error) + error = null + resolve() + } + + error = function onError(this: AMQPTransport, err) { + this.removeListener(AMQPTransportEvents.PrivateQueueReady, done as AnyFunction) + done = null + reject(err) + } + + this.once(AMQPTransportEvents.PrivateQueueReady, done) + this.once(AMQPTransportEvents.Error, error) + }); + } + + // #onMessage: = () + // + /** + * Stops consumers and closes transport + */ + #close = async () => { + await this.#closeAllConsumers() + + const amqp = this.#amqp + if (amqp === null) { + return + } + + try { + await new Promise((resolve, reject) => { + amqp.once('close', resolve) + amqp.once('error', reject) + amqp.close() + }); + } finally { + amqp.removeAllListeners() + this.#amqp = null + } + } + + #init = () => { + if (this.#amqp === null) { + throw new Error('Failed to call #init() on uninitialized instance') + } + + const it = { + amqp: this.#amqp, + } + + this.#queues = new QueueFactory(it) + this.#consumers = new ConsumerFactory(it) + this.#exchangeFactory = new ExchangeFactory(it) + } + + #closeAllConsumers = async () => { + const work = []; + + for (const consumer of this.#consumers.values()) { + work.push(this.#stopConsumedQueue(consumer)) + } + + await Promise.all(work) + } + + /** + * Prevents consumer from re-establishing connection + * @param {Consumer} consumer + * @returns {Promise} + */ + #stopConsumedQueue = async (consumer: Consumer) => { + if (!consumer) { + throw new TypeError('consumer must be defined') + } + + const establishConsumer = this.#reconnectionHandlers.get(consumer) + this.log.debug({ establishConsumer: !!establishConsumer }, 'fetched establish consumer') + + if (establishConsumer) { + this.removeListener(AMQPTransportEvents.Ready, establishConsumer) + } + + await consumer.close() + } + + /** + * 'ready' event from amqp-coffee lib, perform queue recreation here + */ + #onConnect = () => { + const { serverProperties } = (this.#amqp as AMQP.Instance) + const { cluster_name: clusterName, version } = serverProperties + + // emit connect event through log + this.log.info('connected to %s v%s', clusterName, version) + + // init handlers for queues and consumers + this.#init() + + // https://github.com/dropbox/amqp-coffee#reconnect-flow + // recreate unnamed private queue + // replyTo === false when reconnecting + if ((this.#replyTo || this.config.private) && this.#replyTo !== false) { + this.createPrivateQueue() + .then(() => { + this.log.info({ queue: this.#replyTo }, 'a private queue is created') + }) + } + + // re-emit ready + this.emit(AMQPTransportEvents.Ready) + } + + /** + * Pass in close event + */ + #onClose = (err: Error) => { + // emit connect event through log + this.log.warn({ err }, 'connection is closed') + // re-emit close event + this.emit(AMQPTransportEvents.Close, err) + } + + #handlePrivateConsumerError = (_: Consumer, shouldRecreate: boolean, err: AMQP.ConsumerError): void => { + if (shouldRecreate && !this.isConnecting) { + this.createPrivateQueue() + return + } + + this.log.error('private consumer returned error', err) + this.emit(AMQPTransportEvents.Error, err) + } + + #handlePrivateConsumerCancel = () => { + if (!this.isConnecting) { + this.createPrivateQueue() + } + } + + /** + * Distributes messages from a private queue + * @param {mixed} message + * @param {Object} properties + */ + #handlePrivateMessage = async < + RequestBody extends any, + ResponseBody extends any + >( + message: Message, + properties: PublishingOpts, + ): Promise => { + const { correlationId, replyTo, headers } = properties + const { 'x-death': xDeath } = headers + + // retrieve promised message + const future = this.#replyStorage.pop(correlationId) + + // case 1 - for some reason there is no saved reference, example - crashed process + if (future === undefined) { + this.log.error('no recipient for the message %j and id %s', message.error || message.data || message, correlationId); + + let error + if (xDeath) { + error = new AmqpDLXError(xDeath, message) + this.log.warn('message was not processed', error) + } + + // otherwise we just run messages in circles + if (replyTo && replyTo !== this.#replyTo) { + // if error is undefined - generate this + if (error === undefined) { + error = new NotPermittedError(`no recipients found for correlationId "${correlationId}"`) + } + + // reply with the error + return this.reply(properties, { error }) + } + + // we are done + return null + } + + this.log.trace('response returned in %s', latency(future.time)) + + // if message was dead-lettered - reject with an error + if (xDeath) { + return future.reject(new AmqpDLXError(xDeath, message)) + } + + if (message.error) { + const error = wrapError(message.error) + + Object.defineProperty(error, kReplyHeaders, { + value: headers, + enumerable: false, + }); + + return future.reject(error) + } + + const response = buildResponse(message, properties) + + if (future.cache) { + this.#cache.set(future.cache, response) + } + + return future.resolve(adaptResponse(response, future.replyOptions)) + } + + #handleConsumerError = ( + consumer: Consumer, + shouldRecreate: boolean, + err: AMQP.ConsumerError, + res: any + ): void => { + if (shouldRecreate) { + this.#rebindConsumer(consumer, err, res) + } + } + + #handleConsumerClose = (consumer: Consumer) => { + this.emit(AMQPTransportEvents.ConsumerClose, consumer.consumer) + } + + #rebindConsumer = async (consumer: Consumer, err: AMQP.ConsumerError, res: any) => { + const msg = err ? err.replyText : 'uncertain' + + // cleanup a bit + this.log.warn({ err, res }, 're-establishing connection after %s', msg) + const reconnect = this.#reconnectionHandlers + .get(consumer) + + try { + await this.#consumers.close(consumer) + await delay(this.#recovery.get(BackoffPolicy.Consumed, 1)) + } catch (e) { + this.log.error({ err: e }, 'failed to close consumer') + } finally { + if (is.undefined(reconnect)) { + this.log.fatal({ err, res }, 'failed to fetch connection handler') + return + } + + await reconnect() + } + } +} diff --git a/src/amqp.js b/src/amqp.js index 415667f..905b9f0 100644 --- a/src/amqp.js +++ b/src/amqp.js @@ -45,7 +45,6 @@ const { jsonSerializer, jsonDeserializer } = require('./utils/serialization'); const { AmqpDLXError } = generateErrorMessage; const { wrapError, setQoS } = helpers; const { Tags, FORMAT_TEXT_MAP } = opentracing; -const PARSE_ERR = new ValidationError('couldn\'t deserialize input', 500, 'message.raw'); /** * Wraps regular in a bluebird promise @@ -127,7 +126,7 @@ const initRoutingFn = (messageHandler, transport) => { /** * Initiates consumer message handler. - * @param {mixed} message - Data passed from the publisher. + * @param {mixed} message - RequestBody passed from the publisher. * @param {Object} properties - AMQP Message properties. * @param {Object} raw - Original AMQP message. * @param {Function} [raw.ack] - Acknowledge if nack is `true`. @@ -1317,13 +1316,6 @@ class AMQPTransport extends EventEmitter { return future.resolve(adaptResponse(response, future.replyOptions)); } - /** - * Parses AMQP message - * @param {Buffer} _data - * @param {String} [contentType='application/json'] - * @param {String} [contentEncoding='plain'] - * @return {Object} - */ async _parseInput(_data, contentType = 'application/json', contentEncoding = 'plain') { let data; diff --git a/src/constants.js b/src/constants.js deleted file mode 100644 index 46da04c..0000000 --- a/src/constants.js +++ /dev/null @@ -1,5 +0,0 @@ -const kReplyHeaders = Symbol('headers'); - -module.exports = { - kReplyHeaders, -}; diff --git a/src/constants.ts b/src/constants.ts new file mode 100644 index 0000000..4219a29 --- /dev/null +++ b/src/constants.ts @@ -0,0 +1,10 @@ +import { + ValidationError +} from 'common-errors' + +export const kReplyHeaders + = Symbol('headers') + +export const kParseError + = new ValidationError(`couldn't deserialize input`, '500', 'message.raw') + diff --git a/src/consumer/consumer.ts b/src/consumer/consumer.ts new file mode 100644 index 0000000..3330146 --- /dev/null +++ b/src/consumer/consumer.ts @@ -0,0 +1,183 @@ +import noop from 'lodash/noop' +import pTimeout from 'p-timeout' + +import { AMQP } from '../utils/transport' +import { Queue } from '../queue' +import { ConsumerFactory } from './factory' +import { AnyFunction, MessageHandler, MessagePreHandler } from '../types' + +import { getInstance as getLoggerInstance } from '../loggers' + +type AnyConsumerError = AMQP.ConsumerError | { + error: AMQP.ConsumerError +} + +export interface OnConsumerError { + (consumer: Consumer, shouldRecreate: boolean, err: AMQP.ConsumerError, res?: any): void +} + +export interface OnConsumerCancel { + (consumer: Consumer, err: AMQP.ConsumerError, res?: any): void +} + +export interface OnConsumerClose { + (consumer: Consumer): void +} + +export interface ConsumerOpts { + neck?: number + queue: Queue + onMessage: MessageHandler + onMessagePre?: MessagePreHandler + + onError?: OnConsumerError + onCancel?: OnConsumerCancel + onClose?: AnyFunction +} + +const kPrivateToken = Symbol.for('consumer-private-ctr-token') + +export class Consumer { + #initialized: boolean = false + readonly #consumer: AMQP.Consumer + + protected readonly onErrorCallback: OnConsumerError + protected readonly onCloseCallback: OnConsumerClose + protected readonly onCancelCallback: OnConsumerCancel + protected readonly boundQueue: Queue + + static async create(this: T, builder: ConsumerFactory['buildConsumer'], opts: ConsumerOpts): Promise> { + const qos = Consumer.getQoS(opts) + const consumer = await builder( + opts.queue.name, + qos, { + onMessage: opts.onMessage, + onMessagePre: opts.onMessagePre, + }) + + return (new this(kPrivateToken, consumer, opts)) as InstanceType + } + + static getQoS = (opts: ConsumerOpts): AMQP.ConsumerOpts => { + const { queue, neck } = opts + const consumeOpts = { + ...queue.options, + } as AMQP.ConsumerOpts + + if (neck === undefined) { + consumeOpts.noAck = true + } else { + consumeOpts.noAck = false + consumeOpts.prefetchCount = neck > 0 ? neck : 0 + } + + return consumeOpts + } + + constructor(token: symbol, consumer: AMQP.Consumer, opts: ConsumerOpts) { + if (token !== kPrivateToken) { + throw new Error('Calling private constructor') + } + + this.#consumer = consumer + this.boundQueue = opts.queue + this.onErrorCallback = opts.onError ?? noop + this.onCancelCallback = opts.onCancel ?? noop + this.onCloseCallback = opts.onClose ?? noop + + this.initListeners() + } + + get log() { + return getLoggerInstance() + } + + get consumer() { + return this.#consumer + } + + get consumerTag() { + return this.#consumer.consumerTag + } + + async close() { + this.#consumer.removeAllListeners() + this.#consumer.on('error', noop) + this.onCloseCallback(this) + + await this.#cancel() + } + + protected initListeners = () => { + const consumer = this.consumer + + // remove previous listeners if we re-use the channel + // for any reason + if (this.#initialized) { + consumer.removeAllListeners('error') + consumer.removeAllListeners('cancel') + } + + consumer.on('error', this.handleError) + consumer.on('cancel', this.handleCancel) + + this.#initialized = true + } + + protected handleError = (err: AnyConsumerError, res?: any) => { + return 'error' in err + ? this.onError(err.error, res) + : this.onError(err, res) + } + + protected handleCancel = (err: AMQP.ConsumerError, res?: any) => { + return this.onCancelCallback(this, err, res) + } + + protected onError = (err: AMQP.ConsumerError, res?: any) => { + let shouldRecreate = false + + switch (err.replyCode) { + // ignore errors + case 311: + case 313: + this.log.error({ err, res }, 'error working with a channel:') + break + + case 404: + if (err.replyText && err.replyText.includes(this.boundQueue.name)) { + shouldRecreate = true + } + break + + default: + this.log.warn({ err }, 'unhandled consumer error') + shouldRecreate = true + break + } + + this.onErrorCallback(this, shouldRecreate, err, res) + } + + #cancel = async () => { + const cancellation = new Promise((resolve, reject) => { + this.consumer.cancel((err: any, res: any) => { + if (err) { + return reject(err) + } + resolve(res) + }) + }) + + try { + return pTimeout(cancellation, 5000) + } catch (err) { + if (!(err instanceof pTimeout.TimeoutError)) { + throw err + } + } finally { + this.log.info({ consumerTag: this.consumer.consumerTag }, 'closed consumer') + } + } +} + diff --git a/src/consumer/factory.ts b/src/consumer/factory.ts new file mode 100644 index 0000000..281d726 --- /dev/null +++ b/src/consumer/factory.ts @@ -0,0 +1,121 @@ +import pick from 'lodash/fp/pick' + +import { AMQP } from '../utils/transport' +import { parseInput } from '../utils/parsing' +import { EntityStore } from '../utils/entity-store' +import { getInstance as getLoggerInstance } from '../loggers' + +import { Consumer, ConsumerOpts } from './consumer' +import { PrivateConsumer } from './private-consumer' +import { MessageHandler, MessagePreHandler, RawMessage } from '../types' + +export interface ConsumerFactoryOpts { + amqp: AMQP.Instance +} + +export interface Creator { + create(builder: B, opts: O): Promise +} + +export type Consumers = + | Consumer + | PrivateConsumer + +export type ConsumerCreator = Creator< + T, + ConsumerFactory['buildConsumer'], + ConsumerOpts +> + +export class ConsumerFactory extends EntityStore { + #amqp: AMQP.Instance + readonly #parseInput: typeof parseInput + + static pickExtendedMessageProps = pick([ + 'deliveryTag', + 'redelivered', + 'exchange', + 'routingKey', + 'weight', + ]) + + constructor(opts: ConsumerFactoryOpts) { + super(Map) + this.#amqp = opts.amqp + this.#parseInput = parseInput.bind(this) + } + + get log() { return getLoggerInstance() } + + buildConsumer = (queue: string, opts: AMQP.ConsumerOpts, handlers: { + onMessage: MessageHandler, + onMessagePre?: MessagePreHandler + }) => { + const onMessage = this.#createMessageHandler( + handlers.onMessage, + handlers.onMessagePre + ) + + return this.#amqp.consumeAsync(queue, opts, onMessage) + } + + // create(opts: ConsumerOpts) { + // return this.create(Consumer, opts) + // } + // + // createPrivate(opts: ConsumerOpts) { + // // TODO + // // https://github.com/microsoft/TypeScript/issues/5863 + // return this.create(PrivateConsumer, opts) as Promise + // } + + async create(Type: ConsumerCreator, opts: ConsumerOpts): Promise { + this.log.info({ queue: opts.queue.name }, 'consumer is being created') + const consumer = await Type + .create(this.buildConsumer, opts) + this.log.info({ queue: opts.queue.name }, 'consumer is created') + + return consumer + } + + async close (consumer: Consumer){ + await consumer.close() + } + + #createMessageHandler = < + RequestBody extends any = any, + ResponseBody extends any = any + >( + onMessage: MessageHandler, + onMessagePre?: MessagePreHandler + ) => ( + async (incoming: RawMessage) => { + if (onMessagePre) { + onMessagePre(incoming) + } + + // extract message data + const { properties } = incoming; + const { contentType, contentEncoding } = properties + + // parsed input data + const message = await this.#parseInput( + incoming.raw, + contentType, + contentEncoding + ) + + // useful message properties + const props = { + ...properties, + ...ConsumerFactory.pickExtendedMessageProps(incoming), + } + + // pass to the consumer message router + // message - properties - incoming + // incoming.raw<{ ack: ?Function, reject: ?Function, retry: ?Function }> + // and everything else from amqp-coffee + setImmediate(onMessage, message, props, incoming) + } + ) +} diff --git a/src/consumer/index.ts b/src/consumer/index.ts new file mode 100644 index 0000000..09c49c7 --- /dev/null +++ b/src/consumer/index.ts @@ -0,0 +1,3 @@ +export * from './factory' +export * from './consumer' +export * from './private-consumer' diff --git a/src/consumer/private-consumer.ts b/src/consumer/private-consumer.ts new file mode 100644 index 0000000..d0784ca --- /dev/null +++ b/src/consumer/private-consumer.ts @@ -0,0 +1,51 @@ +import noop from 'lodash/noop' + +import { AMQP } from '../utils/transport' +import { Consumer } from './consumer' + +export class PrivateConsumer extends Consumer { + async close() { + const consumer = this.consumer + consumer.removeAllListeners('error') + consumer.removeAllListeners('cancel') + consumer.on('error', noop) + consumer.close() + } + + protected initListeners = () => { + const consumer = this.consumer + + // remove previous listener + consumer.removeAllListeners('error') + consumer.removeAllListeners('cancel') + + consumer.on('error', this.handleError) + consumer.once('cancel', this.handleCancel) + } + + protected handleCancel = (err: AMQP.ConsumerError, res?: any) => { + this.close() + this.onCancelCallback(this, err, res) + } + + protected onError = (err: AMQP.ConsumerError, res?: any) => { + let shouldRecreate = false + + if ( + err + && err.replyCode === 404 + && err.replyText.includes(this.boundQueue.name) + ) { + // https://github.com/dropbox/amqp-coffee#consumer-event-error + // handle consumer error on reconnect and close consumer + // warning: other queues (not private one) should be handled manually + this.log.error('consumer returned 404 error', err) + + // reset replyTo queue and ignore all future errors + this.close() + shouldRecreate = true + } + + this.onErrorCallback(this, shouldRecreate, err, res) + } +} diff --git a/src/exchange/factory.ts b/src/exchange/factory.ts new file mode 100644 index 0000000..9ebd97d --- /dev/null +++ b/src/exchange/factory.ts @@ -0,0 +1,175 @@ +import assert from 'assert' +import { CoercedUniqStringArray } from '../schema/helpers' +import { on406 } from '../utils/error' +import { AMQP } from '../utils/transport' +import { Queue } from '../queue' +import { ExchangeConfOpts, ExchangeType } from './schema' +import { getInstance as getLoggerInstance } from '../loggers' + +export interface ExchangeOpts { + exchange: string + exchangeArgs: ExchangeConfOpts +} + +export type AnyExchangeOpts = + | ExchangeOpts + | AMQP.ExchangeOpts + +export class ExchangeFactory { + #amqp: AMQP.Instance + + public static headersExchangeRouteRe = /^[^*#]+$/ + public static isValidHeadersExchangeRoute = (route: string) => { + return ExchangeFactory.headersExchangeRouteRe.test(route) + } + + public static getExchangeOpts(opts: AnyExchangeOpts): AMQP.ExchangeOpts { + assert(opts.exchange, 'exchange name must be specified') + return 'exchangeArgs' in opts + ? { + exchange: opts.exchange, + ...opts.exchangeArgs, + } + : opts + } + + constructor({ amqp }: { amqp: AMQP.Instance }) { + this.#amqp = amqp + } + + get log() { return getLoggerInstance() } + + async create($opts: AnyExchangeOpts): Promise { + const opts = ExchangeFactory.getExchangeOpts($opts) + await this.#declareExchange(opts) + return opts.exchange + } + + /** + * Bind specified queue to exchange + * + * @param {object} queue - queue instance created by .createQueue + * @param {string|string[]} $routes - messages sent to this route will be delivered to queue + * @param {object} [opts={}] - exchange parameters: + * https://github.com/dropbox/amqp-coffee#connectionexchangeexchangeargscallback + */ + async bindExchange( + queue: Queue, + $routes: string | string[], + opts: AnyExchangeOpts + ){ + return this.#bindExchange(queue, $routes, opts) + } + + /** + * Binds multiple routing keys to headers exchange. + * @param {Object} queue + * @param {string|string[]} $routes + * @param {Object} opts + * @param {boolean} [headerName=false] - if exchange has `headers` type + * @returns {Promise<*>} + */ + async bindHeadersExchange( + queue: Queue, + $routes: string | string[], + opts: AnyExchangeOpts, + headerName: string | boolean = true + ){ + return this.#bindExchange( + queue, + $routes, + opts, + headerName + ) + } + + async bindQueueOnRoutes( + queue: Queue, + routes: string[], + exchanges: { + regular: AnyExchangeOpts, + headers?: AnyExchangeOpts, + }, + oldQueue?: Queue + ){ + const previousRoutes = oldQueue?.routes ?? [] as string[] + + if (routes.length === 0 && previousRoutes.length === 0) { + queue.routes = [] + return + } + + // retrieved some routes + this.log.debug({ routes, previousRoutes }, 'retrieved routes') + const rebindRoutes = queue.routes = [...previousRoutes, ...routes] + + const work = [ + this.bindExchange( + queue, + rebindRoutes, + exchanges.regular + ), + ] + + // bind same queue to headers exchange + if (exchanges.headers) { + work.push(this.bindHeadersExchange( + queue, + rebindRoutes, + exchanges.headers + )) + } + + await Promise.all(work) + } + + #bindExchange = async ( + queue: Queue, + $routes: string | string[], + $opts: AnyExchangeOpts, + headerName: string | boolean = false + ) => { + const routes = CoercedUniqStringArray.parse($routes) + const opts = ExchangeFactory.getExchangeOpts($opts) + + // headers exchange + // do sanity check + if (headerName) { + assert.equal(opts.type, ExchangeType.Headers) + this.log.debug('bind routes->exchange/headers', routes, opts.exchange) + } else { + this.log.debug('bind routes->exchange', routes, opts.exchange) + } + + const exchange = await this.create(opts) + const jobs = routes.map((route) => { + if (headerName) { + assert.ok(ExchangeFactory.isValidHeadersExchangeRoute(route)) + } + + return queue.bindRoute(exchange, route, headerName) + }) + + return Promise.all(jobs) + } + + /** + * Declares exchange and reports 406 error. + * @param {Object} params - Exchange params. + * @returns {Promise<*>} + */ + #declareExchange = async (opts: AMQP.ExchangeOpts) => { + try { + const exchange = await this.#amqp + .exchangeAsync(opts) + await exchange.declareAsync() + return exchange + } catch (e) { + if (e.replyCode === 406) { + return on406.call(this, opts, e) + } + + throw e + } + } +} diff --git a/src/exchange/index.ts b/src/exchange/index.ts new file mode 100644 index 0000000..dffb4d4 --- /dev/null +++ b/src/exchange/index.ts @@ -0,0 +1,2 @@ +export * from './factory' +export * from './schema' diff --git a/src/exchange/schema.ts b/src/exchange/schema.ts new file mode 100644 index 0000000..60bdb21 --- /dev/null +++ b/src/exchange/schema.ts @@ -0,0 +1,34 @@ +import * as z from 'zod' + +export enum ExchangeType { + Topic = 'topic', + Direct = 'direct', + Fanout = 'fanout', + Headers = 'headers', +} + +export const ExchangeTypeEnum = z.nativeEnum(ExchangeType) + +export const ExchangeConfOpts = z.object({ + /** do not autoDelete exchanges */ + autoDelete: z.boolean() + .default(false), + + /** whether not to wait for declare response */ + noWait: z.boolean() + .default(false), + + /** whether to set internal bit */ + internal: z.boolean() + .default(false), + + /** type of the exchange */ + type: ExchangeTypeEnum + .default(ExchangeType.Topic), + + /** whether to preserve exchange on rabbitmq restart */ + durable: z.boolean() + .default(true), +}) + +export type ExchangeConfOpts = z.infer diff --git a/src/helpers.js b/src/helpers.js deleted file mode 100644 index 687c472..0000000 --- a/src/helpers.js +++ /dev/null @@ -1,137 +0,0 @@ -const Promise = require('bluebird'); -const defaults = require('lodash/defaults'); -const is = require('is'); -const omit = require('lodash/omit'); -const { MSError } = require('./utils/serialization'); - -/** - * Connects static helpers to AMQPTransport class - */ -exports = module.exports = (AMQPTransport) => { - /** - * Creates AMQPTransport instance - * @param {Object} [_config] - * @param {Function} [_messageHandler] - * @returns {AMQPTransport} - */ - AMQPTransport.create = function create(_config, _messageHandler) { - let config; - let messageHandler; - - if (is.fn(_config) && is.undefined(_messageHandler)) { - messageHandler = _config; - config = {}; - } else { - messageHandler = _messageHandler; - config = _config; - } - - // init AMQP connection - const amqp = new AMQPTransport(config); - - // connect & resolve AMQP connector & message handler if it exists - return amqp.connect().return([amqp, messageHandler]); - }; - - /** - * Allows one to consume messages with a given router and predefined callback handler - * @param {Object} _config - * @param {Function} [_messageHandler] - * @param {Object} [_opts={}] - * @returns {Promise} - */ - AMQPTransport.connect = function connect(config, _messageHandler, _opts = {}) { - return AMQPTransport - .create(config, _messageHandler) - .spread(async (amqp, messageHandler) => { - // do not init queues - if (is.fn(messageHandler) !== false || amqp.config.listen) { - await amqp.createConsumedQueue(messageHandler, amqp.config.listen, _opts); - } - - return amqp; - }); - }; - - /** - * Same as AMQPTransport.connect, except that it creates a queue - * per each of the routes we want to listen to - * @param {Object} config - * @param {Function} [_messageHandler] - * @param {Object} [_opts={}] - * @returns {Promise} - */ - AMQPTransport.multiConnect = function multiConnect(config, _messageHandler, opts = []) { - return AMQPTransport - .create(config, _messageHandler) - .spread(async (amqp, messageHandler) => { - // do not init queues - if (is.fn(messageHandler) === false && !amqp.config.listen) { - return amqp; - } - - await Promise.map(amqp.config.listen, (route, idx) => { - const queueOpts = opts[idx] || Object.create(null); - const queueName = config.queue - ? `${config.queue}-${route.replace(/[#*]/g, '.')}` - : config.queue; - - const consumedQueueOpts = defaults(queueOpts, { - queue: queueName, - }); - - return amqp.createConsumedQueue(messageHandler, [route], consumedQueueOpts); - }); - - return amqp; - }); - }; -}; - -// error data that is going to be copied -const copyErrorData = [ - 'code', 'name', 'errors', - 'field', 'reason', 'stack', -]; - -/** - * Wraps response error - * @param {Error} originalError - * @returns {Error} - */ -exports.wrapError = function wrapError(originalError) { - if (originalError instanceof Error) { - return originalError; - } - - // this only happens in case of .toJSON on error object - const error = new MSError(originalError.message); - - for (const fieldName of copyErrorData) { - const mixedData = originalError[fieldName]; - if (mixedData !== undefined && mixedData !== null) { - error[fieldName] = mixedData; - } - } - - return error; -}; - -/** - * Set queue opts - * @param {Object} opts - * @return {Object} - */ -exports.setQoS = function setQoS(opts) { - const { neck } = opts; - const output = omit(opts, 'neck'); - - if (is.undefined(neck)) { - output.noAck = true; - } else { - output.noAck = false; - output.prefetchCount = neck > 0 ? neck : 0; - } - - return output; -}; diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 04401d7..0000000 --- a/src/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./amqp'); diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..d1b0800 --- /dev/null +++ b/src/index.ts @@ -0,0 +1 @@ +export * from './amqp-transport' diff --git a/src/loggers/index.js b/src/loggers/index.js deleted file mode 100644 index 0d36646..0000000 --- a/src/loggers/index.js +++ /dev/null @@ -1,25 +0,0 @@ -const every = require('lodash/every'); -const is = require('is'); - -exports.levels = ['trace', 'debug', 'info', 'warn', 'error', 'fatal']; - -exports.isCompatible = (obj) => { - return obj !== null - && typeof obj === 'object' - && every(exports.levels, (level) => is.fn(obj[level])); -}; - -exports.prepareLogger = (config) => { - // bunyan logger - if (config.debug && !config.log) { - try { - return require('./pino-logger')(config.name); - } catch (e) { - return require('./noop-logger'); - } - } else if (exports.isCompatible(config.log)) { - return config.log; - } - - return require('./noop-logger'); -}; diff --git a/src/loggers/index.ts b/src/loggers/index.ts new file mode 100644 index 0000000..61cd97a --- /dev/null +++ b/src/loggers/index.ts @@ -0,0 +1,33 @@ +import { Schema } from '../schema' +import { LoggerLike } from '../schema/logger-like' + +let kInstance: LoggerLike | null = null + +const prepareLogger = (config: Schema): LoggerLike => { + if (config.log) { + return config.log + } + + if (config.debug) { + try { + return require('./pino-logger')(config.name) + } catch (e) { + return require('./noop-logger') + } + } + + return require('./noop-logger') +} + +export const getInstance = (config?: Schema): LoggerLike => { + if (kInstance) { + return kInstance + } + + if (!config) { + throw new Error('No instance of logger is defined') + } + + kInstance = prepareLogger(config) + return kInstance +} diff --git a/src/loggers/noop-logger.js b/src/loggers/noop-logger.js deleted file mode 100644 index 5b5134e..0000000 --- a/src/loggers/noop-logger.js +++ /dev/null @@ -1,10 +0,0 @@ -// quick noop-logger implementation -const noop = require('lodash/noop'); -const logLevels = require('./index').levels; - -const assignLevels = (prev, level) => { - prev[level] = noop; - return prev; -}; - -logLevels.reduce(assignLevels, module.exports); diff --git a/src/loggers/noop-logger.ts b/src/loggers/noop-logger.ts new file mode 100644 index 0000000..bbb847e --- /dev/null +++ b/src/loggers/noop-logger.ts @@ -0,0 +1,15 @@ +// quick noop-logger implementation +import noop from 'lodash/noop' +import { LoggerLike } from '../schema/logger-like' + +export const noopLogger = () => { + const logger: LoggerLike = Object.create(null) + + for (const level of Object.keys(LoggerLike.shape) as Array) { + logger[level] = noop + } + + return logger +} + +export default noopLogger diff --git a/src/loggers/pino-logger.js b/src/loggers/pino-logger.js deleted file mode 100644 index e54da5b..0000000 --- a/src/loggers/pino-logger.js +++ /dev/null @@ -1,15 +0,0 @@ -const pino = require('pino'); -const SonicBoom = require('sonic-boom'); - -// holy crap with stdout and good -const isProduction = process.env.NODE_ENV === 'production'; - -module.exports = (name = '@microfleet/transport-amqp', settings = {}) => { - const opts = { - name, - level: isProduction ? 'info' : 'trace', - ...settings, - }; - - return pino(opts, new SonicBoom({ fd: process.stdout.fd })); -}; diff --git a/src/loggers/pino-logger.ts b/src/loggers/pino-logger.ts new file mode 100644 index 0000000..493254b --- /dev/null +++ b/src/loggers/pino-logger.ts @@ -0,0 +1,21 @@ +const pino = require('pino') +const SonicBoom = require('sonic-boom') + +// holy crap with stdout and good +const isProduction = process.env.NODE_ENV === 'production' + +export const pinoLogger = (name = '@microfleet/transport-amqp', settings = {}) => { + const opts = { + name, + level: isProduction ? 'info' : 'trace', + ...settings, + } + + // TODO some tools like flame tend to override stdout + // In such case, the fd might be `undefined` + const boom = new SonicBoom({ fd: process.stdout.fd }) + + return pino(opts, boom) +} + +export default pinoLogger diff --git a/src/queue/factory.ts b/src/queue/factory.ts new file mode 100644 index 0000000..ab4f10a --- /dev/null +++ b/src/queue/factory.ts @@ -0,0 +1,65 @@ +import is from '@sindresorhus/is' + +import { AMQP } from '../utils/transport' +import { Queue } from './queue' +import { EntityStore } from '../utils/entity-store' +import { QueueConfOpts } from './schema' +import { getInstance as getLoggerInstance } from '../loggers' + +export interface QueueOpts { + queue: string + options: QueueConfOpts +} + +export interface QueueFactoryOpts { + amqp: AMQP.Instance +} + +export class QueueFactory extends EntityStore { + #amqp: AMQP.Instance + + public static ensureQueueOpts = ($opts: QueueOpts | string): QueueOpts => { + return is.string($opts) + ? { queue: $opts, options: {} } as QueueOpts + : { queue: $opts.queue, options: $opts.options } + } + + public static getQueueOpts = ($opts: QueueOpts | string): AMQP.QueueOpts => { + const opts = QueueFactory.ensureQueueOpts($opts) + const { queue } = opts + + return { + queue, + ...opts.options, + durable: opts.options?.durable ?? !!queue, + autoDelete: opts.options?.autoDelete ?? !queue, + } + } + + constructor(opts: QueueFactoryOpts) { + super() + this.#amqp = opts.amqp + } + + get log() { + return getLoggerInstance() + } + + buildQueue = async (opts: AMQP.QueueOpts) => ( + this.#amqp.queueAsync(opts) + ) + + async create($opts: QueueOpts | string){ + const opts = QueueFactory.getQueueOpts($opts) + + try { + const queue = await Queue + .create(this.buildQueue, opts) + this.log.info({ queue: queue.name }, 'queue created') + return queue + } catch (err) { + this.log.warn({ err, queue: opts.queue }, 'failed to init queue') + throw err + } + } +} diff --git a/src/queue/index.ts b/src/queue/index.ts new file mode 100644 index 0000000..7ade301 --- /dev/null +++ b/src/queue/index.ts @@ -0,0 +1,3 @@ +export * from './queue' +export * from './schema' +export * from './factory' diff --git a/src/queue/queue.ts b/src/queue/queue.ts new file mode 100644 index 0000000..15e3043 --- /dev/null +++ b/src/queue/queue.ts @@ -0,0 +1,113 @@ +import hyperid from 'hyperid' +import uniq from 'lodash/uniq' +import { getInstance as getLoggerInstance } from '../loggers' +import { on406 } from '../utils/error' +import { AMQP } from '../utils/transport' + +const kPrivateToken = Symbol.for('queue-private-ctr-token') + +export interface CreateQueueProps { + options: AMQP.QueueOpts +} + +export class Queue { + public name: string + + #routes: string[] = [] + readonly #queue: AMQP.Queue + readonly #options: AMQP.QueueOpts + + static async create(builder: AMQP.Instance['queueAsync'], opts: AMQP.QueueOpts){ + const queue = await builder(opts) + + try { + await queue.declareAsync() + } catch (err) { + if (err.replyCode === 406) { + on406.call({ log: getLoggerInstance() }, opts, err) + } else { + throw err + } + } + + return new Queue(kPrivateToken, queue, { + options: { + ...queue.queueOptions + }, + }) + } + + static nameSequence = hyperid({ urlSafe: true }) + static getName(replyTo?: string) { + return replyTo ?? `microfleet.${Queue.nameSequence()}` + } + + constructor(token: symbol, queue: AMQP.Queue, props: CreateQueueProps) { + if (token !== kPrivateToken) { + throw new Error('Calling private constructor') + } + + this.name = props.options.queue + this.#queue = queue + this.#options = props.options + } + + get options() { + return this.#options + } + + get log() { + return getLoggerInstance() + } + + get routes() { + return this.#routes + } + + set routes($routes: string[]) { + this.#routes = $routes.length !== 0 + ? uniq($routes) + : $routes + } + + /** + * Binds exchange to queue via route. For Headers exchange + * automatically populates arguments with routing-key: . + * @param {string} exchange - Exchange to bind to. + * @param {string} route - Routing key. + * @param {boolean} [headerName=false] - if exchange has `headers` type. + * @returns {Promise<*>} + */ + async bindRoute(exchange: string, route: string, headerName: boolean | string = false) { + let routingKey = '' + const queueName = this.name + const options = {} as AMQP.QueueOpts + + if (headerName === false) { + routingKey = route + } else { + options.arguments = { + 'x-match': 'any', + [headerName === true ? 'routing-key' : headerName]: route, + } + } + + const response = await this.#queue + .bindAsync(exchange, routingKey, options) + const { _routes: routes } = this.#queue + + if (Array.isArray(routes)) { + // reconnect might push an extra route + if (!routes.includes(route)) { + routes.push(route) + } + + this.log.trace({ routes, queueName }, '[queue routes]') + } + + this.log.debug({ queueName, exchange, routingKey }, 'bound queue to exchange') + return response + } + +} + diff --git a/src/queue/schema.ts b/src/queue/schema.ts new file mode 100644 index 0000000..aca0823 --- /dev/null +++ b/src/queue/schema.ts @@ -0,0 +1,42 @@ +import * as z from 'zod' + +export const QueueConfOpts = z.object({ + /** TODO: description */ + autoDelete: z.boolean() + .optional(), + + /** TODO: description */ + exclusive: z.boolean() + .optional(), + + /** TODO: description */ + noWait: z.boolean() + .optional(), + + /** TODO: description */ + passive: z.boolean() + .optional(), + + /** survive restarts & use disk storage */ + durable: z.boolean() + .default(true), + + arguments: z.object({ + /** delete queue after it's been unused for X seconds */ + 'x-expires': z.number() + .min(0) + .default(1800000) + .optional(), + + /** setup priority queues where messages will be delivery based on priority level */ + 'x-max-priority': z.number() + .min(2) + .max(255) + .optional(), + }) + .default({}) +}) + // @ts-expect-error + .default({}) + +export type QueueConfOpts = z.infer diff --git a/src/schema.js b/src/schema.js deleted file mode 100644 index b844b51..0000000 --- a/src/schema.js +++ /dev/null @@ -1,323 +0,0 @@ -const baseJoi = require('@hapi/joi'); -const recoverySchema = require('./utils/recovery').schema; - -const Joi = baseJoi.extend((joi) => ({ - type: 'coercedArray', - base: joi.alternatives().try( - joi.array().items(joi.string()).unique(), - joi.string() - ), - validate(value) { - if (typeof value === 'string') { - return { value: [value] }; - } - - return { value }; - }, -})); - -const exchangeTypes = Joi.string() - .valid('direct', 'topic', 'headers', 'fanout'); - -exports.Joi = Joi; - -exports.schema = Joi - .object({ - name: Joi.string() - .description('name of the service when advertising to AMQP') - .default('amqp'), - - private: Joi.boolean() - .description('when true - initializes private queue right away') - .default(false), - - cache: Joi.number().min(0) - .description('size of LRU cache for responses, 0 to disable it') - .default(100), - - timeout: Joi.number() - .description('default *AndWait timeout') - .default(10000), - - debug: Joi.boolean() - .description('enables debug messages') - .default(process.env.NODE_ENV !== 'production'), - - listen: Joi.coercedArray() - .description('attach default queue to these routes on default exchange'), - - version: Joi.string() - .description('advertise end-client service version') - .default('n/a'), - - neck: Joi.number().min(0) - .description('if defined - queues will enter QoS mode with required ack & prefetch size of neck'), - - tracer: Joi.object(), - - connection: Joi - .object({ - host: Joi.alternatives() - .try( - Joi.string(), - Joi.array().min(1).items(Joi.string()), - Joi.array().min(1).items(Joi.object({ - host: Joi.string().required(), - port: Joi.number().required(), - })) - ) - .description('rabbitmq host') - .default('localhost'), - - port: Joi.number() - .description('rabbitmq port') - .default(5672), - - heartbeat: Joi.number() - .description('heartbeat check') - .default(10000), - - login: Joi.string() - .description('rabbitmq login') - .default('guest'), - - password: Joi.string() - .description('rabbitmq password') - .default('guest'), - - vhost: Joi.string() - .description('rabbitmq virtual host') - .default('/'), - - temporaryChannelTimeout: Joi.number() - .description('temporary channel close time with no activity') - .default(6000), - - reconnect: Joi.boolean() - .description('enable auto-reconnect') - .default(true), - - reconnectDelayTime: Joi.number() - .description('reconnect delay time') - .default(500), - - hostRandom: Joi.boolean() - .description('select host to connect to randomly') - .default(false), - - ssl: Joi.boolean() - .description('whether to use SSL') - .default(false), - - sslOptions: Joi.object() - .description('ssl options'), - - noDelay: Joi.boolean() - .description('disable Nagle\'s algorithm') - .default(true), - - clientProperties: Joi - .object({ - capabilities: Joi.object({ - consumer_cancel_notify: Joi.boolean() - .description('whether to react to cancel events') - .default(true), - }).default(), - }) - .description('options for advertising client properties') - .default(), - }) - .description('options for setting up connection to RabbitMQ') - .default(), - - recovery: recoverySchema - .description('recovery settings') - .default(), - - exchange: Joi.string() - .allow('') - .description('default exchange for communication') - .default('node-services'), - - exchangeArgs: Joi - .object({ - autoDelete: Joi.boolean() - .description('do not autoDelete exchanges') - .default(false), - - noWait: Joi.boolean() - .description('whether not to wait for declare response') - .default(false), - - internal: Joi.boolean() - .description('whether to set internal bit') - .default(false), - - type: exchangeTypes - .description('type of the exchange') - .default('topic'), - - durable: Joi.boolean() - .description('whether to preserve exchange on rabbitmq restart') - .default(true), - }) - .default(), - - bindPersistantQueueToHeadersExchange: Joi.boolean() - .description('whether to bind queues created by .createConsumedQueue to headersExchange') - .default(false), - - headersExchange: Joi - .object({ - exchange: Joi.string() - .description('default headers exchange to use, should be different from DLX headers exchange') - .default('amq.match'), - - autoDelete: Joi.boolean() - .description('do not autoDelete exchanges') - .default(false), - - noWait: Joi.boolean() - .description('whether not to wait for declare response') - .default(false), - - internal: Joi.boolean() - .description('whether to set internal bit') - .default(false), - - type: Joi.string() - .valid('headers') - .description('type of the exchange') - .default('headers'), - - durable: Joi.boolean() - .description('whether to preserve exchange on rabbitmq restart') - .default(true), - }) - .description('this exchange is used to support delayed retry with QoS exchanges') - .default(), - - queue: Joi.string() - .description('default queue to connect to for consumption'), - - defaultQueueOpts: Joi - .object({ - autoDelete: Joi.boolean(), - - exclusive: Joi.boolean(), - - noWait: Joi.boolean(), - - passive: Joi.boolean(), - - durable: Joi.boolean() - .description('survive restarts & use disk storage') - .default(true), - - arguments: Joi - .object({ - 'x-expires': Joi.number().min(0) - .description('delete queue after it\'s been unused for X seconds'), - - 'x-max-priority': Joi.number().min(2).max(255) - .description('setup priority queues where messages will be delivery based on priority level'), - }) - .default(), - }) - .description('default options for creating consumer queues') - .default(), - - privateQueueOpts: Joi - .object({ - autoDelete: Joi.boolean(), - - exclusive: Joi.boolean(), - - noWait: Joi.boolean(), - - passive: Joi.boolean(), - - durable: Joi.boolean() - .description('survive restarts & use disk storage') - .default(true), - - arguments: Joi - .object({ - 'x-expires': Joi.number().min(0) - .description('delete the private queue after it\'s been unused for 3 minutes') - .default(1800000), - - 'x-max-priority': Joi.number().min(2).max(255) - .description('setup priority queues where messages will be delivery based on priority level'), - }) - .default(), - }) - .description('default options for private RPC queues') - .default(), - - dlx: Joi - .object({ - enabled: Joi.boolean() - .description('enabled DLX by default for fast-reply when messages are dropped') - .default(true), - - params: Joi - .object({ - exchange: Joi.string() - .description('dead letters are redirected here') - .default('amq.headers'), - - type: exchangeTypes - .description('must be headers for proper built-in matching') - .default('headers'), - - autoDelete: Joi.boolean() - .description('DLX persistance') - .default(false), - }) - .default(), - }) - .description('default for dead-letter-exchange') - .default(), - - defaultOpts: Joi - .object({ - deliveryMode: Joi.number().valid(1, 2) - .description('1 - transient, 2 - saved on disk') - .default(1), - - confirm: Joi.boolean() - .description('whether to wait for commit confirmation') - .default(false), - - mandatory: Joi.boolean() - .description('when true and message cant be routed to a queue - exception returned, otherwise its dropped') - .default(false), - - immediate: Joi.boolean() - .description('not implemented by rabbitmq') - .default(false), - - contentType: Joi.string() - .default('application/json') - .description('default content-type for messages'), - - contentEncoding: Joi.string() - .default('plain') - .description('default content-encoding'), - - headers: Joi.object() - .default(), - - simpleResponse: Joi.boolean() - .description('whether to return only response data or include headers etc.') - .default(true), - }) - .description('default options when publishing messages') - .default(), - }) - .assert( - '.dlx.params.exchange', - Joi.any().invalid(Joi.ref('headersExchange.exchange')), - 'must use different headers exchanges' - ); diff --git a/src/schema/backoff.ts b/src/schema/backoff.ts new file mode 100644 index 0000000..498d903 --- /dev/null +++ b/src/schema/backoff.ts @@ -0,0 +1,46 @@ +import * as z from 'zod' + +export enum BackoffPolicy { + Private = 'private', + Consumed = 'consumed', +} + +export const BackoffPolicyEnum = z.nativeEnum(BackoffPolicy) + +export const BackoffPolicyOpts = z.object({ + /** min delay for attempt #1 */ + min: z.number() + .min(0) + .default(250), + + /** max delay */ + max: z.number() + .min(0) + .default(1000), + + /** exponential increase factor */ + factor: z.number() + .min(1) + .default(1.2) +}) + .refine((val) => ( + val.max > val.min + ), { + message: 'min must be less than or equal to max' + }) + +export const BackoffOpts = z.object({ + [BackoffPolicy.Private]: BackoffPolicyOpts + // @ts-expect-error + .default({}), + + [BackoffPolicy.Consumed]: BackoffPolicyOpts + .default({ + min: 500, + max: 5000, + factor: 1.2, + }), +}) + +export type BackoffOpts = z.infer +export type BackoffPolicyOpts = z.infer diff --git a/src/schema/connection.ts b/src/schema/connection.ts new file mode 100644 index 0000000..4bafb52 --- /dev/null +++ b/src/schema/connection.ts @@ -0,0 +1,88 @@ +import * as z from 'zod' + +const kLocalhost = 'localhost' + +export const Host = z.union([ + z.string().transform((it) => { + if (it === '') { + return kLocalhost + } + return it + }), + z.string().array().min(1), + z.object({ + host: z.string().nonempty(), + port: z.number().positive(), + }) + .array() + .min(1) +]) + .default('localhost') + +export const ConnectionOpts = z.object({ + /** rabbitmq host */ + host: Host, + + /** rabbitmq port */ + port: z.number() + .default(5672), + + /** heartbeat check */ + heartbeat: z.number() + .default(10000), + + /** rabbitmq login */ + login: z.string() + .default('guest'), + + /** rabbitmq password */ + password: z.string() + .default('guest'), + + /** rabbitmq virtual host */ + vhost: z.string() + .default('/'), + + /** temporary channel close time with no activity */ + temporaryChannelTimeout: z.number() + .default(6000), + + /** enable auto-reconnect */ + reconnect: z.boolean() + .default(true), + + /** reconnect delay time */ + reconnectDelayTime: z.number() + .default(500), + + /** select host to connect to randomly */ + hostRandom: z.boolean() + .default(false), + + /** whether to use SSL */ + ssl: z.boolean() + .default(false), + + /** TODO: ssl options */ + sslOptions: z.any(), + + /** disable Nagle\'s algorithm */ + noDelay: z.boolean() + .default(true), + + /** options for advertising client properties */ + clientProperties: z.object({ + capabilities: z.object({ + /** whether to react to cancel events */ + consumer_cancel_notify: z.boolean() + .default(true), + }) + // @ts-expect-error + .default({}) + }) + // @ts-expect-error + .default({}) +}) + +export type Host = z.infer +export type ConnectionOpts = z.infer diff --git a/src/schema/dlx.ts b/src/schema/dlx.ts new file mode 100644 index 0000000..37edaf1 --- /dev/null +++ b/src/schema/dlx.ts @@ -0,0 +1,27 @@ +import * as z from 'zod' +import { ExchangeType, ExchangeTypeEnum } from '../exchange' + +export const DeadLetterExchangeOpts = z.object({ + /** enabled DLX by default for fast-reply when messages are dropped */ + enabled: z.boolean() + .default(true), + + params: z + .object({ + /** dead letters are redirected here */ + exchange: z.string() + .default('amq.headers'), + + /** must be headers for proper built-in matching */ + type: ExchangeTypeEnum + .default(ExchangeType.Headers), + + /** DLX persistance */ + autoDelete: z.boolean() + .default(false), + }) + // @ts-expect-error + .default({}) +}) + +export type DeadLetterExchangeOpts = z.infer diff --git a/src/schema/helpers.ts b/src/schema/helpers.ts new file mode 100644 index 0000000..4313bb9 --- /dev/null +++ b/src/schema/helpers.ts @@ -0,0 +1,32 @@ +import * as z from 'zod' + +export const CoercedStringArray = + z.union([ + z.string(), + z.string().array() + ]) + .transform(z.string().array(), str => { + if (Array.isArray(str)) { + return str + } + + return [str] + }) + +export const CoercedUniqStringArray = CoercedStringArray + .refine(val => { + const met = new Set() + + for (const it of val) { + if (met.has(it)) { + return false + } + + met.add(it) + } + + return true + }) + +export type CoercedStringArray = z.infer +export type CoercedUniqStringArray = z.infer diff --git a/src/schema/index.ts b/src/schema/index.ts new file mode 100644 index 0000000..560d3a8 --- /dev/null +++ b/src/schema/index.ts @@ -0,0 +1,119 @@ +import * as z from 'zod' + +import { QueueConfOpts } from '../queue' +import { ConnectionOpts } from './connection' +import { PublishingConfOpts } from './publishing' +import { DeadLetterExchangeOpts } from './dlx' +import { CoercedUniqStringArray } from './helpers' +import { ExchangeConfOpts, ExchangeType } from '../exchange' +import { LoggerLike } from './logger-like' +import { BackoffOpts } from './backoff' + +export const Schema = z.object({ + /** Name of the service when advertising to AMQP */ + name: z.string() + .default('amqp'), + + /** Optional logger instance */ + log: LoggerLike + .optional(), + + /** when true - initializes private queue right away */ + private: z.boolean() + .default(false), + + /** size of LRU cache for responses, 0 to disable it */ + cache: z.number() + .min(0) + .default(100), + + /** default *AndWait timeout */ + timeout: z.number() + .default(10000), + + /** enables debug messages */ + debug: z.boolean() + .default(process.env.NODE_ENV !== 'production'), + + /** attach default queue to these routes on default exchange */ + listen: CoercedUniqStringArray, + + /** advertise end-client service version */ + version: z.string() + .default('n/a'), + + /** if defined - queues will enter QoS mode with required ack & prefetch size of neck */ + neck: z.number() + .min(0), + + /** TODO: set correct type */ + tracer: z.any(), + + /** options for setting up connection to RabbitMQ */ + connection: ConnectionOpts + // @ts-expect-error + .default({}), + + /** recovery settings */ + recovery: BackoffOpts + // @ts-expect-error + .default({}), + + /** default exchange for communication */ + exchange: z.string() + .nonempty() + .default('node-services'), + exchangeArgs: ExchangeConfOpts + // @ts-expect-error + .default({}), + + /** whether to bind queues created by .createConsumedQueue to headersExchange */ + bindPersistentQueueToHeadersExchange: z.boolean() + .default(false), + + /** this exchange is used to support delayed retry with QoS exchanges */ + headersExchange: ExchangeConfOpts.extend({ + /** default headers exchange to use, should be different from DLX headers exchange */ + exchange: z.string() + .default('amq.match'), + + /** type of the exchange */ + type: z.literal(ExchangeType.Headers) + .default(ExchangeType.Headers) + }) + // @ts-expect-error + .default({}), + + /** default queue to connect to for consumption */ + queue: z.string() + .nonempty(), + + /** default options for creating consumer queues */ + defaultQueueOpts: QueueConfOpts + // @ts-expect-error + .default({}), + + /** default options for private RPC queues */ + privateQueueOpts: QueueConfOpts + // @ts-expect-error + .default({}), + + /** default for dead-letter-exchange */ + dlx: DeadLetterExchangeOpts + // @ts-expect-error + .default({}), + + /** default options when publishing messages */ + defaultOpts: PublishingConfOpts + // @ts-expect-error + .default({}), +}) + .refine(opts => ( + opts.dlx.params.exchange !== opts.headersExchange.exchange + ), { + message: 'must use different headers exchanges', + }) + // @ts-expect-error + .default({}) + +export type Schema = z.infer diff --git a/src/schema/logger-like.ts b/src/schema/logger-like.ts new file mode 100644 index 0000000..02bdbe6 --- /dev/null +++ b/src/schema/logger-like.ts @@ -0,0 +1,20 @@ +import * as z from 'zod' + +export interface LogFunction { + (...args: any[]): void +} + +export const LogFunction: z.ZodSchema = z.lazy(() => ( + z.function() +)) + +export const LoggerLike = z.object({ + info: LogFunction, + warn: LogFunction, + trace: LogFunction, + debug: LogFunction, + error: LogFunction, + fatal: LogFunction, +}) + +export type LoggerLike = z.infer diff --git a/src/schema/publishing.ts b/src/schema/publishing.ts new file mode 100644 index 0000000..403a150 --- /dev/null +++ b/src/schema/publishing.ts @@ -0,0 +1,44 @@ +import * as z from 'zod' + +export enum DeliveryMode { + Transient = 1, + SaveOnDisc = 2, +} + +export const DeliveryModeEnum = z.nativeEnum(DeliveryMode) + .default(DeliveryMode.Transient) + +export const PublishingConfOpts = z.object({ + /** 1 - transient, 2 - saved on disk */ + deliveryMode: DeliveryModeEnum, + + /** whether to wait for commit confirmation */ + confirm: z.boolean() + .default(false), + + /** when true and message cant be routed to a queue - exception returned, otherwise its dropped */ + mandatory: z.boolean() + .default(false), + + /** not implemented by rabbitmq */ + immediate: z.boolean() + .default(false), + + /** TODO: enum? */ + /** default content-type for messages */ + contentType: z.string() + .default('application/json'), + + /** default content-encoding */ + contentEncoding: z.string() + .default('plain'), + + /** TODO: type */ + headers: z.any(), + + /** whether to return only response data or include headers etc. */ + simpleResponse: z.boolean() + .default(true), +}) + +export type PublishingConfOpts = z.infer diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..5416931 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,81 @@ +import { Consumer } from './consumer' +import { Queue } from './queue' +import { PublishingConfOpts } from './schema/publishing' +import { AMQP } from './utils/transport' + +export type AnyFunction = (...args: any[]) => any + +export interface PublishingOpts extends PublishingConfOpts { + appId: string + replyTo: string + correlationId: string + timeout?: number + exchange?: string + arguments?: Record +} + +export interface ExtendedMessage { + weight: number + exchange: string + routingKey: string + deliveryTag: string + redelivered: boolean +} + +export interface MessageHeaders extends Record { + contentType: ContentType + contentEncoding: ContentEncoding +} + +export interface RawMessage< + ResponseBody extends any +> extends ExtendedMessage { + raw: Buffer + ack: AnyFunction + data: ResponseBody + size: number + retry: AnyFunction + reject: AnyFunction + properties: MessageHeaders + [x: string]: any +} + +export type MessageProps = MessageHeaders & ExtendedMessage + +export interface MessageHandler< + RequestBody extends any = any, + ResponseBody extends any = any +> { + (payload: RequestBody, properties: PublishingOpts, raw: RawMessage): PromiseLike +} + +export interface MessagePreHandler { + (raw: RawMessage): void +} + +export interface ConsumedQueue { + queue: Queue + options: AMQP.QueueOpts + consumer?: Consumer +} + +export const enum ContentType { + Utf8 = 'string/utf8', + Json = 'application/json', +} + +export const enum ContentEncoding { + Gzip = 'gzip', + Plain = 'plain', +} + +export const enum AMQPTransportEvents { + // pre-processing hook + Pre = 'pre', + Ready = 'ready', + Close = 'close', + Error = 'error', + ConsumerClose = 'consumer-close', + PrivateQueueReady = 'private-queue-ready', + ConsumedQueueReconnected = 'consumed-queue-reconnected', +} diff --git a/src/utils/backoff.ts b/src/utils/backoff.ts new file mode 100644 index 0000000..daf11cf --- /dev/null +++ b/src/utils/backoff.ts @@ -0,0 +1,28 @@ +import { BackoffOpts, BackoffPolicy } from '../schema/backoff' + +/** + * Settings confirm to [policy: string] : settings schema + * @constructor + * @param {Object} settings - Container for policies. + * @param {Object} settings.* - Container for policy settings. + * @param {number} settings.*.min - Min delay for attempt. + * @param {number} settings.*.max - Max delay for attempt. + * @param {number} settings.*.factor - Exponential factor. + */ +export class Backoff { + private readonly policies: BackoffOpts + + constructor(opts: BackoffOpts) { + this.policies = Object.setPrototypeOf({ ...opts }, null); + } + + get(policy: BackoffPolicy, attempt = 0) { + const { min, factor, max } = this.policies[policy] + + if (attempt === 0) return 0 + if (attempt === 1) return min + + return Math.min(Math.round((Math.random() + 1) * min * Math.pow(factor, attempt - 1)), max) + } +} + diff --git a/src/utils/cache.js b/src/utils/cache.js deleted file mode 100644 index 199c4a9..0000000 --- a/src/utils/cache.js +++ /dev/null @@ -1,57 +0,0 @@ -const HLRU = require('hashlru'); -const hash = require('object-hash'); -const is = require('is'); -const latency = require('./latency'); - -class Cache { - constructor(size) { - this.enabled = !!size; - - // if enabled - use it - if (this.enabled) { - this.cache = HLRU(size); - } - } - - get(message, maxAge) { - if (this.enabled === false) { - // eslint-disable-next-line no-console - console.warn('tried to use disabled cache'); - return null; - } - - if (is.number(maxAge) === false) { - return null; - } - - const hashKey = hash(message); - const response = this.cache.get(hashKey); - - if (response !== undefined) { - if (latency(response.maxAge) < maxAge) { - return response; - } - - this.cache.remove(hashKey); - } - - return hashKey; - } - - set(key, data) { - if (this.enabled === false) { - // eslint-disable-next-line no-console - console.warn('tried to use disabled cache'); - return null; - } - - // only use string keys - if (typeof key !== 'string') { - return null; - } - - return this.cache.set(key, { maxAge: process.hrtime(), value: data }); - } -} - -module.exports = Cache; diff --git a/src/utils/cache.ts b/src/utils/cache.ts new file mode 100644 index 0000000..e6e4241 --- /dev/null +++ b/src/utils/cache.ts @@ -0,0 +1,78 @@ +import is from '@sindresorhus/is' +import hashlru from 'hashlru' +import hash from 'object-hash' +import assert from 'assert' + +import { Schema } from '../schema' +import { LoggerLike } from '../schema/logger-like' +const latency = require('./latency') + +type HashLRU = ReturnType + +export interface CacheOpts { + size: Schema['cache'] + log: LoggerLike +} + +export class Cache { + public enabled: boolean + private log: LoggerLike + private cache: HashLRU = hashlru(0) + + constructor({ size, log }: CacheOpts) { + this.log = log + this.enabled = !!size + + // if enabled - use it + if (this.enabled) { + this.cache = hashlru(size) + } + } + + // TODO Message interface + public get(message: any, maxAge: number) { + try { + assert(this.enabled, 'tried to use disabled cache') + return this.#get(message, maxAge) + } catch (e) { + this.log.debug(e.message) + return null + } + } + + public set(key: string, data: any) { + try { + assert(this.enabled, 'tried to use disabled cache') + return this.#set(key, data) + } catch (e) { + this.log.debug(e.message) + return null + } + } + + #get = (message: any, maxAge: number) => { + if (is.number(maxAge) === false) { + return null + } + + const hashKey = hash(message) + const response = this.cache.get(hashKey) + + if (response !== undefined) { + if (latency(response.maxAge) < maxAge) { + return response; + } + + this.cache.remove(hashKey) + } + + return hashKey + } + + #set = (key: string, data: any) => { + return this.cache.set(key, { + maxAge: process.hrtime(), + value: data, + }) + } +} diff --git a/src/utils/entity-store.ts b/src/utils/entity-store.ts new file mode 100644 index 0000000..cc3e36b --- /dev/null +++ b/src/utils/entity-store.ts @@ -0,0 +1,46 @@ +import is from '@sindresorhus/is' +import { AnyFunction } from '../types' + +interface Collection { + get(key: Key): Value | undefined + set(key: Key, value: Value): this + delete(key: Key): boolean + values?: () => IterableIterator +} + +interface CollectionConstructor { + new (entries?: readonly [K, V][] | null): Collection; +} + +export class EntityStore< + Type extends {}, +> { + #store: Collection + #StoreType: CollectionConstructor + + constructor(Store: CollectionConstructor = WeakMap) { + this.#store = new Store() + this.#StoreType = Store + } + + get(handler: AnyFunction) { + return this.#store.get(handler) + } + + store(handler: AnyFunction, value: Type) { + this.#store.set(handler, value) + } + + forget(handler: AnyFunction){ + this.#store.delete(handler) + } + + values() { + if (is.function_(this.#store.values)) { + return this.#store.values() + } + + throw new Error(`The store of ${this.#StoreType} type doesn't support .values()`) + } +} + diff --git a/src/utils/error.js b/src/utils/error.ts similarity index 63% rename from src/utils/error.js rename to src/utils/error.ts index 060e34d..a534e39 100644 --- a/src/utils/error.js +++ b/src/utils/error.ts @@ -1,11 +1,15 @@ -const Errors = require('common-errors'); +import Errors from 'common-errors' +import { MSError } from './serialization' + +import type { LoggerLike } from '../schema/logger-like' +import type { AMQP } from './transport' // error generator -module.exports = function generateErrorMessage(routing, timeout) { - return `job timed out on routing ${routing} after ${timeout} ms`; +export function generateErrorMessage(routing: string, timeout: any) { + return `job timed out on routing ${routing} after ${timeout} ms` }; -module.exports.AmqpDLXError = Errors.helpers.generateClass('AmqpDLXError', { +export const AmqpDLXError = Errors.helpers.generateClass('AmqpDLXError', { args: ['xDeath', 'originalMessage'], // https://www.rabbitmq.com/dlx.html @@ -35,29 +39,69 @@ module.exports.AmqpDLXError = Errors.helpers.generateClass('AmqpDLXError', { * Note that the array is sorted most-recent-first, so the most recent dead-lettering will be recorded in the first entry. */ generateMessage() { - const message = []; + const message: string[] = [] + // TODO rejection entry type + // @ts-expect-error this.xDeath.forEach((rejectionEntry) => { switch (rejectionEntry.reason) { case 'rejected': - message.push(`Rejected from ${rejectionEntry.queue} ${rejectionEntry.count} time(s)`); - break; + message.push(`Rejected from ${rejectionEntry.queue} ${rejectionEntry.count} time(s)`) + break case 'expired': message.push(`Expired from queue "${rejectionEntry.queue}" with routing keys ` + `${JSON.stringify(rejectionEntry['routing-keys'])} ` - + `after ${rejectionEntry['original-expiration']}ms ${rejectionEntry.count} time(s)`); - break; + + `after ${rejectionEntry['original-expiration']}ms ${rejectionEntry.count} time(s)`) + break case 'maxlen': - message.push(`Overflown ${rejectionEntry.queue} ${rejectionEntry.count} time(s)`); - break; + message.push(`Overflown ${rejectionEntry.queue} ${rejectionEntry.count} time(s)`) + break default: - message.push(`Unexpected DLX reason: ${rejectionEntry.reason}`); + message.push(`Unexpected DLX reason: ${rejectionEntry.reason}`) } - }); + }) - return message.join('. '); + return message.join('. ') }, -}); +}) + +// error data that is going to be copied +const copyErrorData = [ + 'code', 'name', 'errors', + 'field', 'reason', 'stack', +] + +type ErrorLike = Record & { + message?: string +} + +/** + * Wraps response error + * @param {Error} originalError + * @returns {Error} + */ +export const wrapError = (originalError: Error | ErrorLike): Error => { + if (originalError instanceof Error) { + return originalError + } + + // this only happens in case of .toJSON on error object + const error = new MSError(originalError.message) + + for (const fieldName of copyErrorData) { + const mixedData = originalError[fieldName] + if (mixedData !== undefined && mixedData !== null) { + // @ts-expect-error + error[fieldName] = mixedData + } + } + + return error +} + +export function on406(this: { log: LoggerLike }, params: any, err: AMQP.ConsumerError) { + this.log.warn({ params }, '[406] error declaring exchange/queue:', err.replyText) +} diff --git a/src/utils/get-app-id.ts b/src/utils/get-app-id.ts new file mode 100644 index 0000000..40aece8 --- /dev/null +++ b/src/utils/get-app-id.ts @@ -0,0 +1,21 @@ +import pkg from '../../package.json' +import { hostname } from 'os' +import { AMQPTransport } from '../amqp-transport' + +export interface AppID { + utils_version: string + name: string + host: string + pid: number + version: string +} + +export const getAppID = (it: AMQPTransport): AppID => { + return { + pid: process.pid, + name: it.config.name, + host: hostname(), + version: it.config.version, + utils_version: pkg.version, + } +} diff --git a/src/utils/init-routing-fn.ts b/src/utils/init-routing-fn.ts new file mode 100644 index 0000000..644ba29 --- /dev/null +++ b/src/utils/init-routing-fn.ts @@ -0,0 +1,80 @@ +import { Tags, FORMAT_TEXT_MAP } from 'opentracing' + +import { AMQPTransport } from '../amqp-transport' +import { safeJSONParse } from './parsing' +import { MessageHandler, PublishingOpts, RawMessage } from '../types' + +/** + * Routing function HOC with reply RPC enhancer + * @param {Function} messageHandler + * @param {AMQPTransport} transport + * @returns {Function} + */ +export const initRoutingFn = < + RequestBody extends any, + ResponseBody extends any +>( + messageHandler: MessageHandler, + transport: AMQPTransport +) => { + /** + * Response Handler Function. Sends Reply or Noop log. + * @param {AMQPMessage} raw - Raw AMQP Message Structure + * @param {Error} error - Error if it happened. + * @param {mixed} data - Response data. + * @returns {Promise<*>} + */ + function responseHandler(this: undefined, raw: RawMessage, error: Error, data: ResponseBody) { + const { properties, span } = raw + return !properties.replyTo || !properties.correlationId + ? transport.noop(error, data, span, raw) + : transport.reply(properties, { error, data }, span, raw) + } + + /** + * Initiates consumer message handler. + * @param {mixed} message - RequestBody passed from the publisher. + * @param {Object} properties - AMQP Message properties. + * @param {Object} raw - Original AMQP message. + * @param {Function} [raw.ack] - Acknowledge if nack is `true`. + * @param {Function} [raw.reject] - Reject if nack is `true`. + * @param {Function} [raw.retry] - Retry msg if nack is `true`. + * @returns {Void} + */ + return function router( + this: AMQPTransport, + message: RequestBody, + properties: PublishingOpts, + raw: RawMessage + ) { + // add instrumentation + const appId = safeJSONParse(properties.appId, this.log); + + // opentracing instrumentation + const childOf = this.tracer.extract( + FORMAT_TEXT_MAP, + properties.headers ?? {} + ) + const span = this.tracer.startSpan(`onConsume:${properties.routingKey}`, { + childOf, + }); + + span.addTags({ + [Tags.SPAN_KIND]: Tags.SPAN_KIND_RPC_SERVER, + [Tags.PEER_SERVICE]: appId.name, + [Tags.PEER_HOSTNAME]: appId.host, + }) + + // define span in the original message + // so that userland has access to it + raw.span = span + + return messageHandler( + message, + properties, + raw, + responseHandler.bind(undefined, raw) + ) + } +} + diff --git a/src/utils/latency.js b/src/utils/latency.js deleted file mode 100644 index 6949ced..0000000 --- a/src/utils/latency.js +++ /dev/null @@ -1,9 +0,0 @@ -function toMiliseconds(hrtime) { - return (hrtime[0] * 1e3) + (Math.round(hrtime[1] / 1e3) / 1e3); -} - -module.exports = function latency(time) { - return toMiliseconds(process.hrtime(time)); -}; - -module.exports.toMiliseconds = toMiliseconds; diff --git a/src/utils/latency.ts b/src/utils/latency.ts new file mode 100644 index 0000000..aae0186 --- /dev/null +++ b/src/utils/latency.ts @@ -0,0 +1,9 @@ +export type HRTime = ReturnType + +export function toMiliseconds(hrtime: HRTime) { + return (hrtime[0] * 1e3) + (Math.round(hrtime[1] / 1e3) / 1e3) +} + +export function latency(time: HRTime) { + return toMiliseconds(process.hrtime(time)) +} diff --git a/src/utils/parsing.ts b/src/utils/parsing.ts new file mode 100644 index 0000000..d3b44b9 --- /dev/null +++ b/src/utils/parsing.ts @@ -0,0 +1,65 @@ +import { promisify } from 'util' +import { gunzip } from 'zlib' + +import { ContentEncoding, ContentType } from '../types' +import { kParseError } from '../constants' +import { jsonDeserializer } from './serialization' +import { LoggerLike } from '../schema/logger-like' + +const gunzipAsync = promisify(gunzip) + +export const safeJSONParse = (data: any, log?: LoggerLike) => { + try { + return JSON.parse(data, jsonDeserializer) + } catch (err) { + if (log) { + log.warn('Error parsing buffer', err, String(data)) + } + + return { err: kParseError } + } +} + +/** + * Parses AMQP message + * @param {Buffer} _data + * @param {String} [contentType='application/json'] + * @param {String} [contentEncoding='plain'] + * @return {Object} + */ +export async function parseInput( + this: { log?: LoggerLike } | null, + data: Buffer, + contentType: ContentType = ContentType.Json, + contentEncoding: ContentEncoding = ContentEncoding.Plain, +){ + let content + + switch (contentEncoding) { + case ContentEncoding.Gzip: + try { + content = await gunzipAsync(data) + } catch (e) { + return { err: kParseError } + } + break + + case ContentEncoding.Plain: + content = data + break + + default: + return { err: kParseError } + } + + switch (contentType) { + // default encoding when we were pre-stringifying and sending str + // and our updated encoding when we send buffer now + case ContentType.Utf8: + case ContentType.Json: + return safeJSONParse(content, this?.log) + + default: + return content + } +} diff --git a/src/utils/recovery.js b/src/utils/recovery.js deleted file mode 100644 index 64b5d84..0000000 --- a/src/utils/recovery.js +++ /dev/null @@ -1,58 +0,0 @@ -const Joi = require('@hapi/joi'); - -/** - * Settings confirm to [policy: string] : settings schema - * @constructor - * @param {Object} settings - Container for policies. - * @param {Object} settings.* - Container for policy settings. - * @param {number} settings.*.min - Min delay for attempt. - * @param {number} settings.*.max - Max delay for attempt. - * @param {number} settings.*.factor - Exponential factor. - */ -class Backoff { - constructor(settings) { - this.settings = Object.setPrototypeOf({ ...settings }, null); - } - - get(policy, attempt = 0) { - const { min, factor, max } = this.settings[policy]; - - if (attempt === 0) return 0; - if (attempt === 1) return min; - - // eslint-disable-next-line no-restricted-properties - return Math.min(Math.round((Math.random() + 1) * min * Math.pow(factor, attempt - 1)), max); - } -} - -Backoff.schema = Joi.object({ - private: Joi.object({ - min: Joi.number().min(0) - .description('min delay for attempt #1') - .default(250), - - max: Joi.number().min(0) - .description('max delay') - .default(1000), - - factor: Joi.number().min(1) - .description('exponential increase factor') - .default(1.2), - }).default(), - - consumed: Joi.object({ - min: Joi.number().min(0) - .description('min delay for attempt #1') - .default(500), - - max: Joi.number().min(0) - .description('max delay') - .default(5000), - - factor: Joi.number().min(1) - .description('exponential increase factor') - .default(1.2), - }).default(), -}); - -module.exports = Backoff; diff --git a/src/utils/reply-storage.js b/src/utils/reply-storage.js deleted file mode 100644 index c6bac1b..0000000 --- a/src/utils/reply-storage.js +++ /dev/null @@ -1,86 +0,0 @@ -const Errors = require('common-errors'); -const generateErrorMessage = require('./error'); - -/** - * In-memory reply storage - */ -class ReplyStorage { - constructor(Type = Map) { - this.storage = new Type(); - this.onTimeout = this.onTimeout.bind(this); - } - - /** - * Invoked on Timeout Error - * @param {string} correlationId - * @returns {Void} - */ - onTimeout(correlationId) { - const { storage } = this; - const { reject, routing, timeout } = storage.get(correlationId); - - // clean-up - storage.delete(correlationId); - - // reject with a timeout error - setImmediate(reject, new Errors.TimeoutError(generateErrorMessage(routing, timeout))); - } - - /** - * Stores correlation ID in the memory storage - * @param {string} correlationId - * @param {Object} opts - Container. - * @param {Function} opts.resolve - promise resolve action. - * @param {Function} opts.reject - promise reject action. - * @param {number} opts.timeout - expected response time. - * @param {string} opts.routing - routing key for error message. - * @param {boolean} opts.simple - whether return body-only response or include headers - * @param {Array[number]} opts.time - process.hrtime() results. - * @returns {Void} - */ - push(correlationId, opts) { - opts.timer = setTimeout(this.onTimeout, opts.timeout, correlationId); - this.storage.set(correlationId, opts); - } - - /** - * Rejects stored promise with an error & cleans up - * Timeout error - * @param {string} correlationId - * @param {Error} error - * @returns {void} - */ - reject(correlationId, error) { - const { storage } = this; - const { timer, reject } = storage.get(correlationId); - - // remove timer - clearTimeout(timer); - - // remove reference - storage.delete(correlationId); - - // now resolve promise and return an error - setImmediate(reject, error); - } - - pop(correlationId) { - const future = this.storage.get(correlationId); - - // if undefind - early return - if (future === undefined) { - return undefined; - } - - // cleanup timeout - clearTimeout(future.timer); - - // remove reference to it - this.storage.delete(correlationId); - - // return data - return future; - } -} - -module.exports = ReplyStorage; diff --git a/src/utils/reply-storage.ts b/src/utils/reply-storage.ts new file mode 100644 index 0000000..1051d90 --- /dev/null +++ b/src/utils/reply-storage.ts @@ -0,0 +1,123 @@ +import { setTimeout } from 'timers' +import { TimeoutError } from 'common-errors' +import { generateErrorMessage } from './error' + +export interface PendingReplyConf extends Pick { + // expected response time + timeout: number + // routing key for error message. + routing: string + // whether return body-only response or include headers + simple: boolean + // process.hrtime() results + time: ReturnType + // cache key + cache: string | null +} + +export interface PendingReply extends PendingReplyConf { + // NodeJS timeout + timer: NodeJS.Timeout +} + +/** + * In-memory reply storage + */ +export class ReplyStorage { + private storage: Map + + constructor(Type: MapConstructor = Map) { + this.storage = new Type() + } + + /** + * Invoked on Timeout Error + * @param {string} correlationId + * @returns {Void} + */ + onTimeout = (correlationId: string) => { + const { storage } = this + const future = storage.get(correlationId) + + // if undefined - early return + if (future === undefined) { + return + } + + const { reject, routing, timeout } = future + + // clean-up + storage.delete(correlationId) + + // reject with a timeout error + setImmediate(reject, new TimeoutError(generateErrorMessage(routing, timeout))) + } + + /** + * Stores correlation ID in the memory storage + * @param {string} correlationId + * @param {Object} opts - Container. + * @param {Function} opts.resolve - promise resolve action. + * @param {Function} opts.reject - promise reject action. + * @param {number} opts.timeout - expected response time. + * @param {string} opts.routing - routing key for error message. + * @param {boolean} opts.simple - whether return body-only response or include headers + * @param {Array[number]} opts.time - process.hrtime() results. + * @returns {Void} + */ + push(correlationId: string, opts: PendingReplyConf) { + (opts as PendingReply).timer = setTimeout( + this.onTimeout, + opts.timeout, + correlationId + ) + + this.storage.set(correlationId, opts as PendingReply) + } + + /** + * Rejects stored promise with an error & cleans up + * Timeout error + * @param {string} correlationId + * @param {Error} error + * @returns {void} + */ + reject(correlationId: string, error: Error) { + const { storage } = this + const future = storage.get(correlationId) + + // if undefined - early return + if (future === undefined) { + return + } + + const { timer, reject } = future + + // remove timer + clearTimeout(timer) + + // remove reference + storage.delete(correlationId) + + // now resolve promise and return an error + setImmediate(reject, error) + } + + pop(correlationId: string) { + const future = this.storage.get(correlationId); + + // if undefined - early return + if (future === undefined) { + return undefined + } + + // cleanup timeout + clearTimeout(future.timer) + + // remove reference to it + this.storage.delete(correlationId) + + // return data + return future + } +} diff --git a/src/utils/response.ts b/src/utils/response.ts new file mode 100644 index 0000000..e4a31ea --- /dev/null +++ b/src/utils/response.ts @@ -0,0 +1,61 @@ +import { MessageHeaders, PublishingOpts } from '../types' + +export interface Message< + Body extends any, + $Error extends Error = Error +> { + data: Body + error?: $Error +} + +export interface Response< + Body extends any, + Headers extends MessageHeaders = MessageHeaders +> { + data: Body, + headers: Headers +} + +export interface ReplyOptions { + simpleResponse?: boolean +} + +/** + * @param {Object} response + * @oaram {Object} response.data + * @oaram {Object} response.headers + * @param {Object} replyOptions + * @param {boolean} replyOptions.simpleResponse + * @returns {Object} + */ +export function adaptResponse( + response: Body | Response, + replyOptions: ReplyOptions +): Body { + return replyOptions.simpleResponse === false + ? response as Body + : (response as Response).data +} + +/** + * @param {mixed} message + * @param {Object} message.data + * @param {Object} message.error + * @param {Object} properties + * @param {Object} properties.headers + */ +export function buildResponse< + Body extends any, + Properties extends PublishingOpts = PublishingOpts, +>( + message: Message, + properties: Properties +) { + const { headers } = properties + const { data } = message + + return { + headers, + data, + } +} diff --git a/src/utils/serialization.js b/src/utils/serialization.js deleted file mode 100644 index 7125d58..0000000 --- a/src/utils/serialization.js +++ /dev/null @@ -1,98 +0,0 @@ -const is = require('is'); -const Errors = require('common-errors'); - -// generate internal error class for passing between amqp -const MSError = Errors.helpers.generateClass('MSError', { - globalize: false, - args: ['message'], -}); - -/** - * Serializes Own Properties of Error - * @param {String} key - * @returns {Object<{ key, value }>} - */ -function serializeOwnProperties(key) { - return { - key, - value: this[key], - }; -} - -/** - * Cached Deserialized Own Properties - * @param {Object<{ key, value }>} data - * @returns {Void} - */ -function deserializeOwnProperties(data) { - this[data.key] = data.value; -} - -/** - * Make sure we can transfer errors via rabbitmq through toJSON() call - * @param {Error} error - * @return {Object} - */ -function serializeError(error) { - // serialized output - const serialized = { - type: 'ms-error', - }; - - serialized.data = Object - .getOwnPropertyNames(error) - .map(serializeOwnProperties, error); - - return serialized; -} - -/** - * Make sure we get a valid JS error - * @param {Object} error - * @return {Error} - */ -function deserializeError(error) { - const deserialized = new MSError(); - error.forEach(deserializeOwnProperties, deserialized); - return deserialized; -} - -function jsonSerializer(key, value) { - if (value instanceof Error) { - return serializeError(value); - } - - if (value && value.error instanceof Error) { - value.error = serializeError(value.error); - } - - return value; -} - -function jsonDeserializer(key, value) { - if (!is.object(value)) { - return value; - } - - const { data } = value; - if (!data) { - return value; - } - - const { type } = value; - switch (type) { - case 'ms-error': - return deserializeError(data); - - case 'Buffer': - case 'buffer': - return Buffer.from(data); - - default: - return value; - } -} - -exports.jsonSerializer = jsonSerializer; -exports.jsonDeserializer = jsonDeserializer; -exports.MSError = MSError; diff --git a/src/utils/serialization.ts b/src/utils/serialization.ts new file mode 100644 index 0000000..ada6b31 --- /dev/null +++ b/src/utils/serialization.ts @@ -0,0 +1,113 @@ +import is from '@sindresorhus/is' +import Errors from 'common-errors' + +export const enum SerializedContentType { + MSError = 'ms-error', + Buffer = 'buffer', +} + +export interface SerializedRecord { + key: any + value: any +} + +export interface Serialized { + type: SerializedContentType + data: SerializedRecord[] +} + +// generate internal error class for passing between amqp +export const MSError = Errors.helpers.generateClass('MSError', { + globalize: false, + args: ['message'], +}); + +const isSerialized = (it: any): it is Serialized => ( + Object.prototype.hasOwnProperty.call(it, 'data') +) + +/** + * Serializes Own Properties of Error + * @param {String} key + * @returns {Object<{ key, value }>} + */ +function serializeOwnProperties(this: any, key: keyof any): SerializedRecord { + return { + key, + value: this[key], + } +} + +/** + * Cached Deserialized Own Properties + * @param {Object<{ key, value }>} data + * @returns {Void} + */ +function deserializeOwnProperties(this: any, data: SerializedRecord) { + this[data.key] = data.value +} + +/** + * Make sure we can transfer errors via rabbitmq through toJSON() call + * @param {Error} error + * @return {Object} + */ +function serializeError(error: Error): Serialized { + // serialized output + const serialized: Partial = { + type: SerializedContentType.MSError, + }; + + serialized.data = Object + .getOwnPropertyNames(error) + .map(serializeOwnProperties, error) + + return serialized as Serialized +} + +/** + * Make sure we get a valid JS error + * @param {Object} error + * @return {Error} + */ +function deserializeError(errors: SerializedRecord[]) { + const error = new MSError() + errors.forEach(deserializeOwnProperties, error) + return error +} + +export function jsonSerializer(_: string, value: any) { + if (value instanceof Error) { + return serializeError(value) + } + + if (value && value.error instanceof Error) { + value.error = serializeError(value.error) + } + + return value +} + +export function jsonDeserializer(_: string, value: Serialized | any) { + if (!is.object(value)) { + return value + } + + if (!isSerialized(value)) { + return value + } + + const { type, data } = value + switch (type) { + case SerializedContentType.MSError: + return deserializeError(data) + + // TODO + // case 'Buffer': + case SerializedContentType.Buffer: + return Buffer.from(data) + + default: + return value + } +} diff --git a/src/utils/transport.js b/src/utils/transport.js deleted file mode 100644 index 5dcdc3a..0000000 --- a/src/utils/transport.js +++ /dev/null @@ -1,29 +0,0 @@ -const Promise = require('bluebird'); - -const kPromisified = Symbol.for('@microfleet/amqp-promisified'); - -// Promisify stuff -['Exchange', 'Queue', 'Connection', 'Consumer', 'Publisher'].forEach((name) => { - const path = require.resolve(`@microfleet/amqp-coffee/bin/src/lib/${name}`); - const mod = require(path); // eslint-disable-line import/no-dynamic-require - - if (mod[kPromisified]) return; - - Promise.promisifyAll(mod.prototype); - mod[kPromisified] = true; -}); - -const amqp = require('@microfleet/amqp-coffee'); - -amqp.prototype.consumeAsync = async function consumeAsync(...args) { - let consumer; - - await Promise.fromCallback((next) => { - consumer = this.consume(...args, next); - }); - - return consumer; -}; - - -module.exports = amqp; diff --git a/src/utils/transport.ts b/src/utils/transport.ts new file mode 100644 index 0000000..22f7dc9 --- /dev/null +++ b/src/utils/transport.ts @@ -0,0 +1,140 @@ +import EventEmitter from 'eventemitter3' +import { RawMessage } from '../types' +import { QueueConfOpts } from '../queue' + +const kPromisified = Symbol.for('@microfleet/amqp-promisified'); + +// Promisify stuff +['Exchange', 'Queue', 'Connection', 'Consumer', 'Publisher'].forEach((name) => { + const path = require.resolve(`@microfleet/amqp-coffee/bin/src/lib/${name}`) + const mod = require(path) // eslint-disable-line import/no-dynamic-require + + if (mod[kPromisified]) return + + // @ts-expect-error + Promise.promisifyAll(mod.prototype) + mod[kPromisified] = true +}); + +const amqp = require('@microfleet/amqp-coffee') + +amqp.prototype.consumeAsync = async function consumeAsync(...args: any[]) { + let consumer + + // @ts-expect-error + await Promise.fromCallback((next) => { + consumer = this.consume(...args, next) + }); + + return consumer +} + +export namespace AMQP { + export interface Instance extends EventEmitter { + new(config: any, next: (err: any, value?: any) => void): Instance + + [k: string]: any + state: 'opening' | 'open' | 'reconnecting' + serverProperties: ServerProperties + + queueAsync(opts: QueueOpts): Promise + consumeAsync< + RawBody extends any = any + >( + queue: string, + opts: ConsumerOpts, + handler: IncomingMessageHandler + ): Promise + exchangeAsync(opts: ExchangeOpts): Promise + } + + export interface IncomingMessageHandler { + (incoming: RawMessage): void + } + + export interface ServerProperties { + cluster_name: string + version: string + [k: string]: any + } + + export interface Queue { + _routes: string[] + queueOptions: QueueOpts + + bindAsync(exchange: string, routingKey: string, options?: QueueOpts): Promise + unbindAsync(exchange: string, route: string): Promise + + [k: string]: any + } + + export interface QueueOpts extends QueueConfOpts { + queue: string + arguments: QueueConfOpts['arguments'] & { + 'x-match'?: string + } + } + + export interface Consumer extends EventEmitter { + [k: string]: any + } + + export interface ConsumerOpts extends QueueOpts { + noAck: boolean + prefetchCount?: number + [k: string]: any + } + + export interface ConsumerError extends Error { + replyCode: + | 311 + | 313 + // access-refused 403 + // The client attempted to work with a server entity + // to which it has no access due to security settings. + | 403 + // not-found 404 + // The client attempted to work with a server entity that does not exist. + | 404 + // resource-locked 405 + // The client attempted to work with a server entity + // to which it has no access because another client is working with it. + | 405 + // precondition-failed 406 + // The client requested a method that was not allowed + // because some precondition failed. + | 406 + replyText: string + } + + export interface Exchange { + declareAsync(opts?: ExchangeOpts): Promise + deleteAsync(opts?: ExchangeDeleteOpts): Promise + bindAsync(dstExc: string, routingKey: string, srcExc?: string): Promise + unbindAsync(dstExc: string, routingKey: string, srcExc?: string): Promise + [k: string]: any + } + + export enum ExchangeType { + Topic = 'topic', + Direct = 'direct', + Fanout = 'fanout', + Headers = 'headers', + } + + export interface ExchangeOpts { + exchange: string + type?: ExchangeType + durable?: boolean + autoDelete?: boolean + noWait?: boolean + internal?: boolean + passive?: boolean + } + + export type ExchangeDeleteOpts = Pick & { + ifUnused?: boolean + } +} + +export default amqp as AMQP.Instance diff --git a/test/schema.ts b/test/schema.ts new file mode 100644 index 0000000..cc0bfb3 --- /dev/null +++ b/test/schema.ts @@ -0,0 +1,302 @@ +import { deepStrictEqual, throws } from 'assert' + +import * as sh from '../src/schema/helpers' +import { Schema } from '../src/schema' +import { QueueConfOpts } from '../src/queue' +import { ConnectionOpts, Host } from '../src/schema/connection' +import { DeadLetterExchangeOpts } from '../src/schema/dlx' +import { ExchangeConfOpts, ExchangeType } from '../src/exchange' +import { DeliveryMode, PublishingConfOpts } from '../src/schema/publishing' + +describe('[schema helpers]', () => { + it('should parse string as string[]', () => { + deepStrictEqual(sh.CoercedStringArray.parse('asd'), ['asd']) + }) + + it('should parse string[] as string[]', () => { + const array = [ + 'asd', + 'fda', + ] + deepStrictEqual(sh.CoercedStringArray.parse(array), array) + }) + + it('should parse only unique items in the string[]', () => { + const array = [ + 'asd', + 'fda', + 'asd', + ] + + throws(() => { + sh.CoercedUniqStringArray.parse(array) + }) + }) +}) + +describe('[AMQP exchange opts]', () => { + it('should validate && fill defaults', () => { + const opts: Partial = {} + const result = ExchangeConfOpts.parse(opts) + const expected: ExchangeConfOpts = { + noWait: false, + durable: true, + internal: false, + autoDelete: false, + type: ExchangeType.Topic, + } + + deepStrictEqual(result, expected) + }) + + it('should also validate when some options passed', () => { + const opts: Partial = { + type: ExchangeType.Direct, + noWait: true, + durable: false, + internal: true, + autoDelete: true, + } + const result = ExchangeConfOpts.parse(opts) + + deepStrictEqual(result, opts) + }) +}) + +describe('[AMQP queue opts]', () => { + it('should validate && fill defaults', () => { + const opts: Partial = {} + const result = QueueConfOpts.parse(opts) + const expected: QueueConfOpts = { + durable: true, + arguments: { + 'x-expires': 1800000, + } + } + + deepStrictEqual(result, expected) + }) + + it('should also validate when some options passed', () => { + const opts: Partial = { + noWait: true, + passive: false, + durable: false, + exclusive: false, + autoDelete: true, + arguments: { + 'x-expires': 500, + 'x-max-priority': 50, + } + } + const result = QueueConfOpts.parse(opts) + + deepStrictEqual(result, opts) + }) +}) + +describe('[AMQP DLX opts]', () => { + it('should validate && fill defaults', () => { + const opts: Partial = {} + const result = DeadLetterExchangeOpts.parse(opts) + + deepStrictEqual(result, { + enabled: true, + params: { + exchange: 'amq.headers', + type: ExchangeType.Headers, + autoDelete: false, + } + }) + }) + + it('should also validate when some options passed', () => { + const opts: Partial = { + enabled: false, + params: { + exchange: 'amq.headers.ex', + type: ExchangeType.Fanout, + autoDelete: true, + } + } + const result = DeadLetterExchangeOpts.parse(opts) + + deepStrictEqual(result, opts) + }) +}) + +describe('[AMQP Connection opts && Host]', () => { + it('[host] should return default', () => { + // @ts-expect-error + deepStrictEqual(Host.parse(), 'localhost') + }) + + it('[host] should accept string', () => { + deepStrictEqual(Host.parse('rabbitmq.host'), 'rabbitmq.host') + }) + + it('[host] should accept array of strings', () => { + deepStrictEqual(Host.parse(['rabbit', 'fox', 'moose']), [ + 'rabbit', + 'fox', + 'moose' + ]) + }) + + it('[host] should accept array of objects', () => { + deepStrictEqual(Host.parse([{ + host: 'rabbitmq', + port: 5672, + }]), [{ + host: 'rabbitmq', + port: 5672, + }]) + }) + + it('[connection] should produce defaults', () => { + deepStrictEqual(ConnectionOpts.parse({}), { + host: 'localhost', + port: 5672, + heartbeat: 10000, + login: 'guest', + password: 'guest', + vhost: '/', + temporaryChannelTimeout: 6000, + reconnect: true, + reconnectDelayTime: 500, + hostRandom: false, + ssl: false, + noDelay: true, + clientProperties: { + capabilities: { + consumer_cancel_notify: true, + }, + }, + }) + }) +}) + +describe('[AMQP Publishing opts]', () => { + it('should validate && fill defaults', () => { + deepStrictEqual(PublishingConfOpts.parse({}), { + deliveryMode: DeliveryMode.Transient, + confirm: false, + mandatory: false, + immediate: false, + contentType: 'application/json', + contentEncoding: 'plain', + simpleResponse: true, + }) + }) + + it('should also validate when some options passed', () => { + deepStrictEqual(PublishingConfOpts.parse({ + deliveryMode: DeliveryMode.SaveOnDisc, + confirm: true, + mandatory: true, + immediate: true, + contentType: 'application/any', + contentEncoding: 'gzip', + simpleResponse: false, + }), { + deliveryMode: DeliveryMode.SaveOnDisc, + confirm: true, + mandatory: true, + immediate: true, + contentType: 'application/any', + contentEncoding: 'gzip', + simpleResponse: false, + }) + }) +}) + +describe('[AMQP config schema]', () => { + it('should validate && fill defaults', () => { + deepStrictEqual(Schema.parse({ + queue: 'q', + listen: [ + 'route.v1', + 'route.v2', + ], + neck: 0, + }), { + name: 'amqp', + private: false, + cache: 100, + timeout: 10000, + debug: true, + listen: [ + 'route.v1', + 'route.v2', + ], + version: 'n/a', + neck: 0, + connection: { + host: 'localhost', + port: 5672, + heartbeat: 10000, + login: 'guest', + password: 'guest', + vhost: '/', + temporaryChannelTimeout: 6000, + reconnect: true, + reconnectDelayTime: 500, + hostRandom: false, + ssl: false, + noDelay: true, + clientProperties: { + capabilities: { + consumer_cancel_notify: true, + }, + }, + }, + exchange: 'node-services', + exchangeArgs: { + noWait: false, + durable: true, + internal: false, + autoDelete: false, + type: ExchangeType.Topic, + }, + bindPersistentQueueToHeadersExchange: false, + headersExchange: { + noWait: false, + durable: true, + internal: false, + autoDelete: false, + type: ExchangeType.Headers, + exchange: 'amq.match', + }, + queue: 'q', + defaultQueueOpts: { + durable: true, + arguments: { + 'x-expires': 1800000, + }, + }, + privateQueueOpts: { + durable: true, + arguments: { + 'x-expires': 1800000, + }, + }, + dlx: { + enabled: true, + params: { + exchange: 'amq.headers', + type: ExchangeType.Headers, + autoDelete: false, + } + }, + defaultOpts: { + deliveryMode: DeliveryMode.Transient, + confirm: false, + mandatory: false, + immediate: false, + contentType: 'application/json', + contentEncoding: 'plain', + simpleResponse: true, + } + }) + }) +}) diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 0000000..c8bcd2a --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,16 @@ +{ + "extends": "./tsconfig.json", + "exclude": [ + "test" + ], + "include": [ + "./src/**/*" + ], + "compilerOptions": { + "rootDir": "src", + "outDir": "lib", + "pretty": false, + "inlineSources": false, + "traceResolution": false + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..c052e3b --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,36 @@ +{ + "compilerOptions": { + "target": "ES2019", + "module": "commonjs", + "lib": [ + "ES2015", + "ES2019" + ], + + "declaration": true, + "declarationMap": true, + "noFallthroughCasesInSwitch": false, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "node", + "esModuleInterop": true, + "sourceMap": false, + "allowJs": true, + "resolveJsonModule": true, + + "strict": true, + "strictPropertyInitialization": true, + "stripInternal": false, + + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "noImplicitThis": true, + + "baseUrl": "." + }, + "exclude": [ + "node_modules", + "lib" + ] +} diff --git a/yarn.lock b/yarn.lock index 3c3a095..38f8559 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,58 +2,20 @@ # yarn lockfile v1 -"@babel/cli@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.10.1.tgz#b6e5cd43a17b8f639442ab027976408ebe6d79a0" - integrity sha512-cVB+dXeGhMOqViIaZs3A9OUAe4pKw4SBNdMw6yHJMYR7s4TB+Cei7ThquV/84O19PdIFWuwe03vxxES0BHUm5g== - dependencies: - commander "^4.0.1" - convert-source-map "^1.1.0" - fs-readdir-recursive "^1.1.0" - glob "^7.0.0" - lodash "^4.17.13" - make-dir "^2.1.0" - slash "^2.0.0" - source-map "^0.5.0" - optionalDependencies: - chokidar "^2.1.8" +"@babel/code-frame@^7.0.0": + 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/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": +"@babel/code-frame@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== dependencies: "@babel/highlight" "^7.8.3" -"@babel/code-frame@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff" - integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw== - dependencies: - "@babel/highlight" "^7.10.1" - -"@babel/core@^7.10.2": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.2.tgz#bd6786046668a925ac2bd2fd95b579b92a23b36a" - integrity sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ== - dependencies: - "@babel/code-frame" "^7.10.1" - "@babel/generator" "^7.10.2" - "@babel/helper-module-transforms" "^7.10.1" - "@babel/helpers" "^7.10.1" - "@babel/parser" "^7.10.2" - "@babel/template" "^7.10.1" - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.2" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - "@babel/core@^7.7.5": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.3.tgz#30b0ebb4dd1585de6923a0b4d179e0b9f5d82941" @@ -75,16 +37,6 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.10.1", "@babel/generator@^7.10.2": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.2.tgz#0fa5b5b2389db8bfdfcc3492b551ee20f5dd69a9" - integrity sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA== - dependencies: - "@babel/types" "^7.10.2" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - "@babel/generator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.3.tgz#0e22c005b0a94c1c74eafe19ef78ce53a4d45c03" @@ -95,27 +47,6 @@ lodash "^4.17.13" source-map "^0.5.0" -"@babel/helper-create-class-features-plugin@^7.10.1": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz#7474295770f217dbcf288bf7572eb213db46ee67" - integrity sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ== - dependencies: - "@babel/helper-function-name" "^7.10.1" - "@babel/helper-member-expression-to-functions" "^7.10.1" - "@babel/helper-optimise-call-expression" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - "@babel/helper-replace-supers" "^7.10.1" - "@babel/helper-split-export-declaration" "^7.10.1" - -"@babel/helper-function-name@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz#92bd63829bfc9215aca9d9defa85f56b539454f4" - integrity sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ== - dependencies: - "@babel/helper-get-function-arity" "^7.10.1" - "@babel/template" "^7.10.1" - "@babel/types" "^7.10.1" - "@babel/helper-function-name@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" @@ -125,13 +56,6 @@ "@babel/template" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-get-function-arity@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz#7303390a81ba7cb59613895a192b93850e373f7d" - integrity sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw== - dependencies: - "@babel/types" "^7.10.1" - "@babel/helper-get-function-arity@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" @@ -139,75 +63,11 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-member-expression-to-functions@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz#432967fd7e12a4afef66c4687d4ca22bc0456f15" - integrity sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g== - dependencies: - "@babel/types" "^7.10.1" - -"@babel/helper-module-imports@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz#dd331bd45bccc566ce77004e9d05fe17add13876" - integrity sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg== - dependencies: - "@babel/types" "^7.10.1" - -"@babel/helper-module-transforms@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz#24e2f08ee6832c60b157bb0936c86bef7210c622" - integrity sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg== - dependencies: - "@babel/helper-module-imports" "^7.10.1" - "@babel/helper-replace-supers" "^7.10.1" - "@babel/helper-simple-access" "^7.10.1" - "@babel/helper-split-export-declaration" "^7.10.1" - "@babel/template" "^7.10.1" - "@babel/types" "^7.10.1" - lodash "^4.17.13" - -"@babel/helper-optimise-call-expression@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz#b4a1f2561870ce1247ceddb02a3860fa96d72543" - integrity sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg== - dependencies: - "@babel/types" "^7.10.1" - "@babel/helper-plugin-utils@^7.0.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== -"@babel/helper-plugin-utils@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz#ec5a5cf0eec925b66c60580328b122c01230a127" - integrity sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA== - -"@babel/helper-replace-supers@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz#ec6859d20c5d8087f6a2dc4e014db7228975f13d" - integrity sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.10.1" - "@babel/helper-optimise-call-expression" "^7.10.1" - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.1" - -"@babel/helper-simple-access@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz#08fb7e22ace9eb8326f7e3920a1c2052f13d851e" - integrity sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw== - dependencies: - "@babel/template" "^7.10.1" - "@babel/types" "^7.10.1" - -"@babel/helper-split-export-declaration@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz#c6f4be1cbc15e3a868e4c64a17d5d31d754da35f" - integrity sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g== - dependencies: - "@babel/types" "^7.10.1" - "@babel/helper-split-export-declaration@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" @@ -215,19 +75,10 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-validator-identifier@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5" - integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw== - -"@babel/helpers@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.1.tgz#a6827b7cb975c9d9cef5fd61d919f60d8844a973" - integrity sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw== - dependencies: - "@babel/template" "^7.10.1" - "@babel/traverse" "^7.10.1" - "@babel/types" "^7.10.1" +"@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.8.3": version "7.8.3" @@ -238,75 +89,26 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/highlight@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.1.tgz#841d098ba613ba1a427a2b383d79e35552c38ae0" - integrity sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg== - dependencies: - "@babel/helper-validator-identifier" "^7.10.1" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" - integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== +"@babel/highlight@^7.10.4", "@babel/highlight@^7.8.3": + 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" - esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.10.1", "@babel/parser@^7.10.2": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.2.tgz#871807f10442b92ff97e4783b9b54f6a0ca812d0" - integrity sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ== - "@babel/parser@^7.7.5", "@babel/parser@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.3.tgz#790874091d2001c9be6ec426c2eed47bc7679081" integrity sha512-/V72F4Yp/qmHaTALizEm9Gf2eQHV3QyTL3K0cNfijwnMnb1L+LDlAubb/ZnSdGAVzVSWakujHYs1I26x66sMeQ== -"@babel/plugin-proposal-class-properties@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz#046bc7f6550bb08d9bd1d4f060f5f5a4f1087e01" - integrity sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.10.1" - "@babel/helper-plugin-utils" "^7.10.1" - -"@babel/plugin-transform-strict-mode@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-strict-mode/-/plugin-transform-strict-mode-7.10.1.tgz#e3280680944a217c5f7b6342c1c017fc0e050c66" - integrity sha512-Q8GDTT75F35KgGGW01KcCn3OhEAIJIcMSxMZGcmxjeY8Asj0reAGodt6wN5wfrvSSuPLhmtU1zOaOy3vR8uCRg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.1" - -"@babel/register@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.10.1.tgz#b6567c5cb5049f44bbf8c35d6ff68ca3c43238ed" - integrity sha512-sl96+kB3IA2B9EzpwwBmYadOT14vw3KaXOknGDbJaZCOj52GDA4Tivudq9doCJcB+bEIKCEARZYwRgBBsCGXyg== - dependencies: - find-cache-dir "^2.0.0" - lodash "^4.17.13" - make-dir "^2.1.0" - pirates "^4.0.0" - source-map-support "^0.5.16" - -"@babel/runtime@^7.6.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.3.tgz#0811944f73a6c926bb2ad35e918dcc1bfab279f1" - integrity sha512-fVHx1rzEmwB130VTkLnxR+HmxcTjGzH12LYQcFFoBwakMd3aOMD4OsRN7tGG/UOYE2ektgFrS8uACAoRk1CY0w== +"@babel/runtime@^7.11.2": + version "7.11.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" + integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== dependencies: - regenerator-runtime "^0.13.2" - -"@babel/template@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.1.tgz#e167154a94cb5f14b28dc58f5356d2162f539811" - integrity sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig== - dependencies: - "@babel/code-frame" "^7.10.1" - "@babel/parser" "^7.10.1" - "@babel/types" "^7.10.1" + regenerator-runtime "^0.13.4" "@babel/template@^7.7.4", "@babel/template@^7.8.3": version "7.8.3" @@ -317,21 +119,6 @@ "@babel/parser" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/traverse@^7.10.1": - version "7.10.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.1.tgz#bbcef3031e4152a6c0b50147f4958df54ca0dd27" - integrity sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ== - dependencies: - "@babel/code-frame" "^7.10.1" - "@babel/generator" "^7.10.1" - "@babel/helper-function-name" "^7.10.1" - "@babel/helper-split-export-declaration" "^7.10.1" - "@babel/parser" "^7.10.1" - "@babel/types" "^7.10.1" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - "@babel/traverse@^7.7.4", "@babel/traverse@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.3.tgz#a826215b011c9b4f73f3a893afbc05151358bf9a" @@ -347,15 +134,6 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.10.1", "@babel/types@^7.10.2": - version "7.10.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.2.tgz#30283be31cad0dbf6fb00bd40641ca0ea675172d" - integrity sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng== - dependencies: - "@babel/helper-validator-identifier" "^7.10.1" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - "@babel/types@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" @@ -365,140 +143,155 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@commitlint/cli@^8.3.5": - version "8.3.5" - resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-8.3.5.tgz#6d93a3a8b2437fa978999d3f6a336bcc70be3fd3" - integrity sha512-6+L0vbw55UEdht71pgWOE55SRgb+8OHcEwGDB234VlIBFGK9P2QOBU7MHiYJ5cjdjCQ0rReNrGjOHmJ99jwf0w== - dependencies: - "@commitlint/format" "^8.3.4" - "@commitlint/lint" "^8.3.5" - "@commitlint/load" "^8.3.5" - "@commitlint/read" "^8.3.4" - babel-polyfill "6.26.0" - chalk "2.4.2" - get-stdin "7.0.0" - lodash "4.17.15" - meow "5.0.0" +"@commitlint/cli@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-11.0.0.tgz#698199bc52afed50aa28169237758fa14a67b5d3" + integrity sha512-YWZWg1DuqqO5Zjh7vUOeSX76vm0FFyz4y0cpGMFhrhvUi5unc4IVfCXZ6337R9zxuBtmveiRuuhQqnRRer+13g== + dependencies: + "@babel/runtime" "^7.11.2" + "@commitlint/format" "^11.0.0" + "@commitlint/lint" "^11.0.0" + "@commitlint/load" "^11.0.0" + "@commitlint/read" "^11.0.0" + chalk "4.1.0" + core-js "^3.6.1" + get-stdin "8.0.0" + lodash "^4.17.19" resolve-from "5.0.0" resolve-global "1.0.0" + yargs "^15.1.0" + +"@commitlint/ensure@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-11.0.0.tgz#3e796b968ab5b72bc6f8a6040076406306c987fb" + integrity sha512-/T4tjseSwlirKZdnx4AuICMNNlFvRyPQimbZIOYujp9DSO6XRtOy9NrmvWujwHsq9F5Wb80QWi4WMW6HMaENug== + dependencies: + "@commitlint/types" "^11.0.0" + lodash "^4.17.19" + +"@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/ensure@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-8.3.4.tgz#6931677e4ca0fde71686ae3b7a367261647a341d" - integrity sha512-8NW77VxviLhD16O3EUd02lApMFnrHexq10YS4F4NftNoErKbKaJ0YYedktk2boKrtNRf/gQHY/Qf65edPx4ipw== +"@commitlint/format@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-11.0.0.tgz#ac47b0b9ca46540c0082c721b290794e67bdc51b" + integrity sha512-bpBLWmG0wfZH/svzqD1hsGTpm79TKJWcf6EXZllh2J/LSSYKxGlv967lpw0hNojme0sZd4a/97R3qA2QHWWSLg== dependencies: - lodash "4.17.15" + "@commitlint/types" "^11.0.0" + chalk "^4.0.0" -"@commitlint/execute-rule@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-8.3.4.tgz#1b63f0713b197889d90b76f9eea1abc010d256b1" - integrity sha512-f4HigYjeIBn9f7OuNv5zh2y5vWaAhNFrfeul8CRJDy82l3Y+09lxOTGxfF3uMXKrZq4LmuK6qvvRCZ8mUrVvzQ== +"@commitlint/is-ignored@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-11.0.0.tgz#7b803eda56276dbe7fec51eb1510676198468f39" + integrity sha512-VLHOUBN+sOlkYC4tGuzE41yNPO2w09sQnOpfS+pSPnBFkNUUHawEuA44PLHtDvQgVuYrMAmSWFQpWabMoP5/Xg== + dependencies: + "@commitlint/types" "^11.0.0" + semver "7.3.2" -"@commitlint/format@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-8.3.4.tgz#7cd1f0ba5a3289c8d14d7dac29ee1fc1597fe1d9" - integrity sha512-809wlQ/ND6CLZON+w2Rb3YM2TLNDfU2xyyqpZeqzf2reJNpySMSUAeaO/fNDJSOKIsOsR3bI01rGu6hv28k+Nw== +"@commitlint/lint@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-11.0.0.tgz#01e062cd1b0e7c3d756aa2c246462e0b6a3348a4" + integrity sha512-Q8IIqGIHfwKr8ecVZyYh6NtXFmKw4YSEWEr2GJTB/fTZXgaOGtGFZDWOesCZllQ63f1s/oWJYtVv5RAEuwN8BQ== dependencies: - chalk "^2.0.1" + "@commitlint/is-ignored" "^11.0.0" + "@commitlint/parse" "^11.0.0" + "@commitlint/rules" "^11.0.0" + "@commitlint/types" "^11.0.0" -"@commitlint/is-ignored@^8.3.5": - version "8.3.5" - resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-8.3.5.tgz#e6f59496e1b1ce58020d519cd578ad0f43169199" - integrity sha512-Zo+8a6gJLFDTqyNRx53wQi/XTiz8mncvmWf/4oRG+6WRcBfjSSHY7KPVj5Y6UaLy2EgZ0WQ2Tt6RdTDeQiQplA== - dependencies: - semver "6.3.0" - -"@commitlint/lint@^8.3.5": - version "8.3.5" - resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-8.3.5.tgz#627e75adb1cc803cc723e33cc2ba4aa27cbb9f0c" - integrity sha512-02AkI0a6PU6rzqUvuDkSi6rDQ2hUgkq9GpmdJqfai5bDbxx2939mK4ZO+7apbIh4H6Pae7EpYi7ffxuJgm+3hQ== - dependencies: - "@commitlint/is-ignored" "^8.3.5" - "@commitlint/parse" "^8.3.4" - "@commitlint/rules" "^8.3.4" - babel-runtime "^6.23.0" - lodash "4.17.15" - -"@commitlint/load@^8.3.5": - version "8.3.5" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-8.3.5.tgz#3f059225ede92166ba94cf4c48e3d67c8b08b18a" - integrity sha512-poF7R1CtQvIXRmVIe63FjSQmN9KDqjRtU5A6hxqXBga87yB2VUJzic85TV6PcQc+wStk52cjrMI+g0zFx+Zxrw== - dependencies: - "@commitlint/execute-rule" "^8.3.4" - "@commitlint/resolve-extends" "^8.3.5" - babel-runtime "^6.23.0" - chalk "2.4.2" - cosmiconfig "^5.2.0" - lodash "4.17.15" +"@commitlint/load@^11.0.0": + 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/message@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-8.3.4.tgz#b4e50d14aa6e15a5ad0767b952a7953f3681d768" - integrity sha512-nEj5tknoOKXqBsaQtCtgPcsAaf5VCg3+fWhss4Vmtq40633xLq0irkdDdMEsYIx8rGR0XPBTukqzln9kAWCkcA== +"@commitlint/message@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-11.0.0.tgz#83554c3cbbc884fd07b473593bc3e94bcaa3ee05" + integrity sha512-01ObK/18JL7PEIE3dBRtoMmU6S3ecPYDTQWWhcO+ErA3Ai0KDYqV5VWWEijdcVafNpdeUNrEMigRkxXHQLbyJA== -"@commitlint/parse@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-8.3.4.tgz#d741f8b9104b35d0f4c10938165b20cbf167f81e" - integrity sha512-b3uQvpUQWC20EBfKSfMRnyx5Wc4Cn778bVeVOFErF/cXQK725L1bYFvPnEjQO/GT8yGVzq2wtLaoEqjm1NJ/Bw== +"@commitlint/parse@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-11.0.0.tgz#d18b08cf67c35d02115207d7009306a2e8e7c901" + integrity sha512-DekKQAIYWAXIcyAZ6/PDBJylWJ1BROTfDIzr9PMVxZRxBPc1gW2TG8fLgjZfBP5mc0cuthPkVi91KQQKGri/7A== dependencies: - conventional-changelog-angular "^1.3.3" + conventional-changelog-angular "^5.0.0" conventional-commits-parser "^3.0.0" - lodash "^4.17.11" -"@commitlint/read@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-8.3.4.tgz#81a34283d8cd7b2acdf57829a91761e9c7791455" - integrity sha512-FKv1kHPrvcAG5j+OSbd41IWexsbLhfIXpxVC/YwQZO+FR0EHmygxQNYs66r+GnhD1EfYJYM4WQIqd5bJRx6OIw== +"@commitlint/read@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-11.0.0.tgz#f24240548c63587bba139fa5a364cab926077016" + integrity sha512-37V0V91GSv0aDzMzJioKpCoZw6l0shk7+tRG8RkW1GfZzUIytdg3XqJmM+IaIYpaop0m6BbZtfq+idzUwJnw7g== dependencies: - "@commitlint/top-level" "^8.3.4" - "@marionebl/sander" "^0.6.0" - babel-runtime "^6.23.0" + "@commitlint/top-level" "^11.0.0" + fs-extra "^9.0.0" git-raw-commits "^2.0.0" -"@commitlint/resolve-extends@^8.3.5": - version "8.3.5" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-8.3.5.tgz#8fff800f292ac217ae30b1862f5f9a84b278310a" - integrity sha512-nHhFAK29qiXNe6oH6uG5wqBnCR+BQnxlBW/q5fjtxIaQALgfoNLHwLS9exzbIRFqwJckpR6yMCfgMbmbAOtklQ== +"@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.15" + lodash "^4.17.19" resolve-from "^5.0.0" resolve-global "^1.0.0" -"@commitlint/rules@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-8.3.4.tgz#41da7e16c6b89af268fe81c87a158c1fd2ac82b1" - integrity sha512-xuC9dlqD5xgAoDFgnbs578cJySvwOSkMLQyZADb1xD5n7BNcUJfP8WjT9W1Aw8K3Wf8+Ym/ysr9FZHXInLeaRg== +"@commitlint/rules@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-11.0.0.tgz#bdb310cc6fc55c9f8d7d917a22b69055c535c375" + integrity sha512-2hD9y9Ep5ZfoNxDDPkQadd2jJeocrwC4vJ98I0g8pNYn/W8hS9+/FuNpolREHN8PhmexXbkjrwyQrWbuC0DVaA== dependencies: - "@commitlint/ensure" "^8.3.4" - "@commitlint/message" "^8.3.4" - "@commitlint/to-lines" "^8.3.4" - babel-runtime "^6.23.0" + "@commitlint/ensure" "^11.0.0" + "@commitlint/message" "^11.0.0" + "@commitlint/to-lines" "^11.0.0" + "@commitlint/types" "^11.0.0" -"@commitlint/to-lines@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-8.3.4.tgz#ce24963b6d86dbe51d88d5e3028ab28f38562e2e" - integrity sha512-5AvcdwRsMIVq0lrzXTwpbbG5fKRTWcHkhn/hCXJJ9pm1JidsnidS1y0RGkb3O50TEHGewhXwNoavxW9VToscUA== +"@commitlint/to-lines@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-11.0.0.tgz#86dea151c10eea41e39ea96fa4de07839258a7fe" + integrity sha512-TIDTB0Y23jlCNubDROUVokbJk6860idYB5cZkLWcRS9tlb6YSoeLn1NLafPlrhhkkkZzTYnlKYzCVrBNVes1iw== -"@commitlint/top-level@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-8.3.4.tgz#803fc6e8f5be5efa5f3551761acfca961f1d8685" - integrity sha512-nOaeLBbAqSZNpKgEtO6NAxmui1G8ZvLG+0wb4rvv6mWhPDzK1GNZkCd8FUZPahCoJ1iHDoatw7F8BbJLg4nDjg== +"@commitlint/top-level@^11.0.0": + version "11.0.0" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-11.0.0.tgz#bb2d1b6e5ed3be56874633b59e1f7de118c32783" + integrity sha512-O0nFU8o+Ws+py5pfMQIuyxOtfR/kwtr5ybqTvR+C2lUPer2x6lnQU+OnfD7hPM+A+COIUZWx10mYQvkR3MmtAA== dependencies: - find-up "^4.0.0" + find-up "^5.0.0" -"@hapi/address@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@hapi/address/-/address-4.0.0.tgz#36affb4509b5a6adc628bcc394450f2a7d51d111" - integrity sha512-GDDpkCdSUfkQCznmWUHh9dDN85BWf/V8TFKQ2JLuHdGB4Yy3YTEGBzZxoBNxfNBEvreSR/o+ZxBBSNNEVzY+lQ== +"@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.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.3.tgz#7d1a2b2358552cc04834c0979bd4275362e37085" + integrity sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA== dependencies: - "@hapi/hoek" "^9.0.0" + 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" -"@hapi/address@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@hapi/address/-/address-4.0.1.tgz#267301ddf7bc453718377a6fb3832a2f04a721dd" - integrity sha512-0oEP5UiyV4f3d6cBL8F3Z5S7iWSX39Knnl0lY8i+6gfmmIBj44JCBNtcMgwyS+5v7j3VYavNay0NFHDS+UGQcw== +"@hapi/address@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@hapi/address/-/address-4.1.0.tgz#d60c5c0d930e77456fdcde2598e77302e2955e1d" + integrity sha512-SkszZf13HVgGmChdHo/PxchnSaCJ6cetVqLzyciudzZRT0jcOouIF/Q93mgjw8cce+D+4F4C1Z/WrfFN+O3VHQ== dependencies: "@hapi/hoek" "^9.0.0" @@ -507,32 +300,10 @@ resolved "https://registry.yarnpkg.com/@hapi/formula/-/formula-2.0.0.tgz#edade0619ed58c8e4f164f233cda70211e787128" integrity sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A== -"@hapi/hoek@9.0.2", "@hapi/hoek@^9.0.0": - version "9.0.2" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.0.2.tgz#57597083f763eafbfdc902d16ec868aa787b24d2" - integrity sha512-LyibKv2QnD9BPI5g2L+g85yiIPv3ajYpENGFgy4u0xCLPhXWG1Zdx29neSB8sgX0/wz6k5TMjHzTwJ6+DaBYOA== - -"@hapi/joi@17.1.0": - version "17.1.0" - resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-17.1.0.tgz#cc4000b6c928a6a39b9bef092151b6bdee10ce55" - integrity sha512-ob67RcPlwRWxBzLCnWvcwx5qbwf88I3ykD7gcJLWOTRfLLgosK7r6aeChz4thA3XRvuBfI0KB1tPVl2EQFlPXw== - dependencies: - "@hapi/address" "^4.0.0" - "@hapi/formula" "^2.0.0" - "@hapi/hoek" "^9.0.0" - "@hapi/pinpoint" "^2.0.0" - "@hapi/topo" "^5.0.0" - -"@hapi/joi@^17.1.1": - version "17.1.1" - resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-17.1.1.tgz#9cc8d7e2c2213d1e46708c6260184b447c661350" - integrity sha512-p4DKeZAoeZW4g3u7ZeRo+vCDuSDgSvtsB/NpfjXEHTUjSeINAi/RrVOWiVQ1isaoLzMvFEhe8n5065mQq1AdQg== - dependencies: - "@hapi/address" "^4.0.1" - "@hapi/formula" "^2.0.0" - "@hapi/hoek" "^9.0.0" - "@hapi/pinpoint" "^2.0.0" - "@hapi/topo" "^5.0.0" +"@hapi/hoek@9.1.0", "@hapi/hoek@^9.0.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.1.0.tgz#6c9eafc78c1529248f8f4d92b0799a712b6052c6" + integrity sha512-i9YbZPN3QgfighY/1X1Pu118VUz2Fmmhd6b2n0/O8YVgGGfw0FbUYoA97k7FkpGJ+pLCFEDLUmAPPV4D1kpeFw== "@hapi/pinpoint@^2.0.0": version "2.0.0" @@ -546,6 +317,15 @@ dependencies: "@hapi/hoek" "^9.0.0" +"@iarna/cli@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@iarna/cli/-/cli-1.2.0.tgz#0f7af5e851afe895104583c4ca07377a8094d641" + integrity sha512-ukITQAqVs2n9HGmn3car/Ir7d3ta650iXhrG7pjr3EWdFmJuuOVWgYsu7ftsSe5VifEFFhjxVuX9+8F7L8hwcA== + dependencies: + signal-exit "^3.0.2" + update-notifier "^2.2.0" + yargs "^8.0.2" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b" @@ -561,53 +341,44 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== -"@makeomatic/confidence@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@makeomatic/confidence/-/confidence-5.0.0.tgz#9e74ca3275e36c143c83f7136b5fb0bad2740f99" - integrity sha512-rbVom67f5K3rACJoxgw+dkaMVABH6W1asIRtjaZZC74P56P14EcfN29z+Lq2/5KVIEkIIDOYTujhctklR2W4fQ== +"@makeomatic/confidence@6.0.3": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@makeomatic/confidence/-/confidence-6.0.3.tgz#4d149e10e523d551fb69f8334fcbc2ec06031af3" + integrity sha512-vpuT42SVtCWqjyJjmmOq4VGRvFxnGBogy4eIeSl2JqP8P0RCS8PyfTPV7iiowTcxm3WJ3RWqaxxz9bXwTNM4fQ== dependencies: - "@hapi/hoek" "9.0.2" - "@hapi/joi" "17.1.0" + "@hapi/hoek" "9.1.0" alce "1.x.x" - yargs "15.1.0" + joi "^17.2.1" + yargs "16.0.3" "@makeomatic/deploy@^10.2.1": - version "10.2.1" - resolved "https://registry.yarnpkg.com/@makeomatic/deploy/-/deploy-10.2.1.tgz#f549e609d27294419c66a844054836b2c24e51e7" - integrity sha512-oFKDhLJJVXYY8jAdPYTxivUFC7JdAK3kzi0q2EMJEkV0Lb6o0SkgpgaAf6XdZathNFY6YG6LnntKgySwzkSYHw== + version "10.3.1" + resolved "https://registry.yarnpkg.com/@makeomatic/deploy/-/deploy-10.3.1.tgz#28e60de66205721dd6193f11ea6874451222fdcf" + integrity sha512-u5WEbXcYNZvwf3u1AHjyC00ZC/64c1xrN4mhZJeoCnCxRlJBjyDaOlgvQzvmwd/SWkVqvtxbTX6I335/DUA6nw== dependencies: - "@commitlint/cli" "^8.3.5" + "@commitlint/cli" "^11.0.0" bluebird "^3.7.2" - chrome-launcher "^0.13.0" + chrome-launcher "^0.13.4" chrome-remote-interface "^0.28.1" death "^1.1.0" - find-up "^4.1.0" + find-up "^5.0.0" glob "^7.1.6" - husky "^4.2.3" + husky "^4.3.0" hyperid "^2.0.3" is "^3.2.1" - js-yaml "^3.13.1" + js-yaml "^3.14.0" lodash.get "^4.4.2" lodash.merge "^4.6.2" lodash.set "^4.3.2" - ms-conf "^6.0.1" + ms-conf "^7.0.2" npm-path "^2.0.4" - pino "^5.17.0" + pino "^6.6.1" read-pkg "^5.2.0" rimraf "^3.0.2" - semantic-release "17.0.4" + semantic-release "17.1.1" shelljs "^0.8.3" strip-final-newline "^2.0.0" - yargs "^15.3.1" - -"@marionebl/sander@^0.6.0": - version "0.6.1" - resolved "https://registry.yarnpkg.com/@marionebl/sander/-/sander-0.6.1.tgz#1958965874f24bc51be48875feb50d642fc41f7b" - integrity sha1-GViWWHTyS8Ub5Ih1/rUNZC/EH3s= - dependencies: - graceful-fs "^4.1.3" - mkdirp "^0.5.1" - rimraf "^2.5.2" + yargs "^16.0.3" "@microfleet/amqp-coffee@^1.3.1": version "1.3.1" @@ -641,106 +412,106 @@ fastq "^1.6.0" "@octokit/auth-token@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.0.tgz#b64178975218b99e4dfe948253f0673cbbb59d9f" - integrity sha512-eoOVMjILna7FVQf96iWc3+ZtE/ZT6y8ob8ZzcqKY1ibSQCnu4O/B7pJvzMx5cyZ/RjAff6DAdEb0O0Cjcxidkg== + version "2.4.2" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.2.tgz#10d0ae979b100fa6b72fa0e8e63e27e6d0dbff8a" + integrity sha512-jE/lE/IKIz2v1+/P0u4fJqv0kYwXOTujKemJMFr6FeopsxlIK3+wKDCJGnysg81XID5TgZQbIfuJ5J0lnTiuyQ== dependencies: - "@octokit/types" "^2.0.0" + "@octokit/types" "^5.0.0" "@octokit/core@^2.4.3": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-2.5.0.tgz#4706258893a7ac6ab35d58d2fb9f2d2ba19a41a5" - integrity sha512-uvzmkemQrBgD8xuGbjhxzJN1darJk9L2cS+M99cHrDG2jlSVpxNJVhoV86cXdYBqdHCc9Z995uLCczaaHIYA6Q== + version "2.5.4" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-2.5.4.tgz#f7fbf8e4f86c5cc2497a8887ba2561ec8d358054" + integrity sha512-HCp8yKQfTITYK+Nd09MHzAlP1v3Ii/oCohv0/TW9rhSLvzb98BOVs2QmVYuloE6a3l6LsfyGIwb6Pc4ycgWlIQ== dependencies: "@octokit/auth-token" "^2.4.0" "@octokit/graphql" "^4.3.1" "@octokit/request" "^5.4.0" - "@octokit/types" "^2.0.0" + "@octokit/types" "^5.0.0" before-after-hook "^2.1.0" universal-user-agent "^5.0.0" "@octokit/endpoint@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.1.tgz#16d5c0e7a83e3a644d1ddbe8cded6c3d038d31d7" - integrity sha512-pOPHaSz57SFT/m3R5P8MUu4wLPszokn5pXcB/pzavLTQf2jbU+6iayTvzaY6/BiotuRS0qyEUkx3QglT4U958A== + version "6.0.6" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.6.tgz#4f09f2b468976b444742a1d5069f6fa45826d999" + integrity sha512-7Cc8olaCoL/mtquB7j/HTbPM+sY6Ebr4k2X2y4JoXpVKQ7r5xB4iGQE0IoO58wIPsUk4AzoT65AMEpymSbWTgQ== dependencies: - "@octokit/types" "^2.11.1" - is-plain-object "^3.0.0" - universal-user-agent "^5.0.0" + "@octokit/types" "^5.0.0" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" "@octokit/graphql@^4.3.1": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.3.1.tgz#9ee840e04ed2906c7d6763807632de84cdecf418" - integrity sha512-hCdTjfvrK+ilU2keAdqNBWOk+gm1kai1ZcdjRfB30oA3/T6n53UVJb7w0L5cR3/rhU91xT3HSqCd+qbvH06yxA== + version "4.5.6" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.5.6.tgz#708143ba15cf7c1879ed6188266e7f270be805d4" + integrity sha512-Rry+unqKTa3svswT2ZAuqenpLrzJd+JTv89LTeVa5UM/5OX8o4KTkPL7/1ABq4f/ZkELb0XEK/2IEoYwykcLXg== dependencies: "@octokit/request" "^5.3.0" - "@octokit/types" "^2.0.0" - universal-user-agent "^4.0.0" + "@octokit/types" "^5.0.0" + universal-user-agent "^6.0.0" -"@octokit/plugin-paginate-rest@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.1.0.tgz#915e1052510c3fa4b9855f72b77bf9c2c7368cbc" - integrity sha512-7+/7urDH8cy6DmTwkewysf7/Or9dFtwZK7aQOc/IImjyeHJy+C8CEKOPo7L5Qb+66HyAr/4p/zV76LMVMuiRtA== +"@octokit/plugin-paginate-rest@^2.2.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.4.0.tgz#92f951ddc8a1cd505353fa07650752ca25ed7e93" + integrity sha512-YT6Klz3LLH6/nNgi0pheJnUmTFW4kVnxGft+v8Itc41IIcjl7y1C8TatmKQBbCSuTSNFXO5pCENnqg6sjwpJhg== dependencies: - "@octokit/types" "^2.9.0" + "@octokit/types" "^5.5.0" "@octokit/plugin-request-log@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz#eef87a431300f6148c39a7f75f8cfeb218b2547e" integrity sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw== -"@octokit/plugin-rest-endpoint-methods@3.8.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.8.0.tgz#649fa2f2e5104b015e1f60076958d69eba281a19" - integrity sha512-LUkTgZ53adPFC/Hw6mxvAtShUtGy3zbpcfCAJMWAN7SvsStV4p6TK7TocSv0Aak4TNmDLhbShTagGhpgz9mhYw== +"@octokit/plugin-rest-endpoint-methods@3.17.0": + version "3.17.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.17.0.tgz#d8ba04eb883849dd98666c55bf49d8c9fe7be055" + integrity sha512-NFV3vq7GgoO2TrkyBRUOwflkfTYkFKS0tLAPym7RNpkwLCttqShaEGjthOsPEEL+7LFcYv3mU24+F2yVd3npmg== dependencies: - "@octokit/types" "^2.12.1" + "@octokit/types" "^4.1.6" deprecation "^2.3.1" "@octokit/request-error@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.0.tgz#94ca7293373654400fbb2995f377f9473e00834b" - integrity sha512-rtYicB4Absc60rUv74Rjpzek84UbVHGHJRu4fNVlZ1mCcyUPPuzFfG9Rn6sjHrd95DEsmjSt1Axlc699ZlbDkw== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.2.tgz#0e76b83f5d8fdda1db99027ea5f617c2e6ba9ed0" + integrity sha512-2BrmnvVSV1MXQvEkrb9zwzP0wXFNbPJij922kYBTLIlIafukrGOb+ABBT2+c6wZiuyWDH1K1zmjGQ0toN/wMWw== dependencies: - "@octokit/types" "^2.0.0" + "@octokit/types" "^5.0.1" deprecation "^2.0.0" once "^1.4.0" "@octokit/request@^5.3.0", "@octokit/request@^5.4.0": - version "5.4.2" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.2.tgz#74f8e5bbd39dc738a1b127629791f8ad1b3193ee" - integrity sha512-zKdnGuQ2TQ2vFk9VU8awFT4+EYf92Z/v3OlzRaSh4RIP0H6cvW1BFPXq4XYvNez+TPQjqN+0uSkCYnMFFhcFrw== + version "5.4.9" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.9.tgz#0a46f11b82351b3416d3157261ad9b1558c43365" + integrity sha512-CzwVvRyimIM1h2n9pLVYfTDmX9m+KHSgCpqPsY8F1NdEK8IaWqXhSBXsdjOBFZSpEcxNEeg4p0UO9cQ8EnOCLA== dependencies: "@octokit/endpoint" "^6.0.1" "@octokit/request-error" "^2.0.0" - "@octokit/types" "^2.11.1" + "@octokit/types" "^5.0.0" deprecation "^2.0.0" - is-plain-object "^3.0.0" - node-fetch "^2.3.0" + is-plain-object "^5.0.0" + node-fetch "^2.6.1" once "^1.4.0" - universal-user-agent "^5.0.0" + universal-user-agent "^6.0.0" "@octokit/rest@^17.0.0": - version "17.5.2" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-17.5.2.tgz#f072e4d22e1580908148c602914daba8bd50b5cb" - integrity sha512-ceTWIkTmZMOCeFbpWyZz0vMSnSxWFm/g2BF8bqe47RkTFDsE2t9FnHV6qQKOWDTOXKe5KybQcLXyJQhFIJLweg== + version "17.11.2" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-17.11.2.tgz#f3dbd46f9f06361c646230fd0ef8598e59183ead" + integrity sha512-4jTmn8WossTUaLfNDfXk4fVJgbz5JgZE8eCs4BvIb52lvIH8rpVMD1fgRCrHbSd6LRPE5JFZSfAEtszrOq3ZFQ== dependencies: "@octokit/core" "^2.4.3" - "@octokit/plugin-paginate-rest" "^2.1.0" + "@octokit/plugin-paginate-rest" "^2.2.0" "@octokit/plugin-request-log" "^1.0.0" - "@octokit/plugin-rest-endpoint-methods" "3.8.0" + "@octokit/plugin-rest-endpoint-methods" "3.17.0" -"@octokit/types@^2.0.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-2.1.1.tgz#77e80d1b663c5f1f829e5377b728fa3c4fe5a97d" - integrity sha512-89LOYH+d/vsbDX785NOfLxTW88GjNd0lWRz1DVPVsZgg9Yett5O+3MOvwo7iHgvUwbFz0mf/yPIjBkUbs4kxoQ== +"@octokit/types@^4.1.6": + version "4.1.10" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-4.1.10.tgz#e4029c11e2cc1335051775bc1600e7e740e4aca4" + integrity sha512-/wbFy1cUIE5eICcg0wTKGXMlKSbaAxEr00qaBXzscLXpqhcwgXeS6P8O0pkysBhRfyjkKjJaYrvR1ExMO5eOXQ== dependencies: "@types/node" ">= 8" -"@octokit/types@^2.11.1", "@octokit/types@^2.12.1", "@octokit/types@^2.9.0": - version "2.12.1" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-2.12.1.tgz#4a26b4a85ec121043d3b0745b5798f9d8fd968ca" - integrity sha512-LRLR1tjbcCfAmUElvTmMvLEzstpx6Xt/aQVTg2xvd+kHA2Ekp1eWl5t+gU7bcwjXHYEAzh4hH4WH+kS3vh+wRw== +"@octokit/types@^5.0.0", "@octokit/types@^5.0.1", "@octokit/types@^5.5.0": + version "5.5.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-5.5.0.tgz#e5f06e8db21246ca102aa28444cdb13ae17a139b" + integrity sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ== dependencies: "@types/node" ">= 8" @@ -763,9 +534,9 @@ integrity sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg== "@semantic-release/github@^7.0.0": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-7.0.5.tgz#042b515cbae8695aa60bc4ed17722c34512a5b89" - integrity sha512-1nJCMeomspRIXKiFO3VXtkUMbIBEreYLFNBdWoLjvlUNcEK0/pEbupEZJA3XHfJuSzv43u3OLpPhF/JBrMuv+A== + version "7.1.1" + resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-7.1.1.tgz#e998aa9a9cd770838d9f27c64f060c2b686b9d95" + integrity sha512-w8CLCvGVKNe2FPOYQ68OFxFVNNha7YRzptnwTZYdjXYtgTDKw0XVfnMSd9NlJeQPYGfQmIhIVPNBU/cA6zUY0A== dependencies: "@octokit/rest" "^17.0.0" "@semantic-release/error" "^2.2.0" @@ -785,9 +556,9 @@ url-join "^4.0.0" "@semantic-release/npm@^7.0.0": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@semantic-release/npm/-/npm-7.0.5.tgz#61c45691abb863f6939cca6aac958d3c22508632" - integrity sha512-D+oEmsx9aHE1q806NFQwSC9KdBO8ri/VO99eEz0wWbX2jyLqVyWr7t0IjKC8aSnkkQswg/4KN/ZjfF6iz1XOpw== + version "7.0.6" + resolved "https://registry.yarnpkg.com/@semantic-release/npm/-/npm-7.0.6.tgz#1301bd57d246eae048d7104a735467bb0829f3d8" + integrity sha512-F4judxdeLe8f7+vDva1TkqNc5Tb2tcltZYW0tLtvP2Xt7CD/gGiz7UxAWEOPsXBvIqAP+uTidvGLPl9U3/uRoQ== dependencies: "@semantic-release/error" "^2.2.0" aggregate-error "^3.0.0" @@ -796,7 +567,7 @@ lodash "^4.17.15" nerf-dart "^1.0.0" normalize-url "^5.0.0" - npm "^6.10.3" + npm "^6.13.0" rc "^1.2.8" read-pkg "^5.0.0" registry-auth-token "^4.0.0" @@ -819,17 +590,15 @@ lodash "^4.17.4" read-pkg-up "^7.0.0" -"@sinonjs/commons@^1", "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.0.tgz#f90ffc52a2e519f018b13b6c4da03cbff36ebed6" - integrity sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg== - dependencies: - type-detect "4.0.8" +"@sindresorhus/is@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-3.1.2.tgz#548650de521b344e3781fbdb0ece4aa6f729afb8" + integrity sha512-JiX9vxoKMmu8Y3Zr2RVathBL1Cdu4Nt4MuNWemt1Nc06A0RAin9c5FArkhGsyMBWfCu4zj+9b+GxtjAnE4qqLQ== -"@sinonjs/commons@^1.7.2": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.2.tgz#505f55c74e0272b43f6c52d81946bed7058fc0e2" - integrity sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw== +"@sinonjs/commons@^1", "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.1": + 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" @@ -848,10 +617,10 @@ "@sinonjs/commons" "^1" "@sinonjs/samsam" "^5.0.2" -"@sinonjs/samsam@^5.0.2", "@sinonjs/samsam@^5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.0.3.tgz#86f21bdb3d52480faf0892a480c9906aa5a52938" - integrity sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ== +"@sinonjs/samsam@^5.0.2", "@sinonjs/samsam@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-5.2.0.tgz#fcff83ab86f83b5498f4a967869c079408d9b5eb" + integrity sha512-CaIcyX5cDsjcW/ab7HposFWzV1kC++4HNsfnEdFJa7cP1QIuILAKV+BgfeqRXhcnSAc76r/Rh/O5C+300BwUIw== dependencies: "@sinonjs/commons" "^1.6.0" lodash.get "^4.4.2" @@ -867,90 +636,223 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@types/body-parser@*": + version "1.19.0" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" + integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== + dependencies: + "@types/connect" "*" + "@types/node" "*" + "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== -"@types/eslint-visitor-keys@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" - integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== +"@types/common-errors@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/common-errors/-/common-errors-1.0.1.tgz#5a22d59bd7ed8a917489b781520b64bd054f46c5" + integrity sha512-NVTB6DEoOBlQ8QC7fCCgFn1GLHn0IB8q2BjSilH1Fy4h5XfLc1nz9e8ae8TJ+sYpUDn2TRq4f+VRHK/AnPOzoA== + dependencies: + "@types/express" "*" + +"@types/connect@*": + version "3.4.33" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546" + integrity sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A== + dependencies: + "@types/node" "*" + +"@types/express-serve-static-core@*": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.13.tgz#d9af025e925fc8b089be37423b8d1eac781be084" + integrity sha512-RgDi5a4nuzam073lRGKTUIaL3eF2+H7LJvJ8eUnCI0wA6SNjXc44DCmWNiTLs/AZ7QlsFWZiw/gTG3nSQGL0fA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*": + version "4.17.8" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.8.tgz#3df4293293317e61c60137d273a2e96cd8d5f27a" + integrity sha512-wLhcKh3PMlyA2cNAB9sjM1BntnhPMiM0JOBwPBqttjHev2428MLEB4AYVN+d8s2iyCVZac+o41Pflm/ZH5vLXQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/qs" "*" + "@types/serve-static" "*" "@types/json-schema@^7.0.3": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" - integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== + 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/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/node@*", "@types/node@>= 8": - version "13.5.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.5.0.tgz#4e498dbf355795a611a87ae5ef811a8660d42662" - integrity sha512-Onhn+z72D2O2Pb2ql2xukJ55rglumsVo1H6Fmyi8mlU9SvKdBk/pUSUAiBY/d9bAOF7VVWajX3sths/+g6ZiAQ== +"@types/lodash@^4.14.161": + version "4.14.162" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.162.tgz#65d78c397e0d883f44afbf1f7ba9867022411470" + integrity sha512-alvcho1kRUnnD1Gcl4J+hK0eencvzq9rmzvFPRmP5rPHx9VVsJj6bKLTATPVf9ktgv4ujzh7T+XWKp+jhuODig== + +"@types/mime@*": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.3.tgz#c893b73721db73699943bfc3653b1deb7faa4a3a" + integrity sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q== + +"@types/minimist@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" + integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= + +"@types/mocha@^8.0.3": + version "8.0.3" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.0.3.tgz#51b21b6acb6d1b923bbdc7725c38f9f455166402" + integrity sha512-vyxR57nv8NfcU0GZu8EUXZLTbCMupIUwy95LJ6lllN+JRPG25CwMHoB1q5xKh8YKhQnHYRAn4yW2yuHbf/5xgg== + +"@types/node@*", "@types/node@^14.11.2": + version "14.11.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.8.tgz#fe2012f2355e4ce08bca44aeb3abbb21cf88d33f" + integrity sha512-KPcKqKm5UKDkaYPTuXSx8wEP7vE9GnuaXIZKijwRYcePpZFDVuy2a57LarFKiORbHOuTOOwYzxVxcUzsh2P2Pw== + +"@types/node@>= 8": + version "14.11.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.2.tgz#2de1ed6670439387da1c9f549a2ade2b0a799256" + integrity sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA== "@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/object-hash@^1.3.3": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@types/object-hash/-/object-hash-1.3.4.tgz#079ba142be65833293673254831b5e3e847fe58b" + integrity sha512-xFdpkAkikBgqBdG9vIlsqffDV8GpvnPEzs0IUtr1v3BEB97ijsFQ4RXVbUZwjFThhB4MDSTUfvmxUD5PGx0wXA== + "@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/pino-std-serializers@*": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@types/pino-std-serializers/-/pino-std-serializers-2.4.1.tgz#f8bd52a209c8b3c97d1533b1ba27f57c816382bf" + integrity sha512-17XcksO47M24IVTVKPeAByWUd3Oez7EbIjXpSbzMPhXVzgjGtrOa49gKBwxH9hb8dKv58OelsWQ+A1G1l9S3wQ== + dependencies: + "@types/node" "*" + +"@types/pino@^6.3.1": + version "6.3.2" + resolved "https://registry.yarnpkg.com/@types/pino/-/pino-6.3.2.tgz#3c18fca7a11e7ce4c5c67768cd1cd1f8d1ff541d" + integrity sha512-dLKNzFY35feTD92DLFtFY1YPEngQxlfjczK2iEzwtGhh/M2AlTNyxshcYsbstBA6yc8wpTKYNrmjw+NcppE2YQ== + dependencies: + "@types/node" "*" + "@types/pino-std-serializers" "*" + "@types/sonic-boom" "*" + +"@types/qs@*": + version "6.9.5" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.5.tgz#434711bdd49eb5ee69d90c1d67c354a9a8ecb18b" + integrity sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ== + +"@types/range-parser@*": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" + integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== + "@types/retry@^0.12.0": version "0.12.0" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== -"@typescript-eslint/eslint-plugin@^3.1.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.2.0.tgz#7fb997f391af32ae6ca1dbe56bcefe4dd30bda14" - integrity sha512-t9RTk/GyYilIXt6BmZurhBzuMT9kLKw3fQoJtK9ayv0tXTlznXEAnx07sCLXdkN3/tZDep1s1CEV95CWuARYWA== +"@types/serve-static@*": + version "1.13.5" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.5.tgz#3d25d941a18415d3ab092def846e135a08bbcf53" + integrity sha512-6M64P58N+OXjU432WoLLBQxbA0LRGBCRm7aAGQJ+SMC1IMl0dgRVi9EFfoDcS2a7Xogygk/eGN94CfwU9UF7UQ== + dependencies: + "@types/express-serve-static-core" "*" + "@types/mime" "*" + +"@types/sonic-boom@*": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@types/sonic-boom/-/sonic-boom-0.7.0.tgz#38337036293992a1df65dd3161abddf8fb9b7176" + integrity sha512-AfqR0fZMoUXUNwusgXKxcE9DPlHNDHQp6nKYUd4PSRpLobF5CCevSpyTEBcVZreqaWKCnGBr9KI1fHMTttoB7A== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^4.1.1": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.2.0.tgz#a3d5c11b377b7e18f3cd9c4e87d465fe9432669b" + integrity sha512-zBNRkzvLSwo6y5TG0DVcmshZIYBHKtmzD4N+LYnfTFpzc4bc79o8jNRSb728WV7A4Cegbs+MV5IRAj8BKBgOVQ== dependencies: - "@typescript-eslint/experimental-utils" "3.2.0" + "@typescript-eslint/experimental-utils" "4.2.0" + "@typescript-eslint/scope-manager" "4.2.0" + 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@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.2.0.tgz#4dab8fc9f44f059ec073470a81bb4d7d7d51e6c5" - integrity sha512-UbJBsk+xO9dIFKtj16+m42EvUvsjZbbgQ2O5xSTSfVT1Z3yGkL90DVu0Hd3029FZ5/uBgl+F3Vo8FAcEcqc6aQ== +"@typescript-eslint/experimental-utils@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.2.0.tgz#3d0b5cd4aa61f5eb7aa1e873dea0db1410b062d2" + integrity sha512-5BBj6BjgHEndBaQQpUVzRIPERz03LBc0MCQkHwUaH044FJFL08SwWv/sQftk7gf0ShZ2xZysz0LTwCwNt4Xu3w== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "3.2.0" + "@typescript-eslint/scope-manager" "4.2.0" + "@typescript-eslint/types" "4.2.0" + "@typescript-eslint/typescript-estree" "4.2.0" eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/parser@^3.1.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.2.0.tgz#d9d7867456b1b8ecae9e724269b0bc932f06cbca" - integrity sha512-Vhu+wwdevDLVDjK1lIcoD6ZbuOa93fzqszkaO3iCnmrScmKwyW/AGkzc2UvfE5TCoCXqq7Jyt6SOXjsIlpqF4A== +"@typescript-eslint/parser@^4.1.1": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.2.0.tgz#1879ef400abd73d972e20f14c3522e5b343d1d1b" + integrity sha512-54jJ6MwkOtowpE48C0QJF9iTz2/NZxfKVJzv1ha5imigzHbNSLN9yvbxFFH1KdlRPQrlR8qxqyOvLHHxd397VA== dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "3.2.0" - "@typescript-eslint/typescript-estree" "3.2.0" - eslint-visitor-keys "^1.1.0" + "@typescript-eslint/scope-manager" "4.2.0" + "@typescript-eslint/types" "4.2.0" + "@typescript-eslint/typescript-estree" "4.2.0" + debug "^4.1.1" -"@typescript-eslint/typescript-estree@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.2.0.tgz#c735f1ca6b4d3cd671f30de8c9bde30843e7ead8" - integrity sha512-uh+Y2QO7dxNrdLw7mVnjUqkwO/InxEqwN0wF+Za6eo3coxls9aH9kQ/5rSvW2GcNanebRTmsT5w1/92lAOb1bA== +"@typescript-eslint/scope-manager@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.2.0.tgz#d10e6854a65e175b22a28265d372a97c8cce4bfc" + integrity sha512-Tb402cxxObSxWIVT+PnBp5ruT2V/36yj6gG4C9AjkgRlZpxrLAzWDk3neen6ToMBGeGdxtnfFLoJRUecGz9mYQ== dependencies: + "@typescript-eslint/types" "4.2.0" + "@typescript-eslint/visitor-keys" "4.2.0" + +"@typescript-eslint/types@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.2.0.tgz#6f6b094329e72040f173123832397c7c0b910fc8" + integrity sha512-xkv5nIsxfI/Di9eVwN+G9reWl7Me9R5jpzmZUch58uQ7g0/hHVuGUbbn4NcxcM5y/R4wuJIIEPKPDb5l4Fdmwg== + +"@typescript-eslint/typescript-estree@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.2.0.tgz#9d746240991c305bf225ad5e96cbf57e7fea0551" + integrity sha512-iWDLCB7z4MGkLipduF6EOotdHNtgxuNKnYD54nMS/oitFnsk4S3S/TE/UYXQTra550lHtlv9eGmp+dvN9pUDtA== + dependencies: + "@typescript-eslint/types" "4.2.0" + "@typescript-eslint/visitor-keys" "4.2.0" debug "^4.1.1" - eslint-visitor-keys "^1.1.0" - glob "^7.1.6" + 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.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.2.0.tgz#ae13838e3a260b63ae51021ecaf1d0cdea8dbba5" + integrity sha512-WIf4BNOlFOH2W+YqGWa6YKLcK/EB3gEj2apCrqLw6mme1RzBy0jtJ9ewJgnrZDB640zfnv8L+/gwGH5sYp/rGw== + dependencies: + "@typescript-eslint/types" "4.2.0" + eslint-visitor-keys "^2.0.0" + JSONStream@^1.0.4, JSONStream@^1.3.4, JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -965,14 +867,14 @@ abbrev@1, abbrev@~1.1.1: integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== acorn-jsx@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" - integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== + version "5.3.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" + integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== -acorn@^7.2.0: - version "7.3.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd" - integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA== +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== agent-base@4, agent-base@^4.3.0: version "4.3.0" @@ -981,11 +883,6 @@ agent-base@4, agent-base@^4.3.0: dependencies: es6-promisify "^5.0.0" -agent-base@5: - version "5.1.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" - integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== - agent-base@6: version "6.0.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.1.tgz#808007e4e5867decb0ab6ab2f928fbdb5a596db4" @@ -1008,17 +905,27 @@ agentkeepalive@^3.4.1: humanize-ms "^1.2.1" aggregate-error@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" - integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: - version "6.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.11.0.tgz#c3607cbc8ae392d8a5a536f25b21f8e5f3f87fe9" - integrity sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA== +ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^6.12.3: + version "6.12.5" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.5.tgz#19b0e8bae8f476e5ba666300387775fb1a00a4da" + integrity sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -1045,18 +952,11 @@ ansi-color@^0.2.1: resolved "https://registry.yarnpkg.com/ansi-color/-/ansi-color-0.2.1.tgz#3e75c037475217544ed763a8db5709fa9ae5bf9a" integrity sha1-PnXAN0dSF1RO12Oo21cJ+prlv5o= -ansi-colors@4.1.1: +ansi-colors@4.1.1, ansi-colors@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-escapes@^4.2.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d" - integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg== - dependencies: - type-fest "^0.8.1" - ansi-escapes@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" @@ -1091,7 +991,7 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.0.0: version "4.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== @@ -1099,6 +999,13 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: "@types/color-name" "^1.1.1" color-convert "^2.0.1" +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" + ansicolors@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" @@ -1109,14 +1016,6 @@ ansistyles@~0.1.3: resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539" integrity sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk= -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.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" @@ -1155,6 +1054,11 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -1172,32 +1076,12 @@ argv@0.0.2: resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab" integrity sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas= -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-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= -array-includes@^3.0.3, array-includes@^3.1.1: +array-includes@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348" integrity sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ== @@ -1211,12 +1095,7 @@ array-union@^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= - -array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.3: +array.prototype.flat@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ== @@ -1261,21 +1140,11 @@ assertion-error@^1.1.0: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== -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== -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - async@^1.4.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -1298,11 +1167,6 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -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== - atomic-sleep@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" @@ -1314,9 +1178,9 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" - integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== + version "1.10.1" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" + integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== babel-plugin-istanbul@^6.0.0: version "6.0.0" @@ -1329,41 +1193,11 @@ babel-plugin-istanbul@^6.0.0: istanbul-lib-instrument "^4.0.0" test-exclude "^6.0.0" -babel-polyfill@6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" - integrity sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM= - dependencies: - babel-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" - -babel-runtime@^6.23.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.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" @@ -1384,10 +1218,10 @@ benchmark@^2.1.4: lodash "^4.17.4" platform "^1.3.3" -bin-links@^1.1.2, bin-links@^1.1.6: - version "1.1.7" - resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.7.tgz#34b79ea9d0e575d7308afeff0c6b2fc24c793359" - integrity sha512-/eaLaTu7G7/o7PV04QPy1HRT65zf+1tFkPGv0sPTV0tRwufooYBQO3zrcyGgm+ja+ZtBf2GEuKjDRJ2pPG+yqA== +bin-links@^1.1.2, bin-links@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-1.1.8.tgz#bd39aadab5dc4bdac222a07df5baf1af745b2228" + integrity sha512-KgmVfx+QqggqP9dA3iIc5pA4T1qEEEL+hOhOhNPaUm77OTrJoOXE/C05SJLNJe6m/2wUK7F1tDSou7n5TfCDzQ== dependencies: bluebird "^3.5.3" cmd-shim "^3.0.0" @@ -1396,22 +1230,10 @@ bin-links@^1.1.2, bin-links@^1.1.6: npm-normalize-package-bin "^1.0.0" write-file-atomic "^2.3.0" -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - binary-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" - integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" + version "2.1.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" + integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5, bluebird@^3.7.2: version "3.7.2" @@ -1444,22 +1266,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1, braces@^2.3.2: - 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, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -1508,9 +1314,9 @@ byte-size@^5.0.1: integrity sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw== cacache@^12.0.0, cacache@^12.0.2, cacache@^12.0.3: - version "12.0.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" - integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== dependencies: bluebird "^3.5.5" chownr "^1.1.1" @@ -1528,21 +1334,6 @@ cacache@^12.0.0, cacache@^12.0.2, cacache@^12.0.3: unique-filename "^1.1.1" y18n "^4.0.0" -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" - caching-transform@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" @@ -1558,38 +1349,19 @@ call-limit@^1.1.1: resolved "https://registry.yarnpkg.com/call-limit/-/call-limit-1.1.1.tgz#ef15f2670db3f1992557e2d965abc459e6e358d4" integrity sha512-5twvci5b9eRBw2wCfPtN0GmlR2/gadZqyFpPhOK6CvMFoFgA+USnZ6Jpu1lhG9h85pQ3Ouil3PfXWRD4EUaRiQ== -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - 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-keys@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" - integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== dependencies: - camelcase "^4.1.0" - map-obj "^2.0.0" - quick-lru "^1.0.0" + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" camelcase@^2.0.1: version "2.1.1" @@ -1606,6 +1378,11 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" + integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== + capture-stack-trace@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" @@ -1636,7 +1413,15 @@ chai@^4.2.0: pathval "^1.1.0" type-detect "^4.0.5" -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.2, chalk@^2.4.2: +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.0.1, chalk@^2.3.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== @@ -1645,28 +1430,15 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.2, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" - integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -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== - check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= -chokidar@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" - integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== +chokidar@3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" + integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -1674,49 +1446,31 @@ chokidar@3.3.1: is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.3.0" + readdirp "~3.4.0" optionalDependencies: fsevents "~2.1.2" -chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chownr@^1.1.1, chownr@^1.1.2, chownr@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" - integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== +chownr@^1.1.1, chownr@^1.1.2, chownr@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== -chrome-launcher@^0.13.0: - version "0.13.1" - resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.13.1.tgz#cd5ed4952b630b9fccf2037b211cba81e5aae044" - integrity sha512-q8UiCNAknw6kCUvCVBTAEw1BwT0vaxabCrSjN3B/NWohp12YBD9+DalymYElSoKRD4KpVSu4CCl0us4v/J81Sg== +chrome-launcher@^0.13.4: + version "0.13.4" + resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.13.4.tgz#4c7d81333c98282899c4e38256da23e00ed32f73" + integrity sha512-nnzXiDbGKjDSK6t2I+35OAPBy5Pw/39bgkb/ZAFwMhwJbdYBp6aH+vW28ZgtjdU890Q7D+3wN/tB8N66q5Gi2A== dependencies: "@types/node" "*" - is-wsl "^2.1.0" + escape-string-regexp "^1.0.5" + is-wsl "^2.2.0" lighthouse-logger "^1.0.0" mkdirp "^0.5.3" rimraf "^3.0.2" chrome-remote-interface@^0.28.1: - version "0.28.1" - resolved "https://registry.yarnpkg.com/chrome-remote-interface/-/chrome-remote-interface-0.28.1.tgz#45b5c2cc3ac652d476367f39e01e1a9a48191201" - integrity sha512-OnVjEOuZtPDImShaWSQPKPZMNnUnoZfLKhayeXUWOyqir3MT1OTqMzUDEnIVx1itPnsW7CiKgyNLLgvgdniJgQ== + version "0.28.2" + resolved "https://registry.yarnpkg.com/chrome-remote-interface/-/chrome-remote-interface-0.28.2.tgz#6be3554d2c227ff07eb74baa7e5d4911da12a5a6" + integrity sha512-F7mjof7rWvRNsJqhVXuiFU/HWySCxTA9tzpLxUJxVfdLkljwFJ1aMp08AnwXRmmP7r12/doTDOMwaNhFCJsacw== dependencies: commander "2.11.x" ws "^7.2.0" @@ -1738,16 +1492,6 @@ cidr-regex@^2.0.10: dependencies: ip-regex "^2.1.0" -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" - clean-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" @@ -1773,13 +1517,6 @@ cli-columns@^3.1.2: string-width "^2.0.0" strip-ansi "^3.0.1" -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - cli-table3@^0.5.0, cli-table3@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -1797,12 +1534,7 @@ cli-table@^0.3.1: dependencies: colors "1.0.3" -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= - -cliui@^3.0.3: +cliui@^3.0.3, cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= @@ -1811,15 +1543,6 @@ cliui@^3.0.3: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -1838,6 +1561,15 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.1.tgz#a4cb67aad45cd83d8d05128fc9f4d8fbb887e6b3" + integrity sha512-rcvHOWyGyid6I1WjT/3NatKj2kDt9OdSHSXpyLXaMWFbKpGACNW8pRhhdPUq9MWUOdwn8Rz9AVETjF4105rZZQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" @@ -1857,24 +1589,16 @@ code-point-at@^1.0.0: integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= codecov@^3.7.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.7.1.tgz#434cb8d55f18ef01672e5739d3d266696bebc202" - integrity sha512-JHWxyPTkMLLJn9SmKJnwAnvY09kg2Os2+Ux+GG7LwZ9g8gzDDISpIN5wAsH1UBaafA/yGcd3KofMaorE8qd6Lw== + version "3.8.0" + resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.8.0.tgz#134bb6ff329711590a91e20441ca1ace66f1528d" + integrity sha512-7E/S7hmq2CJvCMBMu+aRACO9jxQX1HJug/M3ub8+t84R+5Ai2T5sFMxS3W8P41m2A63+VSAAL4U0aBlqZXkJPw== dependencies: argv "0.0.2" ignore-walk "3.0.3" - js-yaml "3.13.1" - teeny-request "6.0.1" + js-yaml "3.14.0" + teeny-request "7.0.1" urlgrey "0.4.4" -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" @@ -1929,44 +1653,29 @@ commander@2.11.x: resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" integrity sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ== -commander@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.0.tgz#545983a0603fe425bc672d66c9e3c89c42121a83" - integrity sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw== - -commander@~2.20.3: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - common-errors@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/common-errors/-/common-errors-1.0.5.tgz#13f8aa9727ca71595d0067895e98ef4ba7fc994e" - integrity sha1-E/iqlyfKcVldAGeJXpjvS6f8mU4= + version "1.2.0" + resolved "https://registry.yarnpkg.com/common-errors/-/common-errors-1.2.0.tgz#5e3903f66fe58d691c1fc1ff881ec692e4a69442" + integrity sha512-HtLF1V6LRACyueMEs+MLwf++1Q7cJLC0FFVStFErYZXXCNuTyVwXp67MTn7Mf7+lAaA5HfUe4cREPTwo0LAXkg== commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -compare-func@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" - integrity sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg= +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== dependencies: array-ify "^1.0.0" - dot-prop "^3.0.0" + dot-prop "^5.1.0" compare-versions@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62" integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== -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" @@ -1991,11 +1700,11 @@ config-chain@^1.1.12: proto-list "~1.2.1" configstore@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f" - integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw== + version "3.1.5" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.5.tgz#e9af331fadc14dabd544d3e7e76dc446a09a530f" + integrity sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA== dependencies: - dot-prop "^4.1.0" + dot-prop "^4.2.1" graceful-fs "^4.1.2" make-dir "^1.0.0" unique-string "^1.0.0" @@ -2017,60 +1726,52 @@ contains-path@^0.1.0: resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= -conventional-changelog-angular@^1.3.3: - version "1.6.6" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz#b27f2b315c16d0a1f23eb181309d0e6a4698ea0f" - integrity sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg== - dependencies: - compare-func "^1.3.1" - q "^1.5.1" - conventional-changelog-angular@^5.0.0: - version "5.0.6" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz#269540c624553aded809c29a3508fdc2b544c059" - integrity sha512-QDEmLa+7qdhVIv8sFZfVxU1VSyVvnXPsxq8Vam49mKUcO1Z8VTLEJk9uI21uiJUsnmm0I4Hrsdc9TgkOQo9WSA== + version "5.0.11" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.11.tgz#99a3ca16e4a5305e0c2c2fae3ef74fd7631fc3fb" + integrity sha512-nSLypht/1yEflhuTogC03i7DX7sOrXGsRn14g131Potqi6cbGbGEE9PSDEHKldabB6N76HiSyw9Ph+kLmC04Qw== dependencies: - compare-func "^1.3.1" + compare-func "^2.0.0" q "^1.5.1" conventional-changelog-writer@^4.0.0: - version "4.0.11" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.11.tgz#9f56d2122d20c96eb48baae0bf1deffaed1edba4" - integrity sha512-g81GQOR392I+57Cw3IyP1f+f42ME6aEkbR+L7v1FBBWolB0xkjKTeCWVguzRrp6UiT1O6gBpJbEy2eq7AnV1rw== + version "4.0.17" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.17.tgz#4753aaa138bf5aa59c0b274cb5937efcd2722e21" + integrity sha512-IKQuK3bib/n032KWaSb8YlBFds+aLmzENtnKtxJy3+HqDq5kohu3g/UdNbIHeJWygfnEbZjnCKFxAW0y7ArZAw== dependencies: - compare-func "^1.3.1" - conventional-commits-filter "^2.0.2" + compare-func "^2.0.0" + conventional-commits-filter "^2.0.6" dateformat "^3.0.0" - handlebars "^4.4.0" + handlebars "^4.7.6" json-stringify-safe "^5.0.1" lodash "^4.17.15" - meow "^5.0.0" + meow "^7.0.0" semver "^6.0.0" split "^1.0.0" through2 "^3.0.0" -conventional-commits-filter@^2.0.0, conventional-commits-filter@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz#f122f89fbcd5bb81e2af2fcac0254d062d1039c1" - integrity sha512-WpGKsMeXfs21m1zIw4s9H5sys2+9JccTzpN6toXtxhpw2VNF2JUXwIakthKBy+LN4DvJm+TzWhxOMWOs1OFCFQ== +conventional-commits-filter@^2.0.0, conventional-commits-filter@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.6.tgz#0935e1240c5ca7698329affee1b6a46d33324c4c" + integrity sha512-4g+sw8+KA50/Qwzfr0hL5k5NWxqtrOVw4DDk3/h6L85a9Gz0/Eqp3oP+CWCNfesBvZZZEFHF7OTEbRe+yYSyKw== dependencies: lodash.ismatch "^4.4.0" modify-values "^1.0.0" conventional-commits-parser@^3.0.0, conventional-commits-parser@^3.0.7: - version "3.0.8" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz#23310a9bda6c93c874224375e72b09fb275fe710" - integrity sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ== + version "3.1.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz#10140673d5e7ef5572633791456c5d03b69e8be4" + integrity sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA== dependencies: JSONStream "^1.0.4" is-text-path "^1.0.1" lodash "^4.17.15" - meow "^5.0.0" + meow "^7.0.0" split2 "^2.0.0" through2 "^3.0.0" trim-off-newlines "^1.0.0" -convert-source-map@^1.1.0, convert-source-map@^1.7.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== @@ -2089,31 +1790,16 @@ copy-concurrently@^1.0.0: rimraf "^2.5.4" run-queue "^1.0.0" -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-js@^2.4.0, core-js@^2.5.0: - version "2.6.11" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" - integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== +core-js@^3.6.1: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cosmiconfig@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - cosmiconfig@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" @@ -2125,6 +1811,17 @@ cosmiconfig@^6.0.0: path-type "^4.0.0" yaml "^1.7.2" +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" + create-error-class@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" @@ -2159,28 +1856,19 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" - integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cross-spawn@^7.0.1: - version "7.0.2" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" - integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== +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" -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== +cross-spawn@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" + integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -2196,24 +1884,15 @@ crypto-random-string@^2.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= -dargs@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" - integrity sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc= - dependencies: - number-is-nan "^1.0.0" +dargs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" + integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== dashdash@^1.12.0: version "1.14.1" @@ -2239,33 +1918,40 @@ debug@3.1.0: dependencies: ms "2.0.0" -debug@3.2.6, debug@^3.1.0: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== +debug@4, debug@^4.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.1" + ms "2.1.2" -debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: +debug@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: ms "^2.1.1" -debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@^2.6.8, debug@^2.6.9: 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@^3.1.0: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= -decamelize-keys@^1.0.0: +decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= @@ -2321,27 +2007,10 @@ define-properties@^1.1.2, define-properties@^1.1.3: dependencies: object-keys "^1.0.12" -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" +delay@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/delay/-/delay-4.4.0.tgz#71abc745f3ce043fe7f450491236541edec4ad0c" + integrity sha512-txgOrJu3OdtOfTiEOT2e76dJVfG/1dz2NZ4F0Pyt4UGZJryssMRp5vdM5wQoLwSOBNdrJv3F9PAhp/heqd7vrA== delayed-stream@~1.0.0: version "1.0.0" @@ -2376,7 +2045,7 @@ dezalgo@^1.0.0, dezalgo@~1.0.3: asap "^2.0.0" wrappy "1" -diff@4.0.2, diff@^4.0.2: +diff@4.0.2, diff@^4.0.1, diff@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== @@ -2403,19 +2072,19 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dot-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" - integrity sha1-G3CK8JSknJoOfbyteQq6U52sEXc= +dot-prop@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" + integrity sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ== dependencies: is-obj "^1.0.0" -dot-prop@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" - integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== +dot-prop@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: - is-obj "^1.0.0" + is-obj "^2.0.0" dotenv@^5.0.1: version "5.0.1" @@ -2473,11 +2142,11 @@ emoji-regex@^8.0.0: integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: - iconv-lite "~0.4.13" + iconv-lite "^0.6.2" end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" @@ -2486,10 +2155,17 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: 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" + env-ci@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/env-ci/-/env-ci-5.0.1.tgz#f5904477d1e1ae7593110c133292171d8b1a5d6c" - integrity sha512-xXgohoOAFFF1Y3EdsSKP7olyH/DLS6ZD3aglV6mDFAXBqBXLJSsZLrOZdYfDs5mOmgNaP3YYynObzwF3QkC24g== + version "5.0.2" + resolved "https://registry.yarnpkg.com/env-ci/-/env-ci-5.0.2.tgz#48b6687f8af8cdf5e31b8fcf2987553d085249d9" + integrity sha512-Xc41mKvjouTXD3Oy9AqySz1IeyvJvHZ20Twf5ZLYbNpPPIuCnL/qHCmNlD01LoNy0JTunw9HPYVptD19Ac7Mbw== dependencies: execa "^4.0.0" java-properties "^1.0.0" @@ -2533,39 +2209,40 @@ error@^7.0.0: dependencies: string-template "~0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1: - version "1.17.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" - integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.4, es-abstract@^1.17.5: + version "1.17.6" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" + integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" + is-callable "^1.2.0" + is-regex "^1.1.0" object-inspect "^1.7.0" object-keys "^1.1.1" object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" -es-abstract@^1.17.4: - version "1.17.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" - integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== +es-abstract@^1.18.0-next.0: + version "1.18.0-next.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.0.tgz#b302834927e624d8e5837ed48224291f2c66e6fc" + integrity sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" + is-callable "^1.2.0" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" object-keys "^1.1.1" object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" es-array-method-boxes-properly@^1.0.0: version "1.0.0" @@ -2611,7 +2288,17 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: +escalade@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.0.tgz#e8e2d7c7a8b76f6ee64c2181d6b8151441602d4e" + integrity sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -2624,44 +2311,36 @@ eslint-ast-utils@^1.1.0: lodash.get "^4.4.2" lodash.zip "^4.2.0" -eslint-config-airbnb-base@14.1.0: - version "14.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.1.0.tgz#2ba4592dd6843258221d9bff2b6831bd77c874e4" - integrity sha512-+XCcfGyCnbzOnktDVhwsCAx+9DmrzEmuwxyHUJpw+kqBVT744OUBrB09khgFKlK1lshVww6qXGsYPZpavoNjJw== +eslint-config-airbnb-base@14.2.0: + version "14.2.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz#fe89c24b3f9dc8008c9c0d0d88c28f95ed65e9c4" + integrity sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q== dependencies: confusing-browser-globals "^1.0.9" object.assign "^4.1.0" - object.entries "^1.1.1" + object.entries "^1.1.2" eslint-config-makeomatic@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/eslint-config-makeomatic/-/eslint-config-makeomatic-5.0.1.tgz#a58726baa7f3b80ce1609efd68c62b3b38ccf459" - integrity sha512-TELtkJ99DYHM9jGbAlzy2VZ+MSJiUu6hnB+txmzsKtUwash7437XQMCifOOQTXVKH2CADGIKpUJzG/yC1Bze4A== - dependencies: - "@typescript-eslint/eslint-plugin" "^3.1.0" - "@typescript-eslint/parser" "^3.1.0" - eslint "7.1.0" - eslint-config-airbnb-base "14.1.0" - eslint-plugin-import "2.20.2" + version "5.0.3" + resolved "https://registry.yarnpkg.com/eslint-config-makeomatic/-/eslint-config-makeomatic-5.0.3.tgz#6055e78f409231af25c26620101bbc99452d452e" + integrity sha512-KWR3MWZQGc6DASqiABc6nwjSiGIWD/zpTo+gkmHHycbjmHC9H5wij312xVZkLUIOKtBI+KqL/02oH22lOb5U6A== + dependencies: + "@typescript-eslint/eslint-plugin" "^4.1.1" + "@typescript-eslint/parser" "^4.1.1" + eslint "7.9.0" + eslint-config-airbnb-base "14.2.0" + eslint-plugin-import "2.22.0" eslint-plugin-promise "4.2.1" - eslint-plugin-unicorn "^20.1.0" + eslint-plugin-unicorn "^21.0.0" -eslint-import-resolver-node@^0.3.2, eslint-import-resolver-node@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404" - integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg== +eslint-import-resolver-node@^0.3.3, eslint-import-resolver-node@^0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" + integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== dependencies: debug "^2.6.9" resolve "^1.13.1" -eslint-module-utils@^2.4.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz#7878f7504824e1b857dd2505b59a8e5eda26a708" - integrity sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q== - dependencies: - debug "^2.6.9" - pkg-dir "^2.0.0" - eslint-module-utils@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" @@ -2670,35 +2349,36 @@ eslint-module-utils@^2.6.0: debug "^2.6.9" pkg-dir "^2.0.0" -eslint-plugin-import@2.20.2: - version "2.20.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz#91fc3807ce08be4837141272c8b99073906e588d" - integrity sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg== +eslint-plugin-import@2.22.0: + version "2.22.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz#92f7736fe1fde3e2de77623c838dd992ff5ffb7e" + integrity sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg== dependencies: - array-includes "^3.0.3" - array.prototype.flat "^1.2.1" + array-includes "^3.1.1" + array.prototype.flat "^1.2.3" contains-path "^0.1.0" debug "^2.6.9" doctrine "1.5.0" - eslint-import-resolver-node "^0.3.2" - eslint-module-utils "^2.4.1" + eslint-import-resolver-node "^0.3.3" + eslint-module-utils "^2.6.0" has "^1.0.3" minimatch "^3.0.4" - object.values "^1.1.0" + object.values "^1.1.1" read-pkg-up "^2.0.0" - resolve "^1.12.0" + resolve "^1.17.0" + tsconfig-paths "^3.9.0" eslint-plugin-import@^2.21.2: - version "2.21.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.21.2.tgz#8fef77475cc5510801bedc95f84b932f7f334a7c" - integrity sha512-FEmxeGI6yaz+SnEB6YgNHlQK1Bs2DKLM+YF+vuTk5H8J9CLbJLtlPvRFgZZ2+sXiKAlN5dpdlrWOjK8ZoZJpQA== + version "2.22.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" + integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== dependencies: array-includes "^3.1.1" array.prototype.flat "^1.2.3" contains-path "^0.1.0" debug "^2.6.9" doctrine "1.5.0" - eslint-import-resolver-node "^0.3.3" + eslint-import-resolver-node "^0.3.4" eslint-module-utils "^2.6.0" has "^1.0.3" minimatch "^3.0.4" @@ -2739,20 +2419,31 @@ eslint-plugin-unicorn@^20.1.0: safe-regex "^2.1.1" semver "^7.3.2" -eslint-scope@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" - integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== +eslint-plugin-unicorn@^21.0.0: + version "21.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-21.0.0.tgz#7e3a8b0f725f003619e1f40d769939ecd8d708d0" + integrity sha512-S8v7+v4gZTQPj4pKKvexhgSUaLQSyItvxW2SVZDaX9Iu5IjlAmF2eni+L6w8a2aqshxgU8Lle4FIAVDtuejSKQ== dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" + ci-info "^2.0.0" + clean-regexp "^1.0.0" + eslint-ast-utils "^1.1.0" + eslint-template-visitor "^2.0.0" + eslint-utils "^2.1.0" + import-modules "^2.0.0" + lodash "^4.17.15" + pluralize "^8.0.0" + read-pkg-up "^7.0.1" + regexp-tree "^0.1.21" + reserved-words "^0.1.2" + safe-regex "^2.1.1" + semver "^7.3.2" -eslint-scope@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" - integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== +eslint-scope@^5.0.0, eslint-scope@^5.1.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.1.0" + esrecurse "^4.3.0" estraverse "^4.1.1" eslint-template-visitor@^2.0.0: @@ -2764,38 +2455,40 @@ eslint-template-visitor@^2.0.0: espree "^7.0.0" multimap "^1.1.0" -eslint-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz#7be1cc70f27a72a76cd14aa698bcabed6890e1cd" - integrity sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA== +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: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" - integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== +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@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.2.0.tgz#74415ac884874495f78ec2a97349525344c981fa" - integrity sha512-WFb4ihckKil6hu3Dp798xdzSfddwKKU3+nGniKF6HfeW6OLd2OUDEPP7TcHtB5+QXOKg2s6B2DaMPE1Nn/kxKQ== +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@7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.1.0.tgz#d9a1df25e5b7859b0a3d86bb05f0940ab676a851" - integrity sha512-DfS3b8iHMK5z/YLSme8K5cge168I8j8o1uiVmFCgnnjxZQbCGyraF8bMl7Ju4yfBmCuxD7shOF7eqGkcuIHfsA== +eslint@7.9.0: + version "7.9.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.9.0.tgz#522aeccc5c3a19017cf0cb46ebfd660a79acf337" + integrity sha512-V6QyhX21+uXp4T+3nrNfI3hQNBDa/P8ga7LoQOenwrlEFXrEnUEE+ok1dMtaS3b6rmLXhT1TkTIsG75HMLbknA== dependencies: "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.1.3" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - eslint-visitor-keys "^1.1.0" - espree "^7.0.0" + enquirer "^2.3.5" + eslint-scope "^5.1.0" + eslint-utils "^2.1.0" + eslint-visitor-keys "^1.3.0" + espree "^7.3.0" esquery "^1.2.0" esutils "^2.0.2" file-entry-cache "^5.0.1" @@ -2805,12 +2498,11 @@ eslint@7.1.0: ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^7.0.0" 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.14" + lodash "^4.17.19" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -2824,20 +2516,22 @@ eslint@7.1.0: v8-compile-cache "^2.0.3" eslint@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.2.0.tgz#d41b2e47804b30dbabb093a967fb283d560082e6" - integrity sha512-B3BtEyaDKC5MlfDa2Ha8/D6DsS4fju95zs0hjS3HdGazw+LNayai38A25qMppK37wWGWNYSPOR6oYzlz5MHsRQ== + version "7.11.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.11.0.tgz#aaf2d23a0b5f1d652a08edacea0c19f7fadc0b3b" + integrity sha512-G9+qtYVCHaDi1ZuWzBsOWo2wSwd70TXnU6UHA3cTYHp7gCTXZcpggWFoUVAMRarg68qtPoNfFbzPh+VdOgmwmw== dependencies: "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.1.3" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.0.1" doctrine "^3.0.0" - eslint-scope "^5.1.0" - eslint-utils "^2.0.0" - eslint-visitor-keys "^1.2.0" - espree "^7.1.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" @@ -2847,12 +2541,11 @@ eslint@^7.2.0: ignore "^4.0.6" import-fresh "^3.0.0" imurmurhash "^0.1.4" - inquirer "^7.0.0" 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.14" + lodash "^4.17.19" minimatch "^3.0.4" natural-compare "^1.4.0" optionator "^0.9.1" @@ -2865,14 +2558,14 @@ eslint@^7.2.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^7.0.0, espree@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.1.0.tgz#a9c7f18a752056735bf1ba14cb1b70adc3a5ce1c" - integrity sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw== +espree@^7.0.0, 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.2.0" + acorn "^7.4.0" acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.2.0" + eslint-visitor-keys "^1.3.0" esprima@^1.2.0: version "1.2.5" @@ -2891,42 +2584,37 @@ esquery@^1.2.0: dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" + estraverse "^5.2.0" estraverse@^1.5.0: version "1.9.3" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= -estraverse@^4.1.0, estraverse@^4.1.1: +estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" - integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== +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== -eventemitter3@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" - integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== - -eventemitter3@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" - integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== +eventemitter3@^4.0.4, eventemitter3@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== execa@^0.7.0: version "0.7.0" @@ -2955,9 +2643,9 @@ execa@^1.0.0: strip-eof "^1.0.0" execa@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.0.tgz#7f37d6ec17f09e6b8fc53288611695b6d12b9daf" - integrity sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA== + version "4.0.3" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2" + integrity sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A== dependencies: cross-spawn "^7.0.0" get-stream "^5.0.0" @@ -2969,62 +2657,11 @@ execa@^4.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -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" - -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" @@ -3036,14 +2673,14 @@ extsprintf@^1.2.0: integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fast-deep-equal@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" - integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + 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-glob@^3.1.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d" - integrity sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A== + 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" @@ -3063,9 +2700,14 @@ fast-levenshtein@^2.0.6: integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fast-redact@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-2.0.0.tgz#17bb8f5e1f56ecf4a38c8455985e5eab4c478431" - integrity sha512-zxpkULI9W9MNTK2sJ3BpPQrTEXFNESd2X6O1tXMFpK/XM0G5c5Rll2EVYZH2TqI3xRGK/VaJ+eEOt7pnENJpeA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-2.1.0.tgz#dfe3c1ca69367fb226f110aa4ec10ec85462ffdf" + integrity sha512-0LkHpTLyadJavq9sRzzyqIoMZemWli77K2/MGOkafrR64B9ItrvZ9aT+jluvNDsv0YEHjSNhlMBtbokuoqii4A== + +fast-redact@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.0.0.tgz#ac2f9e36c9f4976f5db9fb18c6ffbaf308cf316d" + integrity sha512-a/S/Hp6aoIjx7EmugtzLqXmcNsyFszqbt6qQ99BdG61QjBZF6shNis0BYR6TsZOQ1twYc0FN2Xdhwwbv6+KD0w== fast-safe-stringify@^2.0.7: version "2.0.7" @@ -3073,16 +2715,16 @@ fast-safe-stringify@^2.0.7: integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== fastq@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2" - integrity sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA== + version "1.8.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" + integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== dependencies: - reusify "^1.0.0" + reusify "^1.0.4" figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" - integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== figures@^2.0.0: version "2.0.0" @@ -3092,9 +2734,9 @@ figures@^2.0.0: escape-string-regexp "^1.0.5" figures@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec" - integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" @@ -3105,21 +2747,6 @@ file-entry-cache@^5.0.1: dependencies: flat-cache "^2.0.1" -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -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" @@ -3127,15 +2754,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -find-cache-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - find-cache-dir@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.2.0.tgz#e7fe44c1abc1299f516146e563108fd1006c1874" @@ -3150,12 +2768,12 @@ find-npm-prefix@^1.0.2: resolved "https://registry.yarnpkg.com/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz#8d8ce2c78b3b4b9e66c8acc6a37c231eb841cfdf" integrity sha512-KEftzJ+H90x6pcKtdXZEPsQse8/y/UnvzRKrOSQFprnrGaFuJ62fVkP34Iu2IYuMvyauCyoLTNkJZgrrGA2wkA== -find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== +find-up@5.0.0, find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - locate-path "^5.0.0" + locate-path "^6.0.0" path-exists "^4.0.0" find-up@^2.0.0, find-up@^2.1.0: @@ -3172,6 +2790,14 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + find-versions@^3.0.0, find-versions@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e" @@ -3201,9 +2827,9 @@ flatstr@^1.0.12: integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== flatted@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" - integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== flush-write-stream@^1.0.0: version "1.1.1" @@ -3213,11 +2839,6 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -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= - foreground-child@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" @@ -3240,13 +2861,6 @@ form-data@~2.3.2: 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" - from2@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-1.3.0.tgz#88413baaa5f9a597cfde9221d86986cd3c061dfd" @@ -3269,9 +2883,9 @@ fromentries@^1.2.0: integrity sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ== fs-extra@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3" - integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== + version "9.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" + integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== dependencies: at-least-node "^1.0.0" graceful-fs "^4.2.0" @@ -3285,11 +2899,6 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.6.0" -fs-readdir-recursive@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" - integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== - fs-vacuum@^1.2.10, fs-vacuum@~1.2.10: version "1.2.10" resolved "https://registry.yarnpkg.com/fs-vacuum/-/fs-vacuum-1.2.10.tgz#b7629bec07a4031a2548fdf99f5ecf1cc8b31e36" @@ -3314,14 +2923,6 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.7: - version "1.2.11" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" - integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - fsevents@~2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" @@ -3361,10 +2962,10 @@ gensync@^1.0.0-beta.1: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== -gentle-fs@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/gentle-fs/-/gentle-fs-2.3.0.tgz#13538db5029400f98684be4894e8a7d8f0d1ea7f" - integrity sha512-3k2CgAmPxuz7S6nKK+AqFE2AdM1QuwqKLPKzIET3VRwK++3q96MsNFobScDjlCrq97ZJ8y5R725MOlm6ffUCjg== +gentle-fs@^2.3.0, gentle-fs@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/gentle-fs/-/gentle-fs-2.3.1.tgz#11201bf66c18f930ddca72cf69460bdfa05727b1" + integrity sha512-OlwBBwqCFPcjm33rF2BjW+Pr6/ll2741l+xooiwTCeaX2CA1ZuclavyMBe0/KlR21/XGsgY6hzEQZ15BdNa13Q== dependencies: aproba "^1.1.2" chownr "^1.1.2" @@ -3383,7 +2984,7 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-caller-file@^2.0.1: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -3398,10 +2999,10 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stdin@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" - integrity sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ== +get-stdin@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== get-stream@^3.0.0: version "3.0.0" @@ -3416,17 +3017,12 @@ get-stream@^4.0.0, get-stream@^4.1.0: pump "^3.0.0" get-stream@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" - integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== + 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" @@ -3447,28 +3043,20 @@ git-log-parser@^1.2.0: traverse "~0.6.6" git-raw-commits@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.3.tgz#f040e67b8445962d4d168903a9e84c4240c17655" - integrity sha512-SoSsFL5lnixVzctGEi2uykjA7B5I0AhO9x6kdzvGRHbxsa6JSEgrgy1esRKsfOKE1cgyOJ/KDR2Trxu157sb8w== + version "2.0.7" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.7.tgz#02e9357727a9755efa8e14dd5e59b381c29068fb" + integrity sha512-SkwrTqrDxw8y0G1uGJ9Zw13F7qu3LF8V4BifyDeiJCxSnjRGZD9SaoMiMqUvvXMXh6S3sOQ1DsBN7L2fMUZW/g== dependencies: - dargs "^4.0.1" + dargs "^7.0.0" lodash.template "^4.0.2" - meow "^5.0.0" + meow "^7.0.0" split2 "^2.0.0" through2 "^3.0.0" -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" - integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + 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" @@ -3497,16 +3085,16 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^12.1.0: - version "12.3.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13" - integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw== + 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.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.0.tgz#56fd0e9f0d4f8fb0c456f1ab0dee96e1380bc154" - integrity sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg== +globby@^11.0.0, 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" @@ -3532,24 +3120,25 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, 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== growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== -handlebars@^4.4.0: - version "4.7.2" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.2.tgz#01127b3840156a0927058779482031afe0e730d7" - integrity sha512-4PwqDL2laXtTWZghzzCtunQUTLbo31pcCJrd/B/9JP8XbhVzpS5ZXuKqlOzsd1rtcaLo4KqAn8nl8mkknS4MHw== +handlebars@^4.7.6: + version "4.7.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" + integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== dependencies: + minimist "^1.2.5" neo-async "^2.6.0" - optimist "^0.6.1" source-map "^0.6.1" + wordwrap "^1.0.0" optionalDependencies: uglify-js "^3.1.4" @@ -3558,14 +3147,19 @@ har-schema@^2.0.0: resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== +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.5.5" + ajv "^6.12.3" har-schema "^2.0.0" +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -3586,37 +3180,6 @@ has-unicode@^2.0.0, has-unicode@~2.0.1: resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= -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" @@ -3657,17 +3220,17 @@ hook-std@^2.0.0: resolved "https://registry.yarnpkg.com/hook-std/-/hook-std-2.0.0.tgz#ff9aafdebb6a989a354f729bb6445cf4a3a7077c" integrity sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g== -hosted-git-info@^2.1.4, hosted-git-info@^2.7.1, hosted-git-info@^2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" - integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== +hosted-git-info@^2.1.4, hosted-git-info@^2.7.1, hosted-git-info@^2.8.8: + version "2.8.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" + integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== hosted-git-info@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.2.tgz#8b7e3bd114b59b51786f8bade0f39ddc80275a97" - integrity sha512-ezZMWtHXm7Eb7Rq4Mwnx2vs79WUx2QmRg3+ZqeGroKzfDO+EprOcgRPYghsOP9JuYBfK18VojmRTGCg8Ma+ktw== + version "3.0.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.5.tgz#bea87905ef7317442e8df3087faa3c842397df03" + integrity sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ== dependencies: - lru-cache "^5.1.1" + lru-cache "^6.0.0" html-escaper@^2.0.0: version "2.0.0" @@ -3713,14 +3276,6 @@ https-proxy-agent@^2.2.3: agent-base "^4.3.0" debug "^3.1.0" -https-proxy-agent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" - integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg== - dependencies: - agent-base "5" - debug "4" - https-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" @@ -3741,15 +3296,15 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -husky@^4.2.3: - version "4.2.5" - resolved "https://registry.yarnpkg.com/husky/-/husky-4.2.5.tgz#2b4f7622673a71579f901d9885ed448394b5fa36" - integrity sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ== +husky@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.0.tgz#0b2ec1d66424e9219d359e26a51c58ec5278f0de" + integrity sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA== dependencies: chalk "^4.0.0" ci-info "^2.0.0" compare-versions "^3.6.0" - cosmiconfig "^6.0.0" + cosmiconfig "^7.0.0" find-versions "^3.2.0" opencollective-postinstall "^2.0.2" pkg-dir "^4.2.0" @@ -3757,20 +3312,20 @@ husky@^4.2.3: slash "^3.0.0" which-pm-runs "^1.0.0" -hyperid@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/hyperid/-/hyperid-2.0.3.tgz#f3729f54d769a8473dda6471156f871827572a52" - integrity sha512-DjiKJrHehXuu0nDIY8Enzx5DohjoBuxL1wenzv5pQE6MsSp9tyBg/ziM2lxXXPu8L5DF02dsJgUrEQq1fJHVYQ== +hyperid@^2.0.3, hyperid@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/hyperid/-/hyperid-2.0.5.tgz#fecedad4e9868d548c096482917c33090bccd2be" + integrity sha512-kg0+DOmWo3HSFvWWMCQJJhzEB4kg5z/83l4eFDaeAMJ5E2zbQzTEewAmVtOqdRElU9yRFJhCOuegUk0M6RZfiw== dependencies: uuid "^3.4.0" uuid-parse "^1.1.0" -iconv-lite@^0.4.24, iconv-lite@~0.4.13: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== +iconv-lite@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" + integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== dependencies: - safer-buffer ">= 2.1.2 < 3" + safer-buffer ">= 2.1.2 < 3.0.0" iferr@^0.1.5: version "0.1.5" @@ -3795,19 +3350,11 @@ ignore@^4.0.6: integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" - integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" + 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.1.0: +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== @@ -3837,11 +3384,6 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= - indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -3884,29 +3426,10 @@ init-package-json@^1.10.3: validate-npm-package-license "^3.0.1" validate-npm-package-name "^3.0.0" -inquirer@^7.0.0: - version "7.0.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.0.3.tgz#f9b4cd2dff58b9f73e8d43759436ace15bed4567" - integrity sha512-+OiOVeVydu4hnCGLCSX+wedovR/Yzskv9BFqUNNKq9uU2qg7LCcCo3R86S2E7WLo0y/x2pnEZfZe1CoYnORUAw== - dependencies: - ansi-escapes "^4.2.1" - chalk "^2.4.2" - cli-cursor "^3.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.15" - mute-stream "0.0.8" - run-async "^2.2.0" - rxjs "^6.5.3" - string-width "^4.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - interpret@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" - integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== into-stream@^5.0.0: version "5.1.1" @@ -3921,11 +3444,6 @@ invert-kv@^1.0.0: resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" @@ -3936,20 +3454,6 @@ ip@1.1.5: resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= -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-arguments@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" @@ -3960,13 +3464,6 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -3974,20 +3471,15 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -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-buffer@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== -is-callable@^1.1.4, is-callable@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== +is-callable@^1.1.4, is-callable@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" + integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== is-ci@^1.0.10: version "1.2.1" @@ -3997,67 +3489,23 @@ is-ci@^1.0.10: ci-info "^1.5.0" is-cidr@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-3.1.0.tgz#72e233d8e1c4cd1d3f11713fcce3eba7b0e3476f" - integrity sha512-3kxTForpuj8O4iHn0ocsn1jxRm5VYm60GDghK6HXmpn4IyZOoRy9/GmdjFA2yEMqw91TB1/K3bFTuI7FlFNR1g== + version "3.1.1" + resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-3.1.1.tgz#e92ef121bdec2782271a77ce487a8b8df3718ab7" + integrity sha512-Gx+oErgq1j2jAKCR2Kbq0b3wbH0vQKqZ0wOlHxm0o56nq51Cs/DZA8oz9dMDhbHyHEGgJ86eTeVudtgMMOx3Mw== dependencies: cidr-regex "^2.0.10" -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-date-object@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== -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-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -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-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-extglob@^2.1.0, is-extglob@^2.1.1: +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= @@ -4077,14 +3525,7 @@ is-fullwidth-code-point@^2.0.0: 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-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" @@ -4106,18 +3547,16 @@ is-map@^2.0.1: resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== +is-negative-zero@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" + integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= -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" @@ -4128,6 +3567,11 @@ is-obj@^1.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" @@ -4140,36 +3584,22 @@ is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= -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-plain-object@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928" - integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg== - dependencies: - isobject "^4.0.0" - -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= -is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== +is-regex@^1.1.0, is-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== dependencies: - has "^1.0.3" + has-symbols "^1.0.1" is-retry-allowed@^1.0.0: version "1.2.0" @@ -4220,10 +3650,12 @@ is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-wsl@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" - integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== +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" is@^3.2.1, is@^3.3.0: version "3.3.0" @@ -4235,7 +3667,7 @@ isarray@0.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: +isarray@^1.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= @@ -4250,23 +3682,6 @@ isexe@^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= - -isobject@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" - integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== - isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -4361,9 +3776,9 @@ iterate-value@^1.0.0: iterate-iterator "^1.0.1" jaeger-client@^3.18.0: - version "3.18.0" - resolved "https://registry.yarnpkg.com/jaeger-client/-/jaeger-client-3.18.0.tgz#95c9183e06a9b14b957bce33b5e2ddaecb2ed51f" - integrity sha512-xZ9WvZDWLkZFq7SObpLwu1asMCKCgBRNcDxxGSvK+ZQ7OZyJC5xPlU+rJa4+s/P6autPBVwHpqMGbOERFxWuuA== + version "3.18.1" + resolved "https://registry.yarnpkg.com/jaeger-client/-/jaeger-client-3.18.1.tgz#a8c7a778244ba117f4fb8775eb6aa5508703564e" + integrity sha512-eZLM2U6rJvYo0XbzQYFeMYfp29gQix7SKlmDReorp9hJkUwXZtTyxW81AcKdmFCjLHO5tFysTX+394BnjEnUZg== dependencies: node-int64 "^0.4.0" opentracing "^0.14.4" @@ -4376,15 +3791,26 @@ java-properties@^1.0.0: resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211" integrity sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ== +joi@^17.2.1: + version "17.2.1" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.2.1.tgz#e5140fdf07e8fecf9bc977c2832d1bdb1e3f2a0a" + integrity sha512-YT3/4Ln+5YRpacdmfEfrrKh50/kkgX3LgBltjqnlMPIYiZ4hxXZuVJcxmsvxsdeHg9soZfE3qXxHC2tMpCCBOA== + dependencies: + "@hapi/address" "^4.1.0" + "@hapi/formula" "^2.0.0" + "@hapi/hoek" "^9.0.0" + "@hapi/pinpoint" "^2.0.0" + "@hapi/topo" "^5.0.0" + 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, js-yaml@^3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== +js-yaml@3.14.0, js-yaml@^3.13.1, js-yaml@^3.14.0: + 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" @@ -4404,6 +3830,11 @@ json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-bet resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +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" @@ -4438,13 +3869,6 @@ json5@^2.1.0: dependencies: minimist "^1.2.0" -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@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" @@ -4470,30 +3894,11 @@ jsprim@^1.2.2: verror "1.10.0" just-extend@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" - integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== - -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== + version "4.1.1" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.1.1.tgz#158f1fdb01f128c411dc8b286a7b4837b3545282" + integrity sha512-aWgeGFW67BP3e5181Ep1Fv2v8z//iBJfrvyTnq8wG86vEESwmonn1zPBJ0VfmT9CJq2FIT0VsETtrNFm2a+SHA== -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.3: 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== @@ -4517,13 +3922,6 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -4532,10 +3930,10 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -libcipm@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-4.0.7.tgz#76cd675c98bdaae64db88b782b01b804b6d02c8a" - integrity sha512-fTq33otU3PNXxxCTCYCYe7V96o59v/o7bvtspmbORXpgFk+wcWrGf5x6tBgui5gCed/45/wtPomBsZBYm5KbIw== +libcipm@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-4.0.8.tgz#dcea4919e10dfbce420327e63901613b9141bc89" + integrity sha512-IN3hh2yDJQtZZ5paSV4fbvJg4aHxCCg5tcZID/dSVlTuUiWktsgaldVljJv6Z5OUlYspx6xQkbR0efNodnIrOA== dependencies: bin-links "^1.1.2" bluebird "^3.5.1" @@ -4543,7 +3941,7 @@ libcipm@^4.0.7: find-npm-prefix "^1.0.2" graceful-fs "^4.1.11" ini "^1.3.5" - lock-verify "^2.0.2" + lock-verify "^2.1.0" mkdirp "^0.5.1" npm-lifecycle "^3.0.0" npm-logical-tree "^1.2.1" @@ -4652,10 +4050,10 @@ libnpmteam@^1.0.2: get-stream "^4.0.0" npm-registry-fetch "^4.0.0" -libnpx@^10.2.0: - version "10.2.1" - resolved "https://registry.yarnpkg.com/libnpx/-/libnpx-10.2.1.tgz#3d1870efc9ed6caa5b2e909370e15afb8263e350" - integrity sha512-mCWy7qixtNUZCtSFe3PnLsoSftoWh0qH0YgrysBOZKBA0VHrFVSJ9gataAtpEYGgOdhvY4+ABAzT3RJYxamnQQ== +libnpx@^10.2.4: + version "10.2.4" + resolved "https://registry.yarnpkg.com/libnpx/-/libnpx-10.2.4.tgz#ef0e3258e29aef2ec7ee3276115e20e67f67d4ee" + integrity sha512-BPc0D1cOjBeS8VIBKUu5F80s6njm0wbVt7CsGMrIcJ+SI7pi7V0uVPGpEMH9H5L8csOcclTxAXFE2VAsJXUhfA== dependencies: dotenv "^5.0.1" npm-package-arg "^6.0.0" @@ -4664,7 +4062,7 @@ libnpx@^10.2.0: update-notifier "^2.3.0" which "^1.3.0" y18n "^4.0.0" - yargs "^11.0.0" + yargs "^14.2.3" lighthouse-logger@^1.0.0: version "1.2.0" @@ -4722,11 +4120,19 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lock-verify@^2.0.2, lock-verify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.1.0.tgz#fff4c918b8db9497af0c5fa7f6d71555de3ceb47" - integrity sha512-vcLpxnGvrqisKvLQ2C2v0/u7LVly17ak2YSgoK4PrdsYBXQIax19vhKiLfvKNFx7FRrpTnitrpzF/uuCMuorIg== + version "2.2.1" + resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.2.1.tgz#81107948c51ed16f97b96ff8b60675affb243fc1" + integrity sha512-n0Zw2DVupKfZMazy/HIFVNohJ1z8fIoZ77WBnyyBGG6ixw83uJNyrbiJvvHWe1QKkGiBCjj8RCPlymltliqEww== dependencies: + "@iarna/cli" "^1.2.0" npm-package-arg "^6.1.0" semver "^5.4.1" @@ -4865,36 +4271,28 @@ lodash.zip@^4.2.0: resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA= -lodash@4.17.15, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.4: +lodash@^4.17.10: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -lodash@^4.17.15: - version "4.17.19" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== +lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -log-symbols@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== dependencies: - chalk "^2.4.2" + chalk "^4.0.0" long@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/long/-/long-2.4.0.tgz#9fa180bb1d9500cdc29c4156766a1995e1f4524f" integrity sha1-n6GAux2VAM3CnEFWdmoZleH0Uk8= -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - lowercase-keys@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" @@ -4915,10 +4313,17 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + macos-release@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" - integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== + version "2.4.1" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.4.1.tgz#64033d0ec6a5e6375155a74b1a1eba8e509820ac" + integrity sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg== make-dir@^1.0.0: version "1.3.0" @@ -4927,14 +4332,6 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" -make-dir@^2.0.0, make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - make-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801" @@ -4942,6 +4339,11 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + make-fetch-happen@^5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz#aa8387104f2687edca01c8687ee45013d02d19bd" @@ -4959,34 +4361,15 @@ make-fetch-happen@^5.0.0: socks-proxy-agent "^4.0.0" ssri "^6.0.0" -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - -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-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= -map-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" - integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= - -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" +map-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" + integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== marked-terminal@^4.0.0: version "4.1.0" @@ -5000,44 +4383,44 @@ marked-terminal@^4.0.0: node-emoji "^1.10.0" supports-hyperlinks "^2.1.0" -marked@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.8.0.tgz#ec5c0c9b93878dc52dd54be8d0e524097bd81a99" - integrity sha512-MyUe+T/Pw4TZufHkzAfDj6HarCBWia2y27/bhuYkTaiUnfDYFnCP3KUN+9oM7Wi6JA2rymtVYbQu3spE0GCmxQ== +marked@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/marked/-/marked-1.1.1.tgz#e5d61b69842210d5df57b05856e0c91572703e6a" + integrity sha512-mJzT8D2yPxoPh7h0UXkB+dBj4FykPJ2OIfxAWeIHrvoHDkFxukV/29QxoFQoPM6RLEwhIFdJpmKBlqVM3s2ZIw== marky@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.1.tgz#a3fcf82ffd357756b8b8affec9fdbf3a30dc1b02" integrity sha512-md9k+Gxa3qLH6sUKpeC2CNkJK/Ld+bEz5X96nYwloqphQE0CKCVEKco/6jxEZixinqNdz5RFi/KaCyfbMDMAXQ== -meant@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.1.tgz#66044fea2f23230ec806fb515efea29c44d2115d" - integrity sha512-UakVLFjKkbbUwNWJ2frVLnnAtbb7D7DsloxRd3s/gDpI8rdv8W5Hp3NaDb+POBI1fQdeussER6NB8vpcRURvlg== +meant@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/meant/-/meant-1.0.2.tgz#5d0c78310a3d8ae1408a16be0fe0bd42a969f560" + integrity sha512-KN+1uowN/NK+sT/Lzx7WSGIj2u+3xe5n2LbwObfjOhPZiA+cCfCm6idVl0RkEfjThkw5XJ96CyRcanq6GmKtUg== -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" + mimic-fn "^1.0.0" -meow@5.0.0, meow@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" - integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== - dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - yargs-parser "^10.0.0" +meow@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-7.1.1.tgz#7c01595e3d337fcb0ec4e8eed1666ea95903d306" + integrity sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA== + dependencies: + "@types/minimist" "^1.2.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "4.1.0" + normalize-package-data "^2.5.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.13.1" + yargs-parser "^18.1.3" merge-stream@^2.0.0: version "2.0.0" @@ -5045,28 +4428,9 @@ merge-stream@^2.0.0: integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" - integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== - -micromatch@^3.1.10, 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" + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.2: version "4.0.2" @@ -5084,28 +4448,38 @@ microtime@^3.0.0: node-addon-api "^1.2.0" node-gyp-build "^3.8.0" -mime-db@1.43.0: - version "1.43.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" - integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== +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.26" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" - integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + 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.43.0" + mime-db "1.44.0" mime@^2.4.3: - version "2.4.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" - integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + version "2.4.6" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" + integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== + +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.0.0, mimic-fn@^2.1.0: +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== +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + minimatch@3.0.4, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -5113,34 +4487,20 @@ minimatch@3.0.4, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist-options@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" - integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== dependencies: arrify "^1.0.1" is-plain-obj "^1.1.0" + kind-of "^6.0.3" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.1.0, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -minimist@^1.2.5: +minimist@^1.1.0, 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== -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - minipass@^2.3.5, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" @@ -5172,22 +4532,7 @@ mississippi@^3.0.0: stream-each "^1.1.0" through2 "^2.0.0" -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@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -mkdirp@^0.5.3: +mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -5195,27 +4540,27 @@ mkdirp@^0.5.3: minimist "^1.2.5" mocha@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.0.1.tgz#fe01f0530362df271aa8f99510447bc38b88d8ed" - integrity sha512-vefaXfdYI8+Yo8nPZQQi0QO2o+5q9UIMX1jZ1XMmK3+4+CQjc7+B0hPdUeglXiTlr8IHMVRo63IhO9Mzt6fxOg== + version "8.1.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.1.3.tgz#5e93f873e35dfdd69617ea75f9c68c2ca61c2ac5" + integrity sha512-ZbaYib4hT4PpF4bdSO2DohooKXIn4lDeiYqB+vTmCdr6l2woW0b6H3pf5x4sM5nwQMru9RvjjHYWVGltR50ZBw== dependencies: ansi-colors "4.1.1" browser-stdout "1.3.1" - chokidar "3.3.1" - debug "3.2.6" + chokidar "3.4.2" + debug "4.1.1" diff "4.0.2" - escape-string-regexp "1.0.5" - find-up "4.1.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" glob "7.1.6" growl "1.10.5" he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" + js-yaml "3.14.0" + log-symbols "4.0.0" minimatch "3.0.4" ms "2.1.2" object.assign "4.1.0" promise.allsettled "1.0.2" - serialize-javascript "3.0.0" + serialize-javascript "4.0.0" strip-json-comments "3.0.1" supports-color "7.1.0" which "2.0.2" @@ -5223,7 +4568,7 @@ mocha@^8.0.1: workerpool "6.0.0" yargs "13.3.2" yargs-parser "13.1.2" - yargs-unparser "1.6.0" + yargs-unparser "1.6.1" modify-values@^1.0.0: version "1.0.1" @@ -5242,16 +4587,16 @@ move-concurrently@^1.0.1: rimraf "^2.5.4" run-queue "^1.0.3" -ms-conf@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ms-conf/-/ms-conf-6.0.1.tgz#16363b879c27422cd01e99c79250cec15c1191ea" - integrity sha512-2/Y6nBGz/NPFBPTAmKJ9zK/gBXOKP852ypEyTHeG0s2oTju+Lvy5oWqdMD9SS2Q8ESm2SWWkTaxRyIAcpspv8g== +ms-conf@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/ms-conf/-/ms-conf-7.0.2.tgz#8f46cdeef324ed578d3e4d5da14ab126029d4c4d" + integrity sha512-Bg/gDNluzJp9ElOx5C6qmpInFCZ6awLGsOoHKmbt5d6Nuuoiyc77mKzj+h11sTf7q/jF5MVx6zw3lcQOOXMbgA== dependencies: - "@makeomatic/confidence" "^5.0.0" - camelcase "^5.3.1" + "@makeomatic/confidence" "6.0.3" + camelcase "^6.0.0" debug "^4.1.0" dotenv "^8.2.0" - eventemitter3 "^4.0.0" + eventemitter3 "^4.0.7" glob "^7.1.6" lodash.mergewith "^4.6.2" lodash.reduce "^4.6.0" @@ -5273,33 +4618,11 @@ multimap@^1.1.0: resolved "https://registry.yarnpkg.com/multimap/-/multimap-1.1.0.tgz#5263febc085a1791c33b59bb3afc6a76a2a10ca8" integrity sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw== -mute-stream@0.0.8, mute-stream@~0.0.4: +mute-stream@~0.0.4: version "0.0.8" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nan@^2.12.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== - -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" @@ -5316,9 +4639,9 @@ nconf@^0.10.0: yargs "^3.19.0" neo-async@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== nerf-dart@^1.0.0: version "1.0.0" @@ -5330,10 +4653,10 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/nise/-/nise-4.0.3.tgz#9f79ff02fa002ed5ffbc538ad58518fa011dc913" - integrity sha512-EGlhjm7/4KvmmE6B/UFsKh7eHykRl9VH+au8dduHLCyWUO/hr7+N+WtTvDUwc9zHuM1IaIJs/0lQ6Ag1jDkQSg== +nise@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/nise/-/nise-4.0.4.tgz#d73dea3e5731e6561992b8f570be9e363c4512dd" + integrity sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A== dependencies: "@sinonjs/commons" "^1.7.0" "@sinonjs/fake-timers" "^6.0.0" @@ -5354,28 +4677,28 @@ node-emoji@^1.10.0: lodash.toarray "^4.4.0" node-fetch-npm@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" - integrity sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw== + version "2.0.4" + resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz#6507d0e17a9ec0be3bec516958a497cec54bf5a4" + integrity sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg== dependencies: encoding "^0.1.11" json-parse-better-errors "^1.0.0" safe-buffer "^5.1.1" -node-fetch@^2.2.0, node-fetch@^2.3.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" - integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== +node-fetch@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== node-gyp-build@^3.8.0: version "3.9.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.9.0.tgz#53a350187dd4d5276750da21605d1cb681d09e25" integrity sha512-zLcTg6P4AbcHPq465ZMFNXx7XpKKJh+7kkN699NiQWisR2uWYOWNWqRHAmbnmKiL4e9aLSlmy5U7rEMUXV59+A== -node-gyp@^5.0.2, node-gyp@^5.0.5: - version "5.0.7" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.0.7.tgz#dd4225e735e840cf2870e4037c2ed9c28a31719e" - integrity sha512-K8aByl8OJD51V0VbUURTKsmdswkQQusIvlvmTyhHlIT1hBvaSxzdxpSle857XuXa7uc02UEZx9OR5aDxSWS5Qw== +node-gyp@^5.0.2, node-gyp@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-5.1.1.tgz#eb915f7b631c937d282e33aed44cb7a025f62a3e" + integrity sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw== dependencies: env-paths "^2.2.0" glob "^7.1.4" @@ -5394,11 +4717,6 @@ node-int64@^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-preload@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" @@ -5406,15 +4724,15 @@ node-preload@^0.2.1: dependencies: process-on-spawn "^1.0.0" -nopt@^4.0.1, nopt@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= +nopt@^4.0.1, nopt@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" + integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg== dependencies: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0, normalize-package-data@^2.5.0: +normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.4.0, 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== @@ -5424,27 +4742,20 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package- 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, 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== normalize-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-5.0.0.tgz#f46c9dc20670495e4e18fbd1b4396e41d199f63c" - integrity sha512-bAEm2fx8Dq/a35Z6PIRkkBBJvR56BbEJvhpNtvCZ4W9FyORSna77fn+xtYFjqk5JpBS+fMnAOG/wFgkQBmB7hw== + version "5.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-5.1.0.tgz#04b8f1b34ea49ff713fc20b2218eba41fb9974a3" + integrity sha512-UxHuSWsSAmzSqN+DSjasaZWQ3QPtEisHdlr4y9MJ5zg0RcImv5fQt8QM0izJSCdsdmhJGK+ubcTpJXwVDmwSVQ== -npm-audit-report@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-1.3.2.tgz#303bc78cd9e4c226415076a4f7e528c89fc77018" - integrity sha512-abeqS5ONyXNaZJPGAf6TOUMNdSe1Y6cpc9MLBRn+CuUoYbfdca6AxOyXVlfIv9OgKX+cacblbG5w7A6ccwoTPw== +npm-audit-report@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/npm-audit-report/-/npm-audit-report-1.3.3.tgz#8226deeb253b55176ed147592a3995442f2179ed" + integrity sha512-8nH/JjsFfAWMvn474HB9mpmMjrnKb1Hx/oTAdjv4PT9iZBvBxiZ+wtDUapHCJwLqYGQVPaAfs+vL5+5k9QndXw== dependencies: cli-table3 "^0.5.0" console-control-strings "^1.1.0" @@ -5468,10 +4779,10 @@ npm-install-checks@^3.0.2: dependencies: semver "^2.3.0 || 3.x || 4 || 5" -npm-lifecycle@^3.0.0, npm-lifecycle@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-3.1.4.tgz#de6975c7d8df65f5150db110b57cce498b0b604c" - integrity sha512-tgs1PaucZwkxECGKhC/stbEgFyc3TGh2TJcg2CDr6jbvQRdteHNhmMeljRzpe4wgFAXQADoy1cSqqi7mtiAa5A== +npm-lifecycle@^3.0.0, npm-lifecycle@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz#9882d3642b8c82c815782a12e6a1bfeed0026309" + integrity sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g== dependencies: byline "^5.0.0" graceful-fs "^4.1.15" @@ -5502,7 +4813,7 @@ npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: semver "^5.6.0" validate-npm-package-name "^3.0.0" -npm-packlist@^1.1.12, npm-packlist@^1.4.7: +npm-packlist@^1.1.12, npm-packlist@^1.4.8: version "1.4.8" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== @@ -5527,19 +4838,19 @@ npm-pick-manifest@^3.0.0, npm-pick-manifest@^3.0.2: npm-package-arg "^6.0.0" semver "^5.4.1" -npm-profile@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-4.0.2.tgz#8272a71c19634d0dce9c35a5daf8ee589cbb0f52" - integrity sha512-VRsC04pvRH+9cF+PoVh2nTmJjiG21yu59IHpsBpkxk+jaGAV8lxx96G4SDc0jOHAkfWLXbc6kIph3dGAuRnotQ== +npm-profile@^4.0.2, npm-profile@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-4.0.4.tgz#28ee94390e936df6d084263ee2061336a6a1581b" + integrity sha512-Ta8xq8TLMpqssF0H60BXS1A90iMoM6GeKwsmravJ6wYjWwSzcYBTdyWa3DZCYqPutacBMEm7cxiOkiIeCUAHDQ== dependencies: aproba "^1.1.2 || 2" figgy-pudding "^3.4.1" npm-registry-fetch "^4.0.0" -npm-registry-fetch@^4.0.0, npm-registry-fetch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.2.tgz#2b1434f93ccbe6b6385f8e45f45db93e16921d7a" - integrity sha512-Z0IFtPEozNdeZRPh3aHHxdG+ZRpzcbQaJLthsm3VhNf6DScicTFRHZzK82u8RsJUsUHkX+QH/zcB/5pmd20H4A== +npm-registry-fetch@^4.0.0, npm-registry-fetch@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz#57951bf6541e0246b34c9f9a38ab73607c9449d7" + integrity sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ== dependencies: JSONStream "^1.3.4" bluebird "^3.5.1" @@ -5568,10 +4879,10 @@ npm-user-validate@~1.0.0: resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.0.tgz#8ceca0f5cea04d4e93519ef72d0557a75122e951" integrity sha1-jOyg9c6gTU6TUZ73LQVXp1Ei6VE= -npm@^6.10.3: - version "6.13.6" - resolved "https://registry.yarnpkg.com/npm/-/npm-6.13.6.tgz#86df8305a4d8269d0934ec907920e7ab079cf5d9" - integrity sha512-NomC08kv7HIl1FOyLOe9Hp89kYsOsvx52huVIJ7i8hFW8Xp65lDwe/8wTIrh9q9SaQhA8hTrfXPh3BEL3TmMpw== +npm@^6.13.0: + version "6.14.8" + resolved "https://registry.yarnpkg.com/npm/-/npm-6.14.8.tgz#64ef754345639bc035982ec3f609353c8539033c" + integrity sha512-HBZVBMYs5blsj94GTeQZel7s9odVuuSUHy1+AlZh7rPVux1os2ashvEGLy/STNK7vUjbrCg5Kq9/GXisJgdf6A== dependencies: JSONStream "^1.3.5" abbrev "~1.1.1" @@ -5579,12 +4890,12 @@ npm@^6.10.3: ansistyles "~0.1.3" aproba "^2.0.0" archy "~1.0.0" - bin-links "^1.1.6" + bin-links "^1.1.8" bluebird "^3.5.5" byte-size "^5.0.1" cacache "^12.0.3" call-limit "^1.1.1" - chownr "^1.1.3" + chownr "^1.1.4" ci-info "^2.0.0" cli-columns "^3.1.2" cli-table3 "^0.5.1" @@ -5599,11 +4910,11 @@ npm@^6.10.3: find-npm-prefix "^1.0.2" fs-vacuum "~1.2.10" fs-write-stream-atomic "~1.0.10" - gentle-fs "^2.3.0" - glob "^7.1.4" - graceful-fs "^4.2.3" + gentle-fs "^2.3.1" + glob "^7.1.6" + graceful-fs "^4.2.4" has-unicode "~2.0.1" - hosted-git-info "^2.8.5" + hosted-git-info "^2.8.8" iferr "^1.0.2" infer-owner "^1.0.4" inflight "~1.0.6" @@ -5613,14 +4924,14 @@ npm@^6.10.3: is-cidr "^3.0.0" json-parse-better-errors "^1.0.2" lazy-property "~1.0.0" - libcipm "^4.0.7" + libcipm "^4.0.8" libnpm "^3.0.1" libnpmaccess "^3.0.2" libnpmhook "^5.0.3" libnpmorg "^1.0.1" libnpmsearch "^2.0.2" libnpmteam "^1.0.2" - libnpx "^10.2.0" + libnpx "^10.2.4" lock-verify "^2.1.0" lockfile "^1.0.4" lodash._baseuniq "~4.6.0" @@ -5629,22 +4940,22 @@ npm@^6.10.3: lodash.uniq "~4.5.0" lodash.without "~4.4.0" lru-cache "^5.1.1" - meant "~1.0.1" + meant "^1.0.2" mississippi "^3.0.0" - mkdirp "~0.5.1" + mkdirp "^0.5.5" move-concurrently "^1.0.1" - node-gyp "^5.0.5" - nopt "~4.0.1" + node-gyp "^5.1.0" + nopt "^4.0.3" normalize-package-data "^2.5.0" - npm-audit-report "^1.3.2" + npm-audit-report "^1.3.3" npm-cache-filename "~1.0.2" npm-install-checks "^3.0.2" - npm-lifecycle "^3.1.4" + npm-lifecycle "^3.1.5" npm-package-arg "^6.1.1" - npm-packlist "^1.4.7" + npm-packlist "^1.4.8" npm-pick-manifest "^3.0.2" - npm-profile "^4.0.2" - npm-registry-fetch "^4.0.2" + npm-profile "^4.0.4" + npm-registry-fetch "^4.0.7" npm-user-validate "~1.0.0" npmlog "~4.1.2" once "~1.4.0" @@ -5661,11 +4972,11 @@ npm@^6.10.3: read-installed "~4.0.3" read-package-json "^2.1.1" read-package-tree "^5.3.1" - readable-stream "^3.4.0" + readable-stream "^3.6.0" readdir-scoped-modules "^1.1.0" request "^2.88.0" retry "^0.12.0" - rimraf "^2.6.3" + rimraf "^2.7.1" safe-buffer "^5.1.2" semver "^5.7.1" sha "^3.0.0" @@ -5747,38 +5058,22 @@ object-assign@^4.1.0: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -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-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== +object-inspect@^1.7.0, object-inspect@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" + integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-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.assign@4.1.0, object.assign@^4.1.0: +object.assign@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== @@ -5788,14 +5083,23 @@ object.assign@4.1.0, object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.entries@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b" - integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ== +object.assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd" + integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA== dependencies: define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.18.0-next.0" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.entries@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" + integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" has "^1.0.3" object.getownpropertydescriptors@^2.0.3: @@ -5806,14 +5110,7 @@ object.getownpropertydescriptors@^2.0.3: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" -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" - -object.values@^1.1.0, object.values@^1.1.1: +object.values@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e" integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA== @@ -5831,35 +5128,27 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0, once@~1.4.0: wrappy "1" onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== + 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" opencollective-postinstall@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89" - integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" + integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== opener@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" - integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== opentracing@^0.14.4: version "0.14.4" resolved "https://registry.yarnpkg.com/opentracing/-/opentracing-0.14.4.tgz#a113408ea740da3a90fde5b3b0011a375c2e4268" integrity sha512-nNnZDkUNExBwEpb7LZaeMeQgvrlO8l4bgY/LvGNZCR0xG/dGWqHqjKrAmR5GUoYo0FIz38kxasvA1aevxWs2CA== -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -5884,14 +5173,14 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" -os-locale@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" os-name@^3.1.0: version "3.1.0" @@ -5901,7 +5190,7 @@ os-name@^3.1.0: macos-release "^2.2.0" windows-release "^3.1.0" -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -5914,11 +5203,6 @@ osenv@^0.1.4, osenv@^0.1.5: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - 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" @@ -5936,11 +5220,6 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - p-is-promise@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-3.0.0.tgz#58e78c7dfe2e163cf2a04ff869e7c1dba64a5971" @@ -5954,9 +5233,16 @@ p-limit@^1.1.0: p-try "^1.0.0" p-limit@^2.0.0, p-limit@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" - integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + 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-limit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe" + integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg== dependencies: p-try "^2.0.0" @@ -5981,6 +5267,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-map@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" @@ -6006,6 +5299,13 @@ p-retry@^4.0.0: "@types/retry" "^0.12.0" retry "^0.12.0" +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -6104,25 +5404,15 @@ parse-json@^4.0.0: json-parse-better-errors "^1.0.1" parse-json@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" - integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + 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-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -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-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -6172,13 +5462,6 @@ path-type@^2.0.0: dependencies: pify "^2.0.0" -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -6194,12 +5477,7 @@ performance-now@^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: - version "2.2.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.1.tgz#21bac888b6ed8601f831ce7816e335bc779f0a4a" - integrity sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA== - -picomatch@^2.0.7, picomatch@^2.2.1: +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== @@ -6214,46 +5492,34 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - pino-std-serializers@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-2.4.2.tgz#cb5e3e58c358b26f88969d7e619ae54bdfcc1ae1" - integrity sha512-WaL504dO8eGs+vrK+j4BuQQq6GLKeCCcHaMB2ItygzVURcL1CycwNEUHTD/lHFHs/NL5qAz2UKrjYWXKSf4aMQ== + version "2.5.0" + resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-2.5.0.tgz#40ead781c65a0ce7ecd9c1c33f409d31fe712315" + integrity sha512-wXqbqSrIhE58TdrxxlfLwU9eDhrzppQDvGhBEr1gYbzzM4KKo3Y63gSjiDXRKLVS2UOXdPNR2v+KnQgNrs+xUg== -pino@^5.17.0: - version "5.17.0" - resolved "https://registry.yarnpkg.com/pino/-/pino-5.17.0.tgz#b9def314e82402154f89a25d76a31f20ca84b4c8" - integrity sha512-LqrqmRcJz8etUjyV0ddqB6OTUutCgQULPFg2b4dtijRHUsucaAdBgSUW58vY6RFSX+NT8963F+q0tM6lNwGShA== +pino@^6.3.2: + version "6.7.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-6.7.0.tgz#d5d96b7004fed78816b5694fda3eab02b5ca6d23" + integrity sha512-vPXJ4P9rWCwzlTJt+f0Ni4THc3DWyt8iDDCO4edQ8narTu6hnpzdXu8FqeSJCGndl1W6lfbYQUQihUO54y66Lw== dependencies: - fast-redact "^2.0.0" + fast-redact "^3.0.0" fast-safe-stringify "^2.0.7" flatstr "^1.0.12" pino-std-serializers "^2.4.2" - quick-format-unescaped "^3.0.3" - sonic-boom "^0.7.5" + quick-format-unescaped "^4.0.1" + sonic-boom "^1.0.2" -pino@^6.3.2: - version "6.3.2" - resolved "https://registry.yarnpkg.com/pino/-/pino-6.3.2.tgz#55f73aa61584774ca5984068ffb78e8d519ce19e" - integrity sha512-EiP3L1hoFw19KPocWimjnfXeysld0ne89ZRQ+bf8nAeA2TyuLoggNlibAi+Kla67GvQBopLdIZOsh1z/Lruo5Q== +pino@^6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/pino/-/pino-6.6.1.tgz#3fe8ec300dadb2c30017df39106b056b87dffca8" + integrity sha512-DOgm7rn6ctBkBYemHXSLj7+j3o3U1q1FWBXbHcprur8mA93QcJSycEkEqhqKiFB9Mx/3Qld2FGr6+9yfQza0kA== dependencies: fast-redact "^2.0.0" fast-safe-stringify "^2.0.7" flatstr "^1.0.12" pino-std-serializers "^2.4.2" quick-format-unescaped "^4.0.1" - sonic-boom "^1.0.0" - -pirates@^4.0.0: - 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" + sonic-boom "^1.0.2" pkg-conf@^2.1.0: version "2.1.0" @@ -6270,13 +5536,6 @@ pkg-dir@^2.0.0: dependencies: find-up "^2.1.0" -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -6301,11 +5560,6 @@ pluralize@^8.0.0: resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -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" @@ -6391,10 +5645,10 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.24: - version "1.7.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" - integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== +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@^2.0.0: version "2.0.1" @@ -6421,12 +5675,7 @@ pumpify@^1.3.3: inherits "^2.0.3" pump "^2.0.0" -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0: +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== @@ -6447,28 +5696,23 @@ qs@~6.5.2: integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== query-string@^6.8.2: - version "6.10.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.10.1.tgz#30b3505f6fca741d5ae541964d1b3ae9dc2a0de8" - integrity sha512-SHTUV6gDlgMXg/AQUuLpTiBtW/etZ9JT6k6RCtCyqADquApLX0Aq5oK/s5UeTUAWBG50IExjIr587GqfXRfM4A== + version "6.13.2" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.2.tgz#3585aa9412c957cbd358fd5eaca7466f05586dda" + integrity sha512-BMmDaUiLDFU1hlM38jTFcRt7HYiGP/zt1sRzrIWm5zpeEuO1rkbPS0ELI3uehoLuuhHDCS8u8lhFN3fEN4JzPQ== dependencies: decode-uri-component "^0.2.0" split-on-first "^1.0.0" strict-uri-encode "^2.0.0" -quick-format-unescaped@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-3.0.3.tgz#fb3e468ac64c01d22305806c39f121ddac0d1fb9" - integrity sha512-dy1yjycmn9blucmJLXOfZDx1ikZJUi6E8bBZLnhPG5gBrVhHXx2xVyqqgKBubVNEXmx51dBACMHpoMQK/N/AXQ== - quick-format-unescaped@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.1.tgz#437a5ea1a0b61deb7605f8ab6a8fd3858dbeb701" integrity sha512-RyYpQ6Q5/drsJyOhrWHYMWTedvjTIat+FTwv0K4yoUxzvekw2aRHMQJLlnvt8UantkZg2++bEzD9EdxXqkWf4A== -quick-lru@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" - integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== qw@~1.0.1: version "1.0.1" @@ -6480,6 +5724,13 @@ ramda@^0.27.0: resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.0.tgz#915dc29865c0800bf3f69b8fd6c279898b59de43" integrity sha512-pVzZdDpWwWqEVVLshWUHjNwuVP7SfcmPraYuqocJp1yo2U1R7P+5QAfDhdItkuoGqIBnBYrtPp7rEPqDn9HlZA== +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + rc@^1.0.1, rc@^1.1.6, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -6512,16 +5763,14 @@ read-installed@~4.0.3: graceful-fs "^4.1.2" "read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@^2.0.13, read-package-json@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.1.tgz#16aa66c59e7d4dad6288f179dd9295fd59bb98f1" - integrity sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A== + version "2.1.2" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a" + integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== dependencies: glob "^7.1.1" - json-parse-better-errors "^1.0.1" + json-parse-even-better-errors "^2.3.0" normalize-package-data "^2.0.0" npm-normalize-package-bin "^1.0.0" - optionalDependencies: - graceful-fs "^4.1.2" read-package-tree@^5.3.1: version "5.3.1" @@ -6538,15 +5787,7 @@ read-pkg-up@^2.0.0: integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= dependencies: find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" + read-pkg "^2.0.0" read-pkg-up@^7.0.0, read-pkg-up@^7.0.1: version "7.0.1" @@ -6566,15 +5807,6 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - read-pkg@^5.0.0, read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" @@ -6605,10 +5837,10 @@ read@1, read@~1.0.1, read@~1.0.7: string_decoder "~1.1.1" util-deprecate "~1.0.1" -"readable-stream@2 || 3", readable-stream@^3.4.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.5.0.tgz#465d70e6d1087f6162d079cd0b5db7fbebfd1606" - integrity sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA== +"readable-stream@2 || 3", readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" @@ -6634,21 +5866,12 @@ readdir-scoped-modules@^1.0.0, readdir-scoped-modules@^1.1.0: graceful-fs "^4.1.2" once "^1.3.0" -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -readdirp@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" - integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== dependencies: - picomatch "^2.0.7" + picomatch "^2.2.1" rechoir@^0.6.2: version "0.6.2" @@ -6657,13 +5880,13 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" -redent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" - integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: - indent-string "^3.0.0" - strip-indent "^2.0.0" + indent-string "^4.0.0" + strip-indent "^3.0.0" redeyed@~2.1.0: version "2.1.1" @@ -6672,28 +5895,10 @@ redeyed@~2.1.0: dependencies: esprima "~4.0.0" -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - integrity sha1-M2w+/BIgrc7dosn6tntaeVWjNlg= - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-runtime@^0.13.2: - version "0.13.3" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" - integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== - -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" +regenerator-runtime@^0.13.4: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== regexp-tree@^0.1.21: version "0.1.21" @@ -6705,12 +5910,7 @@ regexp-tree@~0.1.1: resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.17.tgz#66d914a6ca21f95dd7660ed70a7dad47aeb2246a" integrity sha512-UnOJjFS/EPZmfISmYx+0PcDtPzyFKTe+cZTS5sM5hifnRUDRxoB1j4DAmGwqzxjwBGlwOkGfb2cDGHtjuEwqoA== -regexpp@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" - integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== - -regexpp@^3.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== @@ -6724,9 +5924,9 @@ registry-auth-token@^3.0.1: safe-buffer "^5.0.1" registry-auth-token@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.1.1.tgz#40a33be1e82539460f94328b0f7f0f84c16d9479" - integrity sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA== + version "4.2.0" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.0.tgz#1d37dffda72bbecd0f581e4715540213a65eb7da" + integrity sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w== dependencies: rc "^1.2.8" @@ -6744,25 +5944,10 @@ release-zalgo@^1.0.0: dependencies: es6-error "^4.0.1" -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@^2.88.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + 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" @@ -6771,7 +5956,7 @@ request@^2.88.0: extend "~3.0.2" forever-agent "~0.6.1" form-data "~2.3.2" - har-validator "~5.1.0" + har-validator "~5.1.3" http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" @@ -6781,7 +5966,7 @@ request@^2.88.0: performance-now "^2.1.0" qs "~6.5.2" safe-buffer "^5.1.2" - tough-cookie "~2.4.3" + tough-cookie "~2.5.0" tunnel-agent "^0.6.0" uuid "^3.3.2" @@ -6810,11 +5995,6 @@ resolve-from@5.0.0, resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -6827,38 +6007,13 @@ resolve-global@1.0.0, resolve-global@^1.0.0: 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.1.6, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.2: - version "1.15.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5" - integrity sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw== - dependencies: - path-parse "^1.0.6" - -resolve@^1.17.0: +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.3.2: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.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== - retry@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" @@ -6869,7 +6024,7 @@ retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= -reusify@^1.0.0: +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== @@ -6881,7 +6036,7 @@ rimraf@2.6.3: dependencies: glob "^7.1.3" -rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: +rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -6902,13 +6057,6 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= - dependencies: - is-promise "^2.1.0" - run-parallel@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" @@ -6921,30 +6069,16 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" - integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== - dependencies: - tslib "^1.9.0" - safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + 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.0, 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" - safe-regex@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-2.1.1.tgz#f7128f00d056e2fe5c11e81a1324dd974aadced2" @@ -6952,7 +6086,12 @@ safe-regex@^2.1.1: dependencies: regexp-tree "~0.1.1" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +safe-stable-stringify@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-1.1.1.tgz#c8a220ab525cd94e60ebf47ddc404d610dc5d84a" + integrity sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw== + +"safer-buffer@>= 2.1.2 < 3.0.0", 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== @@ -6962,10 +6101,10 @@ secure-keys@^1.0.0: resolved "https://registry.yarnpkg.com/secure-keys/-/secure-keys-1.0.0.tgz#f0c82d98a3b139a8776a8808050b824431087fca" integrity sha1-8MgtmKOxOah3aogIBQuCRDEIf8o= -semantic-release@17.0.4: - version "17.0.4" - resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-17.0.4.tgz#4ca739b2bf80f8ce5e49b05f12c15f49ca233d6d" - integrity sha512-5y9QRSrZtdvACmlpX5DvEVsvFuKRDUVn7JVJFxPVLGrGofDf1d0M/+hA1wFmCjiJZ+VCY8bYaSqVqF14KCF9rw== +semantic-release@17.1.1: + version "17.1.1" + resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-17.1.1.tgz#d9775968e841b2b7c5020559e4481aea8520ca75" + integrity sha512-9H+207eynBJElrQBHySZm+sIEoJeUhPA2zU4cdlY1QSInd2lnE8GRD2ALry9EassE22c9WW+aCREwBhro5AIIg== dependencies: "@semantic-release/commit-analyzer" "^8.0.0" "@semantic-release/error" "^2.2.0" @@ -6984,14 +6123,14 @@ semantic-release@17.0.4: hook-std "^2.0.0" hosted-git-info "^3.0.0" lodash "^4.17.15" - marked "^0.8.0" + marked "^1.0.0" marked-terminal "^4.0.0" micromatch "^4.0.2" p-each-series "^2.1.0" p-reduce "^2.0.0" read-pkg-up "^7.0.0" resolve-from "^5.0.0" - semver "^7.1.1" + semver "^7.3.2" semver-diff "^3.1.1" signale "^1.2.1" yargs "^15.0.1" @@ -7025,41 +6164,28 @@ semver-regex@^2.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@6.3.0, 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== - -semver@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.1.1.tgz#29104598a197d6cbe4733eeecbe968f7b43a9667" - integrity sha512-WfuG+fl6eh3eZ2qAf6goB7nhiCd7NPXhmyFxigB/TOkQyeLP8w8GsVehvtGNtnNmyboz4TgeK40B1Kbql/8c5A== - -semver@^7.1.2, semver@^7.2.1, semver@^7.3.2: +semver@7.3.2, semver@^7.1.2, 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== -serialize-javascript@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.0.0.tgz#492e489a2d77b7b804ad391a5f5d97870952548e" - integrity sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw== +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== + +serialize-javascript@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" set-blocking@^2.0.0, 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" - sha@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/sha/-/sha-3.0.0.tgz#b2f2f90af690c16a3a839a6a6c680ea51fedd1ae" @@ -7092,18 +6218,18 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shelljs@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" - integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== + version "0.8.4" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" + integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== dependencies: glob "^7.0.0" interpret "^1.0.0" rechoir "^0.6.2" signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== signale@^1.2.1: version "1.4.0" @@ -7115,23 +6241,18 @@ signale@^1.2.1: pkg-conf "^2.1.0" sinon@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.0.2.tgz#b9017e24633f4b1c98dfb6e784a5f0509f5fd85d" - integrity sha512-0uF8Q/QHkizNUmbK3LRFqx5cpTttEVXudywY9Uwzy8bTfZUhljZ7ARzSxnRHWYWtVTeh4Cw+tTb3iU21FQVO9A== + version "9.2.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.0.tgz#1d333967e30023609f7347351ebc0dc964c0f3c9" + integrity sha512-eSNXz1XMcGEMHw08NJXSyTHIu6qTCOiN8x9ODACmZpNQpr0aXTBXBnI4xTzQzR+TEpOmLiKowGf9flCuKIzsbw== dependencies: - "@sinonjs/commons" "^1.7.2" + "@sinonjs/commons" "^1.8.1" "@sinonjs/fake-timers" "^6.0.1" "@sinonjs/formatio" "^5.0.1" - "@sinonjs/samsam" "^5.0.3" + "@sinonjs/samsam" "^5.2.0" diff "^4.0.2" - nise "^4.0.1" + nise "^4.0.4" supports-color "^7.1.0" -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -7156,36 +6277,6 @@ smart-buffer@^4.1.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== -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" - socks-proxy-agent@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#3c8991f3145b2799e70e11bd5fbc8b1963116386" @@ -7202,17 +6293,10 @@ socks@~2.3.2: ip "1.1.5" smart-buffer "^4.1.0" -sonic-boom@^0.7.5: - version "0.7.6" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-0.7.6.tgz#c42df6df884a6a3d54fa7a45b11e4e2196818d45" - integrity sha512-k9E2QQ4zxuVRLDW+ZW6ISzJs3wlEorVdmM7ApDgor7wsGKSDG5YGHsGmgLY4XYh4DMlr/2ap2BWAE7yTFJtWnQ== - dependencies: - flatstr "^1.0.12" - -sonic-boom@^1.0.0, sonic-boom@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.0.1.tgz#a5fdfcab1ddea31732ce9c7c054f3a5751eee089" - integrity sha512-o9tx+bonVEXSaPtptyXQXpP8l6UV9Bi3im2geZskvWw2a/o/hrbWI7EBbbv+rOx6Hubnzun9GgH4WfbgEA3MFQ== +sonic-boom@^1.0.1, sonic-boom@^1.0.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.3.0.tgz#5c77c846ce6c395dddf2eb8e8e65f9cc576f2e76" + integrity sha512-4nX6OYvOYr6R76xfQKi6cZpTO3YSWe/vd+QdIfoH0lBy0MnPkeAbb2rRWgmgADkXUeCKPwO1FZAKlAVWAadELw== dependencies: atomic-sleep "^1.0.0" flatstr "^1.0.12" @@ -7230,36 +6314,20 @@ sorted-union-stream@~2.1.3: from2 "^1.3.0" stream-iterate "^1.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.16: - version "0.5.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" - integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== +source-map-support@^0.5.17: + 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: +source-map@^0.5.0: 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: +source-map@^0.6.0, 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== @@ -7282,43 +6350,36 @@ spawn-wrap@^2.0.0: which "^2.0.1" spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + 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.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + 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.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + 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.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + 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-on-first@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== -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" - split2@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" @@ -7367,14 +6428,6 @@ ssri@^6.0.0, ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" -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" - stream-combiner2@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" @@ -7456,21 +6509,21 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.trimleft@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" - integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== +string.prototype.trimend@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.5" -string.prototype.trimright@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" - integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== +string.prototype.trimstart@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.5" string_decoder@^1.1.1: version "1.3.0" @@ -7544,20 +6597,22 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" 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: - version "3.1.0" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" - integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== +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== strip-json-comments@~2.0.1: version "2.0.1" @@ -7569,7 +6624,7 @@ stubs@^3.0.0: resolved "https://registry.yarnpkg.com/stubs/-/stubs-3.0.0.tgz#e8d2ba1fa9c90570303c030b6900f7d5f89abe5b" integrity sha1-6NK6H6nJBXAwPAMLaQD31fiavls= -supports-color@7.1.0, supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== @@ -7583,6 +6638,13 @@ supports-color@^5.3.0: 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.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" @@ -7614,16 +6676,16 @@ tar@^4.4.10, tar@^4.4.12, tar@^4.4.13: safe-buffer "^5.1.2" yallist "^3.0.3" -teeny-request@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-6.0.1.tgz#9b1f512cef152945827ba7e34f62523a4ce2c5b0" - integrity sha512-TAK0c9a00ELOqLrZ49cFxvPVogMUFaWY8dUsQc/0CuQPGF+BOxOQzXfE413BAk2kLomwNplvdtMpeaeGWmoc2g== +teeny-request@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-7.0.1.tgz#bdd41fdffea5f8fbc0d29392cb47bec4f66b2b4c" + integrity sha512-sasJmQ37klOlplL4Ia/786M5YlOcoLGQyq2TE4WHSRupbAuDaQW0PfVxV4MtdBtRJ4ngzS+1qim8zP6Zp35qCw== dependencies: http-proxy-agent "^4.0.0" - https-proxy-agent "^4.0.0" - node-fetch "^2.2.0" + https-proxy-agent "^5.0.0" + node-fetch "^2.6.1" stream-events "^1.0.5" - uuid "^3.3.2" + uuid "^8.0.0" temp-dir@^2.0.0: version "2.0.0" @@ -7684,13 +6746,14 @@ through2@^2.0.0, through2@^2.0.2, through2@~2.0.0: xtend "~4.0.1" through2@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" - integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== + version "3.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" + integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== dependencies: + inherits "^2.0.4" readable-stream "2 || 3" -through@2, "through@>=2.2.7 <3", through@^2.3.6: +through@2, "through@>=2.2.7 <3": version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -7705,33 +6768,11 @@ tiny-relative-date@^1.3.0: resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07" integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A== -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" - 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" @@ -7739,39 +6780,40 @@ to-regex-range@^5.0.1: 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.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== +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.24" - punycode "^1.4.1" + psl "^1.1.28" + punycode "^2.1.1" traverse@~0.6.6: version "0.6.6" resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc= -trim-newlines@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" - integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= +trim-newlines@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" + integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== trim-off-newlines@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= +ts-node@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.0.0.tgz#e7699d2a110cc8c0d3b831715e417688683460b3" + integrity sha512-/TqB4SnererCDR/vb4S/QvSZvzQMJN8daAslg7MeaiHvD8rDZsSfXmNeNumyZZzMned72Xoq/isQljYSt8Ynfg== + dependencies: + arg "^4.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + tsconfig-paths@^3.9.0: version "3.9.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" @@ -7783,14 +6825,9 @@ tsconfig-paths@^3.9.0: strip-bom "^3.0.0" tslib@^1.8.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" - integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== - -tslib@^1.9.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== tsutils@^3.17.1: version "3.17.1" @@ -7833,6 +6870,11 @@ type-fest@^0.12.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.12.0.tgz#f57a27ab81c68d136a51fd71467eff94157fa1ee" integrity sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg== +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + type-fest@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" @@ -7855,13 +6897,15 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +typescript@^4.1.0-beta: + version "4.1.0-dev.20201012" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.0-dev.20201012.tgz#8c00f102c53f973eadbc39e81813739cf6e27017" + integrity sha512-afzjHTxmS6JszBOz3CkQqlP+5ZlvZ/ACbRJMXJWhEYfHPCDHdQGZVEMbdnYICM1KfgN2SUpubWJsWvyxkoNmHA== + uglify-js@^3.1.4: - version "3.7.6" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.6.tgz#0783daa867d4bc962a37cc92f67f6e3238c47485" - integrity sha512-yYqjArOYSxvqeeiYH2VGjZOqq6SVmhxzaPjJC1W2F9e+bqvFL9QXQ2osQuKUFjM2hGjKG2YclQnRKWQSt/nOTQ== - dependencies: - commander "~2.20.3" - source-map "~0.6.1" + version "3.10.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.10.4.tgz#dd680f5687bc0d7a93b14a3482d16db6eba2bfbb" + integrity sha512-kBFT3U4Dcj4/pJ52vfjCSfyLyvG9VYYuGYPmrPvAxRw/i7xHiT4VvCev+uiEMcEEiu6UNB6KgWmGtSUYIWScbw== uid-number@0.0.6: version "0.0.6" @@ -7873,16 +6917,6 @@ umask@^1.1.0, umask@~1.1.0: resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= -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" - unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" @@ -7911,13 +6945,6 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" -universal-user-agent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-4.0.0.tgz#27da2ec87e32769619f68a14996465ea1cb9df16" - integrity sha512-eM8knLpev67iBDizr/YtqkJsF3GK8gzDc6st/WKzrTuPtcsOKW/0IdL4cnMBsU69pOx0otavLWBDGTwg+dB0aA== - dependencies: - os-name "^3.1.0" - universal-user-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-5.0.0.tgz#a3182aa758069bf0e79952570ca757de3579c1d9" @@ -7925,6 +6952,11 @@ universal-user-agent@^5.0.0: dependencies: os-name "^3.1.0" +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + universalify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" @@ -7935,25 +6967,12 @@ unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= -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" - unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -update-notifier@^2.3.0, update-notifier@^2.5.0: +update-notifier@^2.2.0, update-notifier@^2.3.0, update-notifier@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw== @@ -7970,17 +6989,12 @@ update-notifier@^2.3.0, update-notifier@^2.5.0: xdg-basedir "^3.0.0" uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + 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= - url-join@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" @@ -7998,11 +7012,6 @@ urlgrey@0.4.4: resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-0.4.4.tgz#892fe95960805e85519f1cd4389f2cb4cbb7652f" integrity sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8= -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== - util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -8030,15 +7039,15 @@ uuid@^3.2.1, uuid@^3.3.2, uuid@^3.3.3, uuid@^3.4.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.1.0.tgz#6f1536eb43249f473abc6bd58ff983da1ca30d8d" - integrity sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg== +uuid@^8.0.0: + version "8.3.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" + integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== v8-compile-cache@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" - integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" + integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" @@ -8115,9 +7124,9 @@ window-size@^0.1.4: integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= windows-release@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f" - integrity sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA== + version "3.3.3" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.3.tgz#1c10027c7225743eec6b89df160d64c2e0293999" + integrity sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg== dependencies: execa "^1.0.0" @@ -8126,10 +7135,10 @@ word-wrap@^1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= worker-farm@^1.6.0, worker-farm@^1.7.0: version "1.7.0" @@ -8169,6 +7178,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -8201,9 +7219,9 @@ write@1.0.3: mkdirp "^0.5.1" ws@^7.2.0: - version "7.2.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.1.tgz#03ed52423cd744084b2cf42ed197c8b65a936b8e" - integrity sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A== + version "7.3.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" + integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== xdg-basedir@^3.0.0: version "3.0.0" @@ -8230,6 +7248,11 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +y18n@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.1.tgz#1ad2a7eddfa8bce7caa2e1f6b5da96c39d99d571" + integrity sha512-/jJ831jEs4vGDbYPQp4yGKDYPSCCEQ45uZWJHE1AoYBzqdZi8+LDWas0z4HrmJXmKdpFsTiowSHXdxyFhpmdMg== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -8240,12 +7263,15 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yaml@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.7.2.tgz#f26aabf738590ab61efaca502358e48dc9f348b2" - integrity sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw== - dependencies: - "@babel/runtime" "^7.6.3" +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.7.2: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== yargs-parser@13.1.2, yargs-parser@^13.1.2: version "13.1.2" @@ -8255,17 +7281,10 @@ yargs-parser@13.1.2, yargs-parser@^13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== - dependencies: - camelcase "^4.1.0" - -yargs-parser@^13.1.1: - version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== +yargs-parser@^15.0.1: + version "15.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3" + integrity sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" @@ -8278,7 +7297,7 @@ yargs-parser@^16.1.0: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^18.1.1: +yargs-parser@^18.1.2, yargs-parser@^18.1.3: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== @@ -8286,21 +7305,28 @@ yargs-parser@^18.1.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" - integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= +yargs-parser@^20.0.0: + version "20.2.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.0.tgz#944791ca2be2e08ddadd3d87e9de4c6484338605" + integrity sha512-2agPoRFPoIcFzOIp6656gcvsg2ohtscpw2OINr/q46+Sq41xz2OYLqx5HRHabmFU1OARIPAYH5uteICE7mn/5A== + +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= dependencies: camelcase "^4.1.0" -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== +yargs-unparser@1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.1.tgz#bd4b0ee05b4c94d058929c32cb09e3fce71d3c5f" + integrity sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA== dependencies: + camelcase "^5.3.1" + decamelize "^1.2.0" flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" + is-plain-obj "^1.1.0" + yargs "^14.2.3" yargs@13.3.2: version "13.3.2" @@ -8318,61 +7344,57 @@ yargs@13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" -yargs@15.1.0, yargs@^15.0.1, yargs@^15.0.2: - version "15.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.1.0.tgz#e111381f5830e863a89550bd4b136bb6a5f37219" - integrity sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg== +yargs@16.0.3, yargs@^16.0.3: + version "16.0.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.0.3.tgz#7a919b9e43c90f80d4a142a89795e85399a7e54c" + integrity sha512-6+nLw8xa9uK1BOEOykaiYAJVh6/CjxWXK/q9b5FpRgNslt8s22F2xMBqVIKgCRjNgGvGPBy8Vog7WN7yh4amtA== dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" + cliui "^7.0.0" + escalade "^3.0.2" + get-caller-file "^2.0.5" 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 "^16.1.0" + y18n "^5.0.1" + yargs-parser "^20.0.0" -yargs@^11.0.0: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.1.tgz#5052efe3446a4df5ed669c995886cc0f13702766" - integrity sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw== +yargs@^14.2.3: + version "14.2.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" + integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^3.1.0" + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" require-directory "^2.1.1" - require-main-filename "^1.0.1" + require-main-filename "^2.0.0" set-blocking "^2.0.0" - string-width "^2.0.0" + string-width "^3.0.0" which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" + y18n "^4.0.0" + yargs-parser "^15.0.1" -yargs@^13.3.0: - version "13.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" - integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== +yargs@^15.0.1, yargs@^15.1.0: + 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 "^5.0.0" - find-up "^3.0.0" + 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 "^3.0.0" + string-width "^4.2.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^13.1.1" + yargs-parser "^18.1.2" -yargs@^15.3.1: - version "15.3.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" - integrity sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== +yargs@^15.0.2: + version "15.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.1.0.tgz#e111381f5830e863a89550bd4b136bb6a5f37219" + integrity sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg== dependencies: cliui "^6.0.0" decamelize "^1.2.0" @@ -8384,7 +7406,7 @@ yargs@^15.3.1: string-width "^4.2.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^18.1.1" + yargs-parser "^16.1.0" yargs@^3.19.0: version "3.32.0" @@ -8398,3 +7420,32 @@ yargs@^3.19.0: string-width "^1.0.1" window-size "^0.1.4" y18n "^3.2.0" + +yargs@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" + integrity sha1-YpmpBVsc78lp/355wdkY3Osiw2A= + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +zod@^2.0.0-beta.8: + version "2.0.0-beta.9" + resolved "https://registry.yarnpkg.com/zod/-/zod-2.0.0-beta.9.tgz#385e89f60a12a5b6bb6ca91424dd5038566ed9d0" + integrity sha512-gGq+6RuCF6VdM7KcCFtay4vTzqy8nhzJypiYZj+1mj4TZI4EwPDrrs4A4mV5PTvlXp5e9vxecn83wzqCv7MfPg== From 51499d94a0143b0c88f3fee991b1e27b5184a3da Mon Sep 17 00:00:00 2001 From: Eugene Poyarkov Date: Wed, 4 Nov 2020 21:01:49 +0000 Subject: [PATCH 2/2] fix: add handles --- src/amqp-transport.ts | 436 +++++- src/amqp.js | 1391 ----------------- src/{utils/backoff.ts => backoff/index.ts} | 0 src/consumer/factory.ts | 4 +- .../entity-store.ts => entity-store/index.ts} | 0 src/message-options/index.ts | 96 ++ src/module.d.ts | 1 + src/queue/factory.ts | 2 +- src/queue/queue.ts | 12 +- .../index.ts} | 23 +- .../cache.ts => response-cache/index.ts} | 18 +- src/schema/publishing.ts | 17 +- src/sequence-provider/index.ts | 13 + src/types.ts | 50 +- src/utils/error.ts | 2 +- src/utils/get-app-id.ts | 16 +- src/utils/init-routing-fn.ts | 32 +- src/utils/latency.ts | 4 +- src/utils/response.ts | 10 +- src/utils/serialization.ts | 33 + src/utils/wrap-promise.ts | 29 + yarn.lock | 379 +++-- 22 files changed, 847 insertions(+), 1721 deletions(-) delete mode 100644 src/amqp.js rename src/{utils/backoff.ts => backoff/index.ts} (100%) rename src/{utils/entity-store.ts => entity-store/index.ts} (100%) create mode 100644 src/message-options/index.ts create mode 100644 src/module.d.ts rename src/{utils/reply-storage.ts => reply-storage/index.ts} (88%) rename src/{utils/cache.ts => response-cache/index.ts} (78%) create mode 100644 src/sequence-provider/index.ts create mode 100644 src/utils/wrap-promise.ts diff --git a/src/amqp-transport.ts b/src/amqp-transport.ts index 43ac328..9adc88e 100644 --- a/src/amqp-transport.ts +++ b/src/amqp-transport.ts @@ -1,40 +1,59 @@ import is from '@sindresorhus/is' import assert from 'assert' -import { ArgumentError, ConnectionError, InvalidOperationError, NotPermittedError } from 'common-errors' +import { ArgumentError, ConnectionError, InvalidOperationError, NotPermittedError, ValidationError } from 'common-errors' import delay from 'delay' import EventEmitter from 'eventemitter3' import defaults from 'lodash/defaults' import merge from 'lodash/merge' -import opentracing from 'opentracing' +import opentracing, { FORMAT_TEXT_MAP, Tags } from 'opentracing' import stringify from 'safe-stable-stringify' + import { kReplyHeaders } from './constants' -import { Consumer, ConsumerFactory, ConsumerOpts, PrivateConsumer } from './consumer' +import { + Consumer, + ConsumerOpts, + ConsumerFactory, + PrivateConsumer +} from './consumer' +import { MessageOptions, PublishOptions } from './message-options' import { AnyExchangeOpts, ExchangeFactory } from './exchange' import { getInstance as getLoggerInstance } from './loggers' import { Queue, QueueConfOpts, QueueFactory, QueueOpts } from './queue' +import { PendingReplyConf, ReplyStorage } from './reply-storage' import { Schema } from './schema' import { BackoffPolicy } from './schema/backoff' +import { SequenceProvider } from './sequence-provider' +import { + WellKnowHeaders, + AMQPTransportEvents, + PublishMessageHandle, + RawMessage, +} from './types' import type { LoggerLike } from './schema/logger-like' -import type { AnyFunction, ConsumedQueue, MessageHandler, PublishingOpts } from './types' -import { AMQPTransportEvents } from './types' - -import { Backoff } from './utils/backoff' -import { Cache } from './utils/cache' +import type { + AnyFunction, + ConsumedQueue, + MessageHandler, +} from './types' + +import { Backoff } from './backoff' +import { Cache } from './response-cache' import { AppID, getAppID } from './utils/get-app-id' import { initRoutingFn } from './utils/init-routing-fn' -import { ReplyStorage } from './utils/reply-storage' -import { Message, buildResponse, adaptResponse } from './utils/response' +import { Message, buildResponse, adaptResponse} from './utils/response' // TODO import type { AMQP } from './utils/transport' // TODO import Transport from './utils/transport' -import { AmqpDLXError, wrapError } from './utils/error' import { latency } from './utils/latency' +import { AmqpDLXError, wrapError } from './utils/error' +import { jsonSerializer, serialize } from './utils/serialization' +import { wrapPromise } from './utils/wrap-promise' export class AMQPTransport extends EventEmitter { public config: Schema @@ -42,15 +61,16 @@ export class AMQPTransport extends EventEmitter { readonly #appIDString: string readonly #appID: AppID - readonly #defaultOpts: PublishingOpts - readonly #extraQueueOpts: PublishingOpts = {} + readonly #defaultOpts: Partial + readonly #extraQueueOpts: Partial = {} + readonly #sequenceProvider: SequenceProvider #replyTo?: string | false #cache: Cache + #tracer: opentracing.Tracer #recovery: Backoff #replyStorage: ReplyStorage - // TODO right amqp type #amqp: AMQP.Instance | null = null #queues: QueueFactory #consumers: ConsumerFactory @@ -85,7 +105,7 @@ export class AMQPTransport extends EventEmitter { public static async connect( config: Partial, messageHandler: MessageHandler, - opts: Partial = {} + opts: Partial = {} ): Promise { const [ amqp, @@ -106,7 +126,7 @@ export class AMQPTransport extends EventEmitter { public static async multiConnect( config: Partial, messageHandler: MessageHandler, - opts: Partial = {} + opts: Partial = {} ): Promise { const [ amqp, @@ -139,9 +159,9 @@ export class AMQPTransport extends EventEmitter { get amqp() { return this.#amqp } get appID() { return this.#appID } get appIDString() { return this.#appIDString } - // todo get isConnected() { return this.amqp?.state === 'open' } get isConnecting() { return this.#replyTo === false } + get tracer() { return this.#tracer } /** * Instantiate AMQP Transport @@ -171,14 +191,16 @@ export class AMQPTransport extends EventEmitter { // delay settings for reconnect this.#recovery = new Backoff(config.recovery) - // TODO tracer - // this.tracer = .... + // init open tracer - default one is noop + this.#tracer = this.config.tracer ?? new opentracing.Tracer() this.#defaultOpts = { ...config.defaultOpts, appId: this.appIDString, } + this.#sequenceProvider = new SequenceProvider() + // DLX config if (config.dlx.enabled) { // there is a quirk - we must make sure that no routing key matches queue name @@ -217,7 +239,7 @@ export class AMQPTransport extends EventEmitter { return reject(err) } - resolve(...args) + resolve(args) }) this.#amqp.on('ready', this.#onConnect) @@ -257,9 +279,30 @@ export class AMQPTransport extends EventEmitter { async publish( route: string, message: RequestBody, - options: Partial = {}, - parentSpan?: opentracing.Span - ) {} + options: Partial = {}, + parentSpan?: opentracing.Span | opentracing.SpanContext + ) { + const span = this.tracer.startSpan(`publish:${route}`, { + childOf: parentSpan, + }) + + // prepare exchange + const exchange = is.string(options.exchange) + ? options.exchange + : this.config.exchange + + span.addTags({ + [Tags.SPAN_KIND]: Tags.SPAN_KIND_MESSAGING_PRODUCER, + [Tags.MESSAGE_BUS_DESTINATION]: `${exchange}:${route}`, + }) + + return wrapPromise(span, this.sendToServer( + exchange, + route, + message, + options + )) + } /** * Sends a message and then awaits for response @@ -275,9 +318,27 @@ export class AMQPTransport extends EventEmitter { > ( route: string, message: RequestBody, - options: Partial = {}, - parentSpan?: opentracing.Span - ) : Promise {} + options: Partial = {}, + parentSpan?: opentracing.Span | opentracing.SpanContext + ) : Promise { + // opentracing instrumentation + const span = this.tracer.startSpan(`publishAndWait:${route}`, { + childOf: parentSpan, + }) + + span.addTags({ + [Tags.SPAN_KIND]: Tags.SPAN_KIND_RPC_CLIENT, + [Tags.MESSAGE_BUS_DESTINATION]: route, + }) + + return wrapPromise(span, this.createMessageHandler( + route, + message, + options, + this.publish, + span + )) + } /** * Send message to specified queue directly @@ -290,9 +351,30 @@ export class AMQPTransport extends EventEmitter { async send( queue: string, message: RequestBody, - options: Partial = {}, - parentSpan?: opentracing.Span - ) {} + options: Partial = {}, + parentSpan?: opentracing.Span | opentracing.SpanContext + ) { + const span = this.tracer.startSpan(`send:${queue}`, { + childOf: parentSpan, + }) + + // prepare exchange + const exchange = is.string(options.exchange) + ? options.exchange + : '' + + span.addTags({ + [Tags.SPAN_KIND]: Tags.SPAN_KIND_MESSAGING_PRODUCER, + [Tags.MESSAGE_BUS_DESTINATION]: `${exchange || ''}:${queue}`, + }) + + return wrapPromise(span, this.sendToServer( + exchange, + queue, + message, + options + )) + } /** * Send message to specified queue directly and wait for answer @@ -303,11 +385,181 @@ export class AMQPTransport extends EventEmitter { * @param {Span} parentSpan */ async sendAndWait( - route: string, + queue: string, message: RequestBody, - options: Partial = {}, + options: Partial = {}, + parentSpan?: opentracing.Span | opentracing.SpanContext + ) { + // opentracing instrumentation + const span = this.tracer.startSpan(`sendAndWait:${queue}`, { + childOf: parentSpan, + }) + + span.addTags({ + [Tags.SPAN_KIND]: Tags.SPAN_KIND_RPC_CLIENT, + [Tags.MESSAGE_BUS_DESTINATION]: queue, + }) + + return wrapPromise(span, this.createMessageHandler( + queue, + message, + options, + this.send + )) + } + + /** + * Low-level publishing method + * @param {string} exchange + * @param {string} queueOrRoute + * @param {mixed} _message + * @param {Object} options + * @returns {Promise<*>} + */ + async sendToServer( + exchange: string, + queueOrRoute: string, + $message: RequestBody, + options: Partial + ) { + const publishOptions = MessageOptions.getPublishOptions( + options, + this.#defaultOpts, + this.config.timeout + ) + + const message = options.skipSerialize === true + ? $message + : await serialize($message, publishOptions) + + if (!this.#amqp) { + // NOTE: if this happens - it means somebody + // called (publish|send)* after amqp.close() + // or there is an auto-retry policy that does the same + throw new InvalidOperationError('connection was closed') + } + + const request = await this.#amqp + .publishAsync(exchange, queueOrRoute, message, publishOptions) + + // emit original message + this.emit(AMQPTransportEvents.Publish, queueOrRoute, $message) + + return request + } + + async createMessageHandler< + RequestBody, + ResponseBody + >( + routing: string, + message: RequestBody, + options: Partial, + publishMessage: PublishMessageHandle, parentSpan?: opentracing.Span - ) {} + ): Promise { + assert(is.plainObject(options), 'options must be an object') + + const replyTo = options.replyTo ?? this.#replyTo + const time = process.hrtime() + const replyOptions = MessageOptions.getReplyOptions( + options, + this.#defaultOpts + ) + + // ensure that reply queue exists before sending request + if (typeof replyTo !== 'string') { + if (replyTo === false) { + await this.#awaitPrivateQueue() + } else { + await this.#createPrivateQueue() + } + + return this.createMessageHandler( + routing, + message, + options, + publishMessage, + parentSpan + ) + } + + // work with cache if options.cache is set and is number + // otherwise cachedResponse is always null + const cachedResponse = this.#cache.get(message, options.cache) + + if (is.object(cachedResponse)) { + return adaptResponse(cachedResponse.value, replyOptions) + } + + // generate response id + const correlationId = options.correlationId ?? this.#sequenceProvider.next() + // timeout before RPC times out + const timeout = options.timeout ?? this.config.timeout + + // slightly longer timeout, if message was not consumed in time, it will return with expiration + const publishPromise = new Promise((resolve, reject) => { + const reply: PendingReplyConf & { timer: null } = { + time, + timeout, + routing, + reject, + resolve, + replyOptions, + cache: cachedResponse, + timer: null, + } + + // push into RPC request storage + this.#replyStorage.push(correlationId, reply) + }) + + // debugging + this.log.trace('message pushed into reply queue in %s', latency(time)) + + // add custom header for routing over amq.headers exchange + if (!options.headers) { + options.headers = { + [WellKnowHeaders.ReplyTo]: replyTo + } + } else { + options.headers[WellKnowHeaders.ReplyTo] = replyTo + } + + // We don't make a copy of the object to keep it's shape + options.replyTo = replyTo + options.correlationId = correlationId + options.expiration = Math.ceil(timeout * 0.9).toString() + + // add opentracing instrumentation + if (parentSpan) { + this.#tracer.inject( + parentSpan.context(), + FORMAT_TEXT_MAP, + options.headers + ) + } + + // this is to ensure that queue is not overflown and work will not + // be completed later on + publishMessage + .call( + this, + routing, + message, + options, + parentSpan + ) + .then(() => { + this.log.trace({ latency: latency(time) }, 'message published') + }) + .catch((err: Error) => { + this.log.error({ err }, 'error sending message') + this.#replyStorage.reject(correlationId, err) + }) + + return publishPromise + } /** * @deprecated @@ -385,7 +637,7 @@ export class AMQPTransport extends EventEmitter { } } - if (config.bindPersistentQueueToHeadersExchange === true) { + if (config.bindPersistentQueueToHeadersExchange) { for (const route of listen.values()) { assert( ExchangeFactory.isValidHeadersExchangeRoute(route), @@ -401,9 +653,9 @@ export class AMQPTransport extends EventEmitter { const { log } = this log.debug({ attempt }, 'establish consumer') - const oldConsumer = this.#consumers + const oldConsumer = this.#consumers! .get(establishConsumer) - const oldQueue = this.#queues + const oldQueue = this.#queues! .get(establishConsumer) // if we have old consumer @@ -457,7 +709,6 @@ export class AMQPTransport extends EventEmitter { } - // TODO legacy interface /** * Create queue with specified settings in current connection * also emit new event on message in queue @@ -470,6 +721,7 @@ export class AMQPTransport extends EventEmitter { ? {} as ConsumerOpts : { onMessage: opts.router, + onMessagePre: this.#handleMessagePre, onError: this.#handleConsumerError, onClose: this.#handleConsumerClose, onCancel: this.#rebindConsumer, @@ -497,6 +749,86 @@ export class AMQPTransport extends EventEmitter { } } + /** + * Noop function with empty correlation id and reply to data + * @param {Error} error + * @param {mixed} data + * @param {Span} [span] + * @param {AMQPMessage} [raw] + */ + noop(error: Error, data: any, span: opentracing.Span | undefined, raw: RawMessage) { + const msg = stringify({ error, data }, jsonSerializer) + this.log.debug('when replying to message with %s response could not be delivered', msg) + + if (span !== undefined) { + if (error) { + span.setTag(Tags.ERROR, true) + span.log({ + event: 'error', + 'error.object': error, + message: error.message, + stack: error.stack, + }) + } + + span.finish() + } + + if (raw !== undefined) { + this.emit(AMQPTransportEvents.After, raw) + } + } + + /** + * Reply to sender queue based on headers + * + * @param {Object} properties - incoming message headers + * @param {mixed} message - message to send + * @param {Span} [span] - opentracing span + * @param {AMQPMessage} [raw] - raw message + */ + reply(properties: PublishOptions, message: any, span?: opentracing.Span, raw?: RawMessage) { + if (!properties.replyTo || !properties.correlationId) { + const error = new ValidationError('replyTo and correlationId not found in properties', '400') + + if (span !== undefined) { + span.setTag(Tags.ERROR, true) + span.log({ + event: 'error', + 'error.object': error, + message: error.message, + stack: error.stack, + }) + span.finish() + } + + if (raw !== undefined) { + this.emit(AMQPTransportEvents.After, raw) + } + + return Promise.reject(error) + } + + const options = MessageOptions.getPublishOptions({ + correlationId: properties.correlationId, + }) + + if (properties[kReplyHeaders]) { + options.headers = properties[kReplyHeaders] + } + + let promise = this.send(properties.replyTo, message, options, span) + + if (raw !== undefined) { + promise = promise + .finally(() => this.emit(AMQPTransportEvents.After, raw)) + } + + return span === undefined + ? promise + : wrapPromise(span, promise) + } + #createQueue = async < $ConsumerOpts extends Partial> = Partial> >( @@ -562,7 +894,7 @@ export class AMQPTransport extends EventEmitter { context.queue, this.#replyTo, this.config.dlx.params, - 'reply-to' + WellKnowHeaders.ReplyTo ) } @@ -573,7 +905,7 @@ export class AMQPTransport extends EventEmitter { return context } - #awaitPrivateQueue = () => { + #awaitPrivateQueue = (): Promise => { return new Promise((resolve, reject) => { let done: AnyFunction | null let error: AnyFunction | null @@ -592,7 +924,7 @@ export class AMQPTransport extends EventEmitter { this.once(AMQPTransportEvents.PrivateQueueReady, done) this.once(AMQPTransportEvents.Error, error) - }); + }) } // #onMessage: = () @@ -701,6 +1033,10 @@ export class AMQPTransport extends EventEmitter { this.emit(AMQPTransportEvents.Close, err) } + #handleMessagePre = (raw: RawMessage) => { + this.emit(AMQPTransportEvents.Pre, raw) + } + #handlePrivateConsumerError = (_: Consumer, shouldRecreate: boolean, err: AMQP.ConsumerError): void => { if (shouldRecreate && !this.isConnecting) { this.createPrivateQueue() @@ -723,21 +1059,24 @@ export class AMQPTransport extends EventEmitter { * @param {Object} properties */ #handlePrivateMessage = async < - RequestBody extends any, - ResponseBody extends any + Body extends any, >( - message: Message, - properties: PublishingOpts, - ): Promise => { + message: Message, + properties: PublishOptions, + ): Promise => { const { correlationId, replyTo, headers } = properties - const { 'x-death': xDeath } = headers + const { [WellKnowHeaders.XDeath]: xDeath } = headers // retrieve promised message const future = this.#replyStorage.pop(correlationId) // case 1 - for some reason there is no saved reference, example - crashed process if (future === undefined) { - this.log.error('no recipient for the message %j and id %s', message.error || message.data || message, correlationId); + this.log.error( + 'no recipient for the message %j and id %s', + message.error || message.data || message, + correlationId + ) let error if (xDeath) { @@ -773,18 +1112,19 @@ export class AMQPTransport extends EventEmitter { Object.defineProperty(error, kReplyHeaders, { value: headers, enumerable: false, - }); + }) return future.reject(error) } const response = buildResponse(message, properties) + const adaptedResponse = adaptResponse(response, future.replyOptions) if (future.cache) { this.#cache.set(future.cache, response) } - return future.resolve(adaptResponse(response, future.replyOptions)) + return future.resolve(adaptedResponse) } #handleConsumerError = ( diff --git a/src/amqp.js b/src/amqp.js deleted file mode 100644 index 905b9f0..0000000 --- a/src/amqp.js +++ /dev/null @@ -1,1391 +0,0 @@ -// deps -const Promise = require('bluebird'); -const gunzip = Promise.promisify(require('zlib').gunzip); -const gzip = Promise.promisify(require('zlib').gzip); -const uuid = require('uuid'); -const flatstr = require('flatstr'); -const stringify = require('json-stringify-safe'); -const EventEmitter = require('eventemitter3'); -const os = require('os'); -const is = require('is'); -const assert = require('assert'); -const opentracing = require('opentracing'); -const { - ConnectionError, - NotPermittedError, - ValidationError, - InvalidOperationError, - ArgumentError, -} = require('common-errors'); - -// lodash fp -const merge = require('lodash/merge'); -const defaults = require('lodash/defaults'); -const noop = require('lodash/noop'); -const uniq = require('lodash/uniq'); -const pick = require('lodash/pick'); - -// local deps -const { Joi, schema } = require('./schema'); -const pkg = require('../package.json'); -const AMQP = require('./utils/transport'); -const ReplyStorage = require('./utils/reply-storage'); -const Backoff = require('./utils/recovery'); -const Cache = require('./utils/cache'); -const latency = require('./utils/latency'); -const loggerUtils = require('./loggers'); -const generateErrorMessage = require('./utils/error'); -const helpers = require('./helpers'); -const { kReplyHeaders } = require('./constants'); - -// serialization functions -const { jsonSerializer, jsonDeserializer } = require('./utils/serialization'); - -// cache references -const { AmqpDLXError } = generateErrorMessage; -const { wrapError, setQoS } = helpers; -const { Tags, FORMAT_TEXT_MAP } = opentracing; - -/** - * Wraps regular in a bluebird promise - * @param {Span} span opentracing span - * @param {Promise} promise pending promise - * - * @return {BluebirdPromise} - */ -const wrapPromise = (span, promise) => Promise.resolve((async () => { - try { - return await promise; - } catch (error) { - span.setTag(Tags.ERROR, true); - span.log({ - event: 'error', - 'error.object': error, - message: error.message, - stack: error.stack, - }); - - throw error; - } finally { - span.finish(); - } -})()); - -const serialize = async (message, publishOptions) => { - let serialized; - switch (publishOptions.contentType) { - case 'application/json': - case 'string/utf8': - serialized = Buffer.from(flatstr(stringify(message, jsonSerializer))); - break; - - default: - throw new Error('invalid content-type'); - } - - if (publishOptions.contentEncoding === 'gzip') { - return gzip(serialized); - } - - return serialized; -}; - -function safeJSONParse(data, log) { - try { - return JSON.parse(data, jsonDeserializer); - } catch (err) { - log.warn('Error parsing buffer', err, String(data)); - return { err: PARSE_ERR }; - } -} - -const toUniqueStringArray = (routes) => ( - Array.isArray(routes) ? uniq(routes) : [routes] -); - -/** - * Routing function HOC with reply RPC enhancer - * @param {Function} messageHandler - * @param {AMQPTransport} transport - * @returns {Function} - */ -const initRoutingFn = (messageHandler, transport) => { - /** - * Response Handler Function. Sends Reply or Noop log. - * @param {AMQPMessage} raw - Raw AMQP Message Structure - * @param {Error} error - Error if it happened. - * @param {mixed} data - Response data. - * @returns {Promise<*>} - */ - function responseHandler(raw, error, data) { - const { properties, span } = raw; - return !properties.replyTo || !properties.correlationId - ? transport.noop(error, data, span, raw) - : transport.reply(properties, { error, data }, span, raw); - } - - /** - * Initiates consumer message handler. - * @param {mixed} message - RequestBody passed from the publisher. - * @param {Object} properties - AMQP Message properties. - * @param {Object} raw - Original AMQP message. - * @param {Function} [raw.ack] - Acknowledge if nack is `true`. - * @param {Function} [raw.reject] - Reject if nack is `true`. - * @param {Function} [raw.retry] - Retry msg if nack is `true`. - * @returns {Void} - */ - return function router(message, properties, raw) { - // add instrumentation - const appId = safeJSONParse(properties.appId, this.log); - - // opentracing instrumentation - const childOf = this.tracer.extract(FORMAT_TEXT_MAP, properties.headers || {}); - const span = this.tracer.startSpan(`onConsume:${properties.routingKey}`, { - childOf, - }); - - span.addTags({ - [Tags.SPAN_KIND]: Tags.SPAN_KIND_RPC_SERVER, - [Tags.PEER_SERVICE]: appId.name, - [Tags.PEER_HOSTNAME]: appId.host, - }); - - // define span in the original message - // so that userland has access to it - raw.span = span; - - return messageHandler(message, properties, raw, responseHandler.bind(undefined, raw)); - }; -}; - -/** - * @param {Object} response - * @oaram {Object} response.data - * @oaram {Object} response.headers - * @param {Object} replyOptions - * @param {boolean} replyOptions.simpleResponse - * @returns {Object} - */ -function adaptResponse(response, replyOptions) { - return replyOptions.simpleResponse === false ? response : response.data; -} - -/** - * @param {mixed} message - * @param {Object} message.data - * @param {Object} message.error - * @param {Object} properties - * @param {Object} properties.headers - */ -function buildResponse(message, properties) { - const { headers } = properties; - const { data } = message; - - return { - headers, - data, - }; -} - -const extendMessageProperties = [ - 'deliveryTag', - 'redelivered', - 'exchange', - 'routingKey', - 'weight', -]; - -const error406 = { replyCode: 406 }; - -/** - * @class AMQPTransport - */ -class AMQPTransport extends EventEmitter { - /** - * Instantiate AMQP Transport - * @param {Object} opts, defaults to {} - */ - constructor(opts = {}) { - super(); - - // prepare configuration - const config = this.config = Joi.attempt(opts, schema, { - allowUnknown: true, - }); - - this.config = config; - - // prepares logger - this.log = loggerUtils.prepareLogger(config); - this.log.debug({ config }, 'used configuration'); - - // init cache or pass-through operations - this.cache = new Cache(config.cache); - - // reply storage, where we'd save correlation ids - // and callbacks to be called once we are done - this.replyStorage = new ReplyStorage(); - - // delay settings for reconnect - this.recovery = new Backoff(config.recovery); - - // init open tracer - default one is noop - this.tracer = config.tracer || new opentracing.Tracer(); - - // setup instance - this._replyTo = null; - this._consumers = new Map(); - this._queues = new WeakMap(); - this._reconnectionHandlers = new WeakMap(); - this._boundEmit = this.emit.bind(this); - this._onConsume = this._onConsume.bind(this); - this._on406 = this._on406.bind(this); - this._onClose = this._onClose.bind(this); - this._onConnect = this._onConnect.bind(this); - - // Form app id string for debugging - this._appID = { - name: this.config.name, - host: os.hostname(), - pid: process.pid, - utils_version: pkg.version, - version: opts.version || 'n/a', - }; - - // Cached serialized value - this._appIDString = stringify(this._appID); - this._defaultOpts = { ...config.defaultOpts }; - this._defaultOpts.appId = this._appIDString; - this._extraQueueOptions = {}; - - // DLX config - if (config.dlx.enabled === true) { - // there is a quirk - we must make sure that no routing key matches queue name - // to avoid useless redistributions of the message - this._extraQueueOptions.arguments = { 'x-dead-letter-exchange': config.dlx.params.exchange }; - } - } - - /** - * Connects to AMQP, if config.router is specified earlier, - * automatically invokes .consume function - * @return {Promise} - */ - connect() { - const { _amqp: amqp, config } = this; - - if (amqp) { - switch (amqp.state) { - case 'opening': - case 'open': - case 'reconnecting': { - const msg = 'connection was already initialized, close it first'; - const err = new InvalidOperationError(msg); - return Promise.reject(err); - } - - default: - // already closed, but make sure - amqp.close(); - this._amqp = null; - } - } - - return Promise - .fromNode((next) => { - this._amqp = new AMQP(config.connection, next); - this._amqp.on('ready', this._onConnect); - this._amqp.on('close', this._onClose); - }) - .return(this); - } - - /** - * Noop function with empty correlation id and reply to data - * @param {Error} error - * @param {mixed} data - * @param {Span} [span] - * @param {AMQPMessage} [raw] - */ - noop(error, data, span, raw) { - const msg = stringify({ error, data }, jsonSerializer); - this.log.debug('when replying to message with %s response could not be delivered', msg); - - if (span !== undefined) { - if (error) { - span.setTag(Tags.ERROR, true); - span.log({ - event: 'error', 'error.object': error, message: error.message, stack: error.stack, - }); - } - - span.finish(); - } - - if (raw !== undefined) { - this.emit('after', raw); - } - } - - /** - * Stops consumers and closes transport - */ - async _close() { - const { _amqp: amqp } = this; - - await this.closeAllConsumers(); - - try { - await new Promise((resolve, reject) => { - amqp.once('close', resolve); - amqp.once('error', reject); - amqp.close(); - }); - } finally { - this._amqp = null; - amqp.removeAllListeners(); - } - } - - close() { - const { _amqp: amqp } = this; - - if (amqp) { - switch (amqp.state) { - case 'opening': - case 'open': - case 'reconnecting': - return this._close(); - default: - this._amqp = null; - return Promise.resolve(); - } - } - - const err = new InvalidOperationError('connection was not initialized in the first place'); - return Promise.reject(err); - } - - /** - * Create queue with specified settings in current connection - * also emit new event on message in queue - * - * @param {Object} opts - queue parameters - */ - async createQueue(opts) { - const { _amqp: amqp, log, _onConsume } = this; - - // prepare params - const ctx = Object.create(null); - const userParams = is.string(opts) ? { queue: opts } : opts; - const requestedName = userParams.queue; - const params = merge({ autoDelete: !requestedName, durable: !!requestedName }, userParams); - - log.debug({ params }, 'initializing queue'); - - const queue = ctx.queue = await amqp.queueAsync(params); - - await Promise - .resolve(queue.declareAsync()) - .catch(error406, this._on406.bind(this, params)) - .tapCatch((err) => { - log.warn({ err, queue: params.queue }, 'failed to init queue'); - }); - - // copy queue options - const options = ctx.options = { ...ctx.queue.queueOptions }; - const queueName = options.queue; - log.info({ queue: queueName }, 'queue created'); - - if (!params.router) { - return ctx; - } - - log.info({ queue: options.queue }, 'consumer is being created'); - - // setup consumer - const messageHandler = _onConsume(params.router); - ctx.consumer = await amqp.consumeAsync(queueName, setQoS(params), messageHandler); - - return ctx; - } - - handlePrivateConsumerError(consumer, queue, err) { - const { error } = err; - if (error && error.replyCode === 404 && error.replyText.indexOf(queue) !== -1) { - // https://github.com/dropbox/amqp-coffee#consumer-event-error - // handle consumer error on reconnect and close consumer - // warning: other queues (not private one) should be handled manually - this.log.error('consumer returned 404 error', error); - - // reset replyTo queue and ignore all future errors - consumer.removeAllListeners('error'); - consumer.removeAllListeners('cancel'); - consumer.on('error', noop); - consumer.close(); - - // recreate queue - if (this._replyTo !== false) this.createPrivateQueue(); - - return; - } - - this.log.error('private consumer returned err', err); - this.emit('error', err); - } - - // access-refused 403 - // The client attempted to work with a server entity - // to which it has no access due to security settings. - // not-found 404 - // The client attempted to work with a server entity that does not exist. - // resource-locked 405 - // The client attempted to work with a server entity - // to which it has no access because another client is working with it. - // precondition-failed 406 - // The client requested a method that was not allowed - // because some precondition failed. - async handleConsumerError(consumer, queue, err, res) { - const error = err.error || err; - - // https://www.rabbitmq.com/amqp-0-9-1-reference.html - - switch (error.replyCode) { - // ignore errors - case 311: - case 313: - this.log.error({ err, res }, 'error working with a channel:'); - return null; - - case 404: - if (error.replyText && error.replyText.includes(queue.queueOptions.queue)) { - return this.rebindConsumer(consumer, error, res); - } - return null; - - default: - this.log.warn({ err }, 'unhandled consumer error'); - return this.rebindConsumer(consumer, error, res); - } - } - - async rebindConsumer(consumer, err, res) { - const msg = err ? err.replyText : 'uncertain'; - - // cleanup a bit - this.log.warn({ err, res }, 're-establishing connection after %s', msg); - - // saved reference to re-establishing function - const establishConsumer = this._reconnectionHandlers.get(consumer); - - if (establishConsumer == null) { - this.log.fatal({ err, res }, 'failed to fetch connection handler'); - return; - } - - try { - await this.closeConsumer(consumer); - await Promise.delay(this.recovery.get('consumed', 1)); - } catch (e) { - this.log.error({ err: e }, 'failed to close consumer'); - } finally { - await establishConsumer(); - } - } - - handlePrivateConsumerCancel(consumer) { - consumer.removeAllListeners('error'); - consumer.removeAllListeners('cancel'); - consumer.on('error', noop); - consumer.close(); - - // recreate queue unless it is already being recreated - if (this._replyTo !== false) { - this.createPrivateQueue(); - } - } - - /** - * Create unnamed private queue (used for reply events) - */ - async createPrivateQueue(attempt = 0) { - const replyTo = this._replyTo; - const queueOpts = { - ...this.config.privateQueueOpts, - router: this._privateMessageRouter, // private router here - queue: replyTo || `microfleet.${uuid.v4()}`, // reuse same private queue name if it was specified before - }; - - // reset current state - this._replyTo = false; - - let createdQueue; - try { - const { consumer, queue, options } = createdQueue = await this.createQueue(queueOpts); - - // remove existing listeners - consumer.removeAllListeners('error'); - consumer.removeAllListeners('cancel'); - - // consume errors - re-create when we encounter 404 or on cancel - consumer.on('error', this.handlePrivateConsumerError.bind(this, consumer, options.queue)); - consumer.once('cancel', this.handlePrivateConsumerCancel.bind(this, consumer)); - - // declare _replyTo queueName - this._replyTo = options.queue; - - // bind temporary queue to headers exchange for DLX messages - // NOTE: if this fails we might have a problem where expired messages - // are not delivered & private queue is never ready - const dlxConfig = this.config.dlx; - if (dlxConfig.enabled === true) { - await this.bindHeadersExchange(queue, this._replyTo, dlxConfig.params, 'reply-to'); - } - } catch (e) { - this.log.error('private queue creation failed - restarting', e); - await Promise.delay(this.recovery.get('private', attempt)); - return this.createPrivateQueue(attempt + 1); - } - - this.log.debug({ queue: this._replyTo }, 'private-queue-ready'); - setImmediate(this._boundEmit, 'private-queue-ready'); - - return createdQueue; - } - - async bindQueueToExchangeOnRoutes(routes, queue, oldQueue = Object.create(null)) { - const previousRoutes = oldQueue._routes || []; - - if (routes.length === 0 && previousRoutes.length === 0) { - queue._routes = []; - return; - } - - // retrieved some of the routes - this.log.debug({ routes, previousRoutes }, 'retrieved routes'); - - const rebindRoutes = uniq([...previousRoutes, ...routes]); - queue._routes = rebindRoutes; - - const work = [ - this.bindExchange(queue, rebindRoutes, this.config.exchangeArgs), - ]; - - // bind same queue to headers exchange - if (this.config.bindPersistantQueueToHeadersExchange === true) { - work.push(this.bindHeadersExchange(queue, rebindRoutes, this.config.headersExchange)); - } - - await Promise.all(work); - } - - /** - * @param {Function} messageHandler - * @param {Array} listen - * @param {Object} options - */ - async createConsumedQueue(messageHandler, listen = [], options = {}) { - if (is.fn(messageHandler) === false || Array.isArray(listen) === false) { - throw new ArgumentError('messageHandler and listen must be present'); - } - - if (is.object(options) === false) { - throw new ArgumentError('options'); - } - - const { config } = this; - const router = initRoutingFn(messageHandler, this); - const baseOpts = { router, neck: config.neck, queue: config.queue || '' }; - const queueOptions = merge(baseOpts, config.defaultQueueOpts, this._extraQueueOptions, options); - - if (config.bindPersistantQueueToHeadersExchange === true) { - for (const route of listen.values()) { - assert.ok( - /^[^*#]+$/, route, - 'with bindPersistantQueueToHeadersExchange: true routes must not have patterns' - ); - } - } - - // pipeline for establishing consumer - const establishConsumer = async (attempt = 0) => { - const { log, recovery } = this; - const { - _consumers: consumers, - _queues: queues, - _reconnectionHandlers: connectionHandlers, - } = this; - - log.debug({ attempt }, 'establish consumer'); - - const oldConsumer = consumers.get(establishConsumer); - const oldQueue = queues.get(establishConsumer); - - // if we have old consumer - if (oldConsumer) { - await this.closeConsumer(oldConsumer); - } - - let createdQueue; - try { - const { queue } = createdQueue = await this.createQueue({ ...queueOptions }); - await this.bindQueueToExchangeOnRoutes(listen, queue, oldQueue); - } catch (e) { - const err = new ConnectionError('failed to init queue or exchange', e); - log.warn({ err }, '[consumed-queue-down]'); - await Promise.delay(recovery.get('consumed', attempt + 1)); - return establishConsumer(attempt + 1); - } - - const { consumer, queue } = createdQueue; - - // save ref to WeakMap - consumers.set(establishConsumer, consumer); - queues.set(establishConsumer, queue); - connectionHandlers.set(consumer, establishConsumer); - - // remove previous listeners if we re-use the channel - // for any reason - consumer.removeAllListeners('error'); - consumer.removeAllListeners('cancel'); - - consumer.on('error', this.handleConsumerError.bind(this, consumer, queue)); - consumer.on('cancel', this.rebindConsumer.bind(this, consumer)); - - // emit event that we consumer & queue is ready - const queueName = queue.queueOptions.queue; - log.info({ queueName, consumerTag: consumer.consumerTag }, 'consumed-queue-reconnected'); - this.emit('consumed-queue-reconnected', consumer, queue, establishConsumer); - - return queue.queueOptions.queue; - }; - - // make sure we recreate queue and establish consumer on reconnect - this.log.debug({ listen, queue: queueOptions.queue }, 'creating consumed queue'); - const queueName = await establishConsumer(); - - this.log.debug({ listen, queue: queueName }, 'bound `ready` to establishConsumer'); - this.on('ready', establishConsumer); - - return establishConsumer; - } - - /** - * Stops current running consumers - */ - async closeAllConsumers() { - const work = []; - for (const consumer of this._consumers.values()) { - work.push(this.stopConsumedQueue(consumer)); - } - await Promise.all(work); - } - - /** - * Utility function to close consumer and forget about it - */ - async closeConsumer(consumer) { - this.log.warn('closing consumer', consumer.consumerTag); - - // cleanup after one-self - this._consumers.delete(this._reconnectionHandlers.get(consumer)); - this._reconnectionHandlers.delete(consumer); - - consumer.removeAllListeners(); - consumer.on('error', noop); - - this._boundEmit('consumer-close', consumer); - - // close channel - await Promise - .fromCallback((done) => { - consumer.cancel(done); - }) - .timeout(5000) - .catch(Promise.TimeoutError, noop); - - this.log.info({ consumerTag: consumer.consumerTag }, 'closed consumer'); - } - - /** - * Prevents consumer from re-establishing connection - * @param {Consumer} consumer - * @returns {Promise} - */ - async stopConsumedQueue(consumer) { - if (!consumer) { - throw new TypeError('consumer must be defined'); - } - - const establishConsumer = this._reconnectionHandlers.get(consumer); - this.log.debug({ establishConsumer: !!establishConsumer }, 'fetched establish consumer'); - if (establishConsumer) { - this.removeListener('ready', establishConsumer); - } - - await this.closeConsumer(consumer); - } - - /** - * Declares exchange and reports 406 error. - * @param {Object} params - Exchange params. - * @returns {Promise<*>} - */ - declareExchange(params) { - return this._amqp - .exchangeAsync(params) - .call('declareAsync') - .catch(error406, this._on406.bind(this, params)); - } - - /** - * Binds exchange to queue via route. For Headers exchange - * automatically populates arguments with routing-key: . - * @param {string} exchange - Exchange to bind to. - * @param {Queue} queue - Declared queue object. - * @param {string} route - Routing key. - * @param {boolean} [headerName=false] - if exchange has `headers` type. - * @returns {Promise<*>} - */ - async bindRoute(exchange, queue, route, headerName = false) { - const queueName = queue.queueOptions.queue; - const options = {}; - let routingKey; - - if (headerName === false) { - routingKey = route; - } else { - options.arguments = { - 'x-match': 'any', - [headerName === true ? 'routing-key' : headerName]: route, - }; - routingKey = ''; - } - - const response = await queue.bindAsync(exchange, routingKey, options); - const { _routes: routes } = queue; - - if (Array.isArray(routes)) { - // reconnect might push an extra route - if (!routes.includes(route)) { - routes.push(route); - } - - this.log.trace({ routes, queueName }, '[queue routes]'); - } - - this.log.debug({ queueName, exchange, routingKey }, 'bound queue to exchange'); - - return response; - } - - /** - * Bind specified queue to exchange - * - * @param {object} queue - queue instance created by .createQueue - * @param {string} _routes - messages sent to this route will be delivered to queue - * @param {object} [opts={}] - exchange parameters: - * https://github.com/dropbox/amqp-coffee#connectionexchangeexchangeargscallback - */ - bindExchange(queue, _routes, opts = {}) { - // make sure we have an expanded array of routes - const routes = toUniqueStringArray(_routes); - - // default params - const params = merge({ - exchange: this.config.exchange, - type: this.config.exchangeArgs.type, - durable: true, - autoDelete: false, - }, opts); - - const { exchange } = params; - assert(exchange, 'exchange name must be specified'); - this.log.debug('bind routes->exchange', routes, exchange); - - return this.declareExchange(params) - .return(routes) - .map((route) => ( - this.bindRoute(exchange, queue, route) - )); - } - - /** - * Binds multiple routing keys to headers exchange. - * @param {Object} queue - * @param {mixed} _routes - * @param {Object} opts - * @param {boolean} [headerName=false] - if exchange has `headers` type - * @returns {Promise<*>} - */ - bindHeadersExchange(queue, _routes, opts, headerName = true) { - // make sure we have an expanded array of routes - const routes = toUniqueStringArray(_routes); - // default params - const params = merge({ durable: true, autoDelete: false }, opts); - const { exchange } = params; - - // headers exchange - // do sanity check - assert.equal(params.type, 'headers'); - assert.ok(exchange, 'exchange must be set'); - - this.log.debug('bind routes->exchange/headers', routes, exchange); - - return this.declareExchange(params) - .return(routes) - .map((route) => { - assert.ok(/^[^*#]+$/.test(route)); - return this.bindRoute(exchange, queue, route, headerName); - }); - } - - /** - * Unbind specified queue from exchange - * - * @param {object} queue - queue instance created by .createQueue - * @param {string} _routes - messages sent to this route will be delivered to queue - */ - unbindExchange(queue, _routes) { - const { exchange } = this.config; - const routes = toUniqueStringArray(_routes); - - return Promise.map(routes, (route) => ( - queue.unbindAsync(exchange, route).tap(() => { - const queueName = queue.queueOptions.queue; - if (queue._routes) { - const idx = queue._routes.indexOf(route); - if (idx >= 0) { - queue._routes.splice(idx, 1); - } - - this.log.debug({ routes: queue._routes }, 'queue routes'); - } - - this.log.info({ queueName, exchange, route }, 'queue unbound from exchange'); - }) - )); - } - - /** - * Low-level publishing method - * @param {string} exchange - * @param {string} queueOrRoute - * @param {mixed} _message - * @param {Object} options - * @returns {Promise<*>} - */ - async sendToServer(exchange, queueOrRoute, _message, options) { - const publishOptions = this._publishOptions(options); - const message = options.skipSerialize === true - ? _message - : await serialize(_message, publishOptions); - - const { _amqp: amqp } = this; - if (!amqp) { - // NOTE: if this happens - it means somebody - // called (publish|send)* after amqp.close() - // or there is an auto-retry policy that does the same - throw new InvalidOperationError('connection was closed'); - } - - const request = await amqp - .publishAsync(exchange, queueOrRoute, message, publishOptions); - - // emit original message - this.emit('publish', queueOrRoute, _message); - - return request; - } - - /** - * Send message to specified route - * - * @param {String} route - destination route - * @param {mixed} message - message to send - will be coerced to string via stringify - * @param {Object} options - additional options - * @param {Span} parentSpan - */ - publish(route, message, options = {}, parentSpan) { - const span = this.tracer.startSpan(`publish:${route}`, { - childOf: parentSpan, - }); - - // prepare exchange - const exchange = is.string(options.exchange) - ? options.exchange - : this.config.exchange; - - span.addTags({ - [Tags.SPAN_KIND]: Tags.SPAN_KIND_MESSAGING_PRODUCER, - [Tags.MESSAGE_BUS_DESTINATION]: `${exchange}:${route}`, - }); - - return wrapPromise(span, this.sendToServer( - exchange, - route, - message, - options - )); - } - - /** - * Send message to specified queue directly - * - * @param {String} queue - destination queue - * @param {mixed} message - message to send - * @param {Object} [options] - additional options - * @param {opentracing.Span} [parentSpan] - Existing span. - */ - send(queue, message, options = {}, parentSpan) { - const span = this.tracer.startSpan(`send:${queue}`, { - childOf: parentSpan, - }); - - // prepare exchange - const exchange = is.string(options.exchange) - ? options.exchange - : ''; - - span.addTags({ - [Tags.SPAN_KIND]: Tags.SPAN_KIND_MESSAGING_PRODUCER, - [Tags.MESSAGE_BUS_DESTINATION]: `${exchange || ''}:${queue}`, - }); - - return wrapPromise(span, this.sendToServer( - exchange, - queue, - message, - options - )); - } - - /** - * Sends a message and then awaits for response - * @param {String} route - * @param {mixed} message - * @param {Object} options - * @param {Span} parentSpan - * @return {Promise} - */ - publishAndWait(route, message, options = {}, parentSpan) { - // opentracing instrumentation - const span = this.tracer.startSpan(`publishAndWait:${route}`, { - childOf: parentSpan, - }); - - span.addTags({ - [Tags.SPAN_KIND]: Tags.SPAN_KIND_RPC_CLIENT, - [Tags.MESSAGE_BUS_DESTINATION]: route, - }); - - return wrapPromise(span, this.createMessageHandler( - route, - message, - options, - this.publish, - span - )); - } - - /** - * Send message to specified queue directly and wait for answer - * - * @param {string} queue destination queue - * @param {any} message message to send - * @param {object} options additional options - * @param {Span} parentSpan - */ - sendAndWait(queue, message, options = {}, parentSpan) { - // opentracing instrumentation - const span = this.tracer.startSpan(`sendAndWait:${queue}`, { - childOf: parentSpan, - }); - - span.addTags({ - [Tags.SPAN_KIND]: Tags.SPAN_KIND_RPC_CLIENT, - [Tags.MESSAGE_BUS_DESTINATION]: queue, - }); - - return wrapPromise(span, this.createMessageHandler( - queue, - message, - options, - this.send - )); - } - - /** - * Specifies default publishing options - * @param {Object} options - * @param {String} options.exchange - will be overwritten by exchange thats passed - * in the publish/send methods - * https://github.com/dropbox/amqp-coffee/blob/6d99cf4c9e312c9e5856897ab33458afbdd214e5/src/lib/Publisher.coffee#L90 - * @return {Object} - */ - _publishOptions(options = {}) { - // remove unused opts - const { skipSerialize, gzip: needsGzip, ...opts } = options; - - // force contentEncoding - if (needsGzip === true) { - opts.contentEncoding = 'gzip'; - } - - // set default opts - defaults(opts, this._defaultOpts); - - // append request timeout in headers - defaults(opts.headers, { - timeout: opts.timeout || this.config.timeout, - }); - - return opts; - } - - _replyOptions(options = {}) { - return { - simpleResponse: options.simpleResponse === undefined - ? this._defaultOpts.simpleResponse - : options.simpleResponse, - }; - } - - /** - * Reply to sender queue based on headers - * - * @param {Object} properties - incoming message headers - * @param {mixed} message - message to send - * @param {Span} [span] - opentracing span - * @param {AMQPMessage} [raw] - raw message - */ - reply(properties, message, span, raw) { - if (!properties.replyTo || !properties.correlationId) { - const error = new ValidationError('replyTo and correlationId not found in properties', 400); - - if (span !== undefined) { - span.setTag(Tags.ERROR, true); - span.log({ - event: 'error', 'error.object': error, message: error.message, stack: error.stack, - }); - span.finish(); - } - - if (raw !== undefined) { - this.emit('after', raw); - } - - return Promise.reject(error); - } - - const options = { - correlationId: properties.correlationId, - }; - - if (properties[kReplyHeaders]) { - options.headers = properties[kReplyHeaders]; - } - - let promise = this.send(properties.replyTo, message, options, span); - - if (raw !== undefined) { - promise = promise - .finally(() => this.emit('after', raw)); - } - - return span === undefined - ? promise - : wrapPromise(span, promise); - } - - /** - * Creates local listener for when a private queue is up - * @returns {Promise} - */ - awaitPrivateQueue() { - /* eslint-disable prefer-const */ - return new Promise((resolve, reject) => { - let done; - let error; - - done = function onReady() { - this.removeAllListeners('error', error); - error = null; - resolve(); - }; - - error = function onError(err) { - this.removeListener('private-queue-ready', done); - done = null; - reject(err); - }; - - this.once('private-queue-ready', done); - this.once('error', error); - }); - /* eslint-enable prefer-const */ - } - - /** - * Creates response message handler and sets timeout on the response - * @param {String} routing - * @param {Object} options - * @param {String} message - * @param {Function} publishMessage - * @param {Span} span - opentracing span - * @return {Promise} - */ - async createMessageHandler(routing, message, options, publishMessage, span) { - assert(typeof options === 'object' && options !== null, 'options must be an object'); - - const replyTo = options.replyTo || this._replyTo; - const time = process.hrtime(); - const replyOptions = this._replyOptions(options); - - // ensure that reply queue exists before sending request - if (typeof replyTo !== 'string') { - if (replyTo === false) { - await this.awaitPrivateQueue(); - } else { - await this.createPrivateQueue(); - } - - return this.createMessageHandler(routing, message, options, publishMessage, span); - } - - // work with cache if options.cache is set and is number - // otherwise cachedResponse is always null - const cachedResponse = this.cache.get(message, options.cache); - if (cachedResponse !== null && typeof cachedResponse === 'object') { - return adaptResponse(cachedResponse.value, replyOptions); - } - - const { replyStorage } = this; - // generate response id - const correlationId = options.correlationId || uuid.v4(); - // timeout before RPC times out - const timeout = options.timeout || this.config.timeout; - - // slightly longer timeout, if message was not consumed in time, it will return with expiration - const publishPromise = new Promise((resolve, reject) => { - // push into RPC request storage - replyStorage.push(correlationId, { - timeout, - time, - routing, - resolve, - reject, - replyOptions, - cache: cachedResponse, - timer: null, - }); - }); - - // debugging - this.log.trace('message pushed into reply queue in %s', latency(time)); - - // add custom header for routing over amq.headers exchange - if (!options.headers) { - options.headers = Object.create(null); - } - options.headers['reply-to'] = replyTo; - - // add opentracing instrumentation - if (span) { - this.tracer.inject(span.context(), FORMAT_TEXT_MAP, options.headers); - } - - // this is to ensure that queue is not overflown and work will not - // be completed later on - publishMessage - .call(this, routing, message, { - ...options, - replyTo, - correlationId, - expiration: Math.ceil(timeout * 0.9).toString(), - }, span) - .tap(() => { - this.log.trace({ latency: latency(time) }, 'message published'); - }) - .catch((err) => { - this.log.error({ err }, 'error sending message'); - replyStorage.reject(correlationId, err); - }); - - return publishPromise; - } - - /** - * - * @param {Object} message - * - @param {Object} data: a getter that returns the data in its parsed form, eg a - * parsed json object, a string, or the raw buffer - * - @param {Object} raw: the raw buffer that was returned - * - @param {Object} properties: headers specified for the message - * - @param {Number} size: message body size - * - @param {Function} ack(): function : only used when prefetchCount is specified - * - @param {Function} reject(): function: only used when prefetchCount is specified - * - @param {Function} retry(): function: only used when prefetchCount is specified - */ - _onConsume(_router) { - assert(is.fn(_router), '`router` must be a function'); - - // use bind as it is now fast - const amqpTransport = this; - const parseInput = amqpTransport._parseInput.bind(amqpTransport); - const router = _router.bind(amqpTransport); - - return async function consumeMessage(incoming) { - // emit pre processing hook - amqpTransport.emit('pre', incoming); - - // extract message data - const { properties } = incoming; - const { contentType, contentEncoding } = properties; - - // parsed input data - const message = await parseInput(incoming.raw, contentType, contentEncoding); - // useful message properties - const props = { ...properties, ...pick(incoming, extendMessageProperties) }; - - // pass to the consumer message router - // message - properties - incoming - // incoming.raw<{ ack: ?Function, reject: ?Function, retry: ?Function }> - // and everything else from amqp-coffee - setImmediate(router, message, props, incoming); - }; - } - - /** - * Distributes messages from a private queue - * @param {mixed} message - * @param {Object} properties - */ - _privateMessageRouter(message, properties/* , raw */) { // if private queue has nack set - we must ack msg - const { correlationId, replyTo, headers } = properties; - const { 'x-death': xDeath } = headers; - - // retrieve promised message - const future = this.replyStorage.pop(correlationId); - - // case 1 - for some reason there is no saved reference, example - crashed process - if (future === undefined) { - this.log.error('no recipient for the message %j and id %s', message.error || message.data || message, correlationId); - - let error; - if (xDeath) { - error = new AmqpDLXError(xDeath, message); - this.log.warn('message was not processed', error); - } - - // otherwise we just run messages in circles - if (replyTo && replyTo !== this._replyTo) { - // if error is undefined - generate this - if (error === undefined) { - error = new NotPermittedError(`no recipients found for correlationId "${correlationId}"`); - } - - // reply with the error - return this.reply(properties, { error }); - } - - // we are done - return null; - } - - this.log.trace('response returned in %s', latency(future.time)); - - // if message was dead-lettered - reject with an error - if (xDeath) { - return future.reject(new AmqpDLXError(xDeath, message)); - } - - if (message.error) { - const error = wrapError(message.error); - - Object.defineProperty(error, kReplyHeaders, { - value: headers, - enumerable: false, - }); - - return future.reject(error); - } - - const response = buildResponse(message, properties); - this.cache.set(future.cache, response); - - return future.resolve(adaptResponse(response, future.replyOptions)); - } - - async _parseInput(_data, contentType = 'application/json', contentEncoding = 'plain') { - let data; - - switch (contentEncoding) { - case 'gzip': - data = await gunzip(_data).catchReturn({ err: PARSE_ERR }); - break; - - case 'plain': - data = _data; - break; - - default: - return { err: PARSE_ERR }; - } - - switch (contentType) { - // default encoding when we were pre-stringifying and sending str - // and our updated encoding when we send buffer now - case 'string/utf8': - case 'application/json': - return safeJSONParse(data, this.log); - - default: - return data; - } - } - - /** - * Handle 406 Error. - * @param {Object} params - exchange params - * @param {Error} err - 406 Conflict Error. - */ - _on406(params, err) { - this.log.warn({ params }, '[406] error declaring exchange/queue:', err.replyText); - } - - /** - * 'ready' event from amqp-coffee lib, perform queue recreation here - */ - _onConnect() { - const { serverProperties } = this._amqp; - const { cluster_name: clusterName, version } = serverProperties; - - // emit connect event through log - this.log.info('connected to %s v%s', clusterName, version); - - // https://github.com/dropbox/amqp-coffee#reconnect-flow - // recreate unnamed private queue - if ((this._replyTo || this.config.private) && this._replyTo !== false) { - this.createPrivateQueue(); - } - - // re-emit ready - this.emit('ready'); - } - - /** - * Pass in close event - */ - _onClose(err) { - // emit connect event through log - this.log.warn({ err }, 'connection is closed'); - // re-emit close event - this.emit('close', err); - } -} - -// expose static connectors -helpers(AMQPTransport); - -// assign statics -module.exports = AMQPTransport; diff --git a/src/utils/backoff.ts b/src/backoff/index.ts similarity index 100% rename from src/utils/backoff.ts rename to src/backoff/index.ts diff --git a/src/consumer/factory.ts b/src/consumer/factory.ts index 281d726..f391e5e 100644 --- a/src/consumer/factory.ts +++ b/src/consumer/factory.ts @@ -2,7 +2,7 @@ import pick from 'lodash/fp/pick' import { AMQP } from '../utils/transport' import { parseInput } from '../utils/parsing' -import { EntityStore } from '../utils/entity-store' +import { EntityStore } from '../entity-store' import { getInstance as getLoggerInstance } from '../loggers' import { Consumer, ConsumerOpts } from './consumer' @@ -85,7 +85,7 @@ export class ConsumerFactory extends EntityStore { #createMessageHandler = < RequestBody extends any = any, ResponseBody extends any = any - >( + >( onMessage: MessageHandler, onMessagePre?: MessagePreHandler ) => ( diff --git a/src/utils/entity-store.ts b/src/entity-store/index.ts similarity index 100% rename from src/utils/entity-store.ts rename to src/entity-store/index.ts diff --git a/src/message-options/index.ts b/src/message-options/index.ts new file mode 100644 index 0000000..a41ff46 --- /dev/null +++ b/src/message-options/index.ts @@ -0,0 +1,96 @@ +import { kReplyHeaders } from '../constants' +import { PublishingConfHeaders, PublishingConfOpts } from '../schema/publishing' +import { ContentEncoding, ContentType, WellKnowHeaders } from '../types' + +export interface MessageHeaders + extends PublishingConfHeaders, + Record +{ + contentType: ContentType + contentEncoding: ContentEncoding +} + +// TODO +// WTF? message headers are exactly the same according to the old code +export interface PublishOptions extends PublishingConfOpts { + appId: string + replyTo?: string + correlationId?: string + routingKey: string + headers: Partial + gzip?: boolean + cache?: number + timeout?: number + exchange?: string + arguments?: Record + expiration?: string + skipSerialize?: boolean + contentType: ContentType + contentEncoding: ContentEncoding + [kReplyHeaders]: Partial +} + +export interface ReplyOptions { + simpleResponse?: boolean +} + +export class MessageOptions { + /** + * Specifies default publishing options + * @param {Object} options + * @param {String} options.exchange - will be overwritten by exchange thats passed + * in the publish/send methods + * https://github.com/dropbox/amqp-coffee/blob/6d99cf4c9e312c9e5856897ab33458afbdd214e5/src/lib/Publisher.coffee#L90 + * @return {Object} + */ + static getPublishOptions = ( + options: Partial, + defaults: Partial = {}, + defaultTimeout: number = 30000, + ) => { + // remove unused props such as: + // - skipSerialize + // - gzip in favor of contentEncoding + const needsGzip = options.gzip ?? defaults.gzip + const timeout = options.timeout ?? defaultTimeout + // explicitly create an object to keep hidden shape + const publishOpts = { + appId: options.appId ?? defaults.appId, + correlationId: options.correlationId ?? defaults.correlationId, + replyTo: options.replyTo ?? defaults.replyTo, + routingKey: options.routingKey ?? defaults.routingKey, + exchange: options.exchange ?? defaults.exchange, + + cache: options.cache ?? defaults.cache, + confirm: options.confirm ?? defaults.confirm, + + headers: options.headers ?? defaults.headers, + arguments: options.arguments ?? defaults.arguments, + + deliveryMode: options.deliveryMode ?? defaults.deliveryMode, + contentType: options.contentType ?? defaults.contentType, + // enforce contentEncoding + contentEncoding: needsGzip + ? ContentEncoding.Gzip + : options.contentEncoding ?? defaults.contentEncoding, + + immediate: options.immediate ?? defaults.immediate, + mandatory: options.mandatory ?? defaults.mandatory, + expiration: options.expiration ?? defaults.expiration, + simpleResponse: options.simpleResponse ?? defaults.simpleResponse, + } as PublishOptions + + // append request timeout in headers + Object.assign(publishOpts.headers, { + timeout, + }) + + return publishOpts + } + + static getReplyOptions = (options: ReplyOptions, defaults: Partial) => { + return { + simpleResponse: options.simpleResponse ?? defaults.simpleResponse, + } + } +} diff --git a/src/module.d.ts b/src/module.d.ts new file mode 100644 index 0000000..c7c4819 --- /dev/null +++ b/src/module.d.ts @@ -0,0 +1 @@ +declare module 'flatstr' diff --git a/src/queue/factory.ts b/src/queue/factory.ts index ab4f10a..f4ba702 100644 --- a/src/queue/factory.ts +++ b/src/queue/factory.ts @@ -2,7 +2,7 @@ import is from '@sindresorhus/is' import { AMQP } from '../utils/transport' import { Queue } from './queue' -import { EntityStore } from '../utils/entity-store' +import { EntityStore } from '../entity-store' import { QueueConfOpts } from './schema' import { getInstance as getLoggerInstance } from '../loggers' diff --git a/src/queue/queue.ts b/src/queue/queue.ts index 15e3043..60f581f 100644 --- a/src/queue/queue.ts +++ b/src/queue/queue.ts @@ -1,6 +1,7 @@ -import hyperid from 'hyperid' import uniq from 'lodash/uniq' import { getInstance as getLoggerInstance } from '../loggers' +import { SequenceProvider } from '../sequence-provider' +import { WellKnowHeaders } from '../types' import { on406 } from '../utils/error' import { AMQP } from '../utils/transport' @@ -37,9 +38,9 @@ export class Queue { }) } - static nameSequence = hyperid({ urlSafe: true }) + static sequence = new SequenceProvider({ urlSafe: true }) static getName(replyTo?: string) { - return replyTo ?? `microfleet.${Queue.nameSequence()}` + return replyTo ?? `microfleet.${Queue.sequence.next()}` } constructor(token: symbol, queue: AMQP.Queue, props: CreateQueueProps) { @@ -87,8 +88,8 @@ export class Queue { routingKey = route } else { options.arguments = { - 'x-match': 'any', - [headerName === true ? 'routing-key' : headerName]: route, + [WellKnowHeaders.XMatch]: 'any', + [headerName === true ? WellKnowHeaders.RoutingKey : headerName]: route, } } @@ -108,6 +109,5 @@ export class Queue { this.log.debug({ queueName, exchange, routingKey }, 'bound queue to exchange') return response } - } diff --git a/src/utils/reply-storage.ts b/src/reply-storage/index.ts similarity index 88% rename from src/utils/reply-storage.ts rename to src/reply-storage/index.ts index 1051d90..ea13433 100644 --- a/src/utils/reply-storage.ts +++ b/src/reply-storage/index.ts @@ -1,18 +1,27 @@ -import { setTimeout } from 'timers' import { TimeoutError } from 'common-errors' -import { generateErrorMessage } from './error' +import { setTimeout } from 'timers' +import { ReplyOptions } from '../message-options' +import { generateErrorMessage } from '../utils/error' + +export interface PendingReplyConf { + // promise resolve fn + resolve(value: any): void + + // promise reject fn + reject(reason: any): void -export interface PendingReplyConf extends Pick { // expected response time timeout: number // routing key for error message. routing: string - // whether return body-only response or include headers - simple: boolean // process.hrtime() results time: ReturnType // cache key cache: string | null + // reply options: + replyOptions: ReplyOptions + // whether return body-only response or include headers + simple?: boolean } export interface PendingReply extends PendingReplyConf { @@ -69,7 +78,7 @@ export class ReplyStorage { (opts as PendingReply).timer = setTimeout( this.onTimeout, opts.timeout, - correlationId + correlationId, ) this.storage.set(correlationId, opts as PendingReply) @@ -104,7 +113,7 @@ export class ReplyStorage { } pop(correlationId: string) { - const future = this.storage.get(correlationId); + const future = this.storage.get(correlationId) // if undefined - early return if (future === undefined) { diff --git a/src/utils/cache.ts b/src/response-cache/index.ts similarity index 78% rename from src/utils/cache.ts rename to src/response-cache/index.ts index e6e4241..9673691 100644 --- a/src/utils/cache.ts +++ b/src/response-cache/index.ts @@ -1,11 +1,10 @@ -import is from '@sindresorhus/is' import hashlru from 'hashlru' import hash from 'object-hash' import assert from 'assert' import { Schema } from '../schema' import { LoggerLike } from '../schema/logger-like' -const latency = require('./latency') +import { latency, HRTime } from '../utils/latency' type HashLRU = ReturnType @@ -14,6 +13,11 @@ export interface CacheOpts { log: LoggerLike } +export interface CachedResponse { + maxAge: HRTime + value: Response +} + export class Cache { public enabled: boolean private log: LoggerLike @@ -30,10 +34,10 @@ export class Cache { } // TODO Message interface - public get(message: any, maxAge: number) { + public get(message: any, maxAge: number = 0) { try { assert(this.enabled, 'tried to use disabled cache') - return this.#get(message, maxAge) + return this.#get(message, maxAge) } catch (e) { this.log.debug(e.message) return null @@ -50,8 +54,8 @@ export class Cache { } } - #get = (message: any, maxAge: number) => { - if (is.number(maxAge) === false) { + #get = (message: any, maxAge: number): CachedResponse | string | null => { + if (maxAge === 0) { return null } @@ -60,7 +64,7 @@ export class Cache { if (response !== undefined) { if (latency(response.maxAge) < maxAge) { - return response; + return response } this.cache.remove(hashKey) diff --git a/src/schema/publishing.ts b/src/schema/publishing.ts index 403a150..f3b6e50 100644 --- a/src/schema/publishing.ts +++ b/src/schema/publishing.ts @@ -1,4 +1,5 @@ import * as z from 'zod' +import { ContentEncoding, ContentType } from '../types' export enum DeliveryMode { Transient = 1, @@ -8,6 +9,12 @@ export enum DeliveryMode { export const DeliveryModeEnum = z.nativeEnum(DeliveryMode) .default(DeliveryMode.Transient) +export const PublishingHeaders = z.record(z.union([ + z.number(), + z.string(), + z.undefined() +])) + export const PublishingConfOpts = z.object({ /** 1 - transient, 2 - saved on disk */ deliveryMode: DeliveryModeEnum, @@ -27,14 +34,15 @@ export const PublishingConfOpts = z.object({ /** TODO: enum? */ /** default content-type for messages */ contentType: z.string() - .default('application/json'), + .default(ContentType.Json), /** default content-encoding */ contentEncoding: z.string() - .default('plain'), + .default(ContentEncoding.Plain), - /** TODO: type */ - headers: z.any(), + /** additional headers */ + headers: PublishingHeaders + .default({}), /** whether to return only response data or include headers etc. */ simpleResponse: z.boolean() @@ -42,3 +50,4 @@ export const PublishingConfOpts = z.object({ }) export type PublishingConfOpts = z.infer +export type PublishingConfHeaders = z.infer diff --git a/src/sequence-provider/index.ts b/src/sequence-provider/index.ts new file mode 100644 index 0000000..52e6035 --- /dev/null +++ b/src/sequence-provider/index.ts @@ -0,0 +1,13 @@ +import hyperid from 'hyperid' + +export class SequenceProvider { + readonly #instance: hyperid.Instance + + constructor(opts: hyperid.Options = {}) { + this.#instance = hyperid(opts) + } + + next() { + return this.#instance() + } +} diff --git a/src/types.ts b/src/types.ts index 5416931..512ac08 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,20 +1,25 @@ +import opentracing from 'opentracing' import { Consumer } from './consumer' +import { MessageHeaders, PublishOptions } from './message-options' + import { Queue } from './queue' -import { PublishingConfOpts } from './schema/publishing' import { AMQP } from './utils/transport' export type AnyFunction = (...args: any[]) => any -export interface PublishingOpts extends PublishingConfOpts { - appId: string - replyTo: string - correlationId: string - timeout?: number - exchange?: string - arguments?: Record +export const enum WellKnowHeaders { + ReplyTo = 'reply-to', + Timeout = 'timeout', + XDeath = 'x-death', + XMatch = 'x-match', + RoutingKey = 'routing-key', + ContentType = 'contentType', + ContentEncoding = 'contentEncoding', } export interface ExtendedMessage { + replyTo?: string + correlationId?: string weight: number exchange: string routingKey: string @@ -22,11 +27,6 @@ export interface ExtendedMessage { redelivered: boolean } -export interface MessageHeaders extends Record { - contentType: ContentType - contentEncoding: ContentEncoding -} - export interface RawMessage< ResponseBody extends any > extends ExtendedMessage { @@ -40,19 +40,34 @@ export interface RawMessage< [x: string]: any } -export type MessageProps = MessageHeaders & ExtendedMessage - export interface MessageHandler< RequestBody extends any = any, ResponseBody extends any = any > { - (payload: RequestBody, properties: PublishingOpts, raw: RawMessage): PromiseLike + ( + payload: RequestBody, + properties: PublishOptions, + raw: RawMessage, + responseHandler: (error?: Error, data?: ResponseBody) => void + ): PromiseLike } export interface MessagePreHandler { (raw: RawMessage): void } +export interface PublishMessageHandle< + RequestBody extends any = any, + ResponseBody extends any = any +> { + ( + route: string, + message: RequestBody, + options: Partial, + parentSpan?: opentracing.Span | opentracing.SpanContext + ): Promise +} + export interface ConsumedQueue { queue: Queue options: AMQP.QueueOpts @@ -70,11 +85,12 @@ export const enum ContentEncoding { } export const enum AMQPTransportEvents { - // pre-processing hook Pre = 'pre', + After = 'after', Ready = 'ready', Close = 'close', Error = 'error', + Publish = 'publish', ConsumerClose = 'consumer-close', PrivateQueueReady = 'private-queue-ready', ConsumedQueueReconnected = 'consumed-queue-reconnected', diff --git a/src/utils/error.ts b/src/utils/error.ts index a534e39..f2cb067 100644 --- a/src/utils/error.ts +++ b/src/utils/error.ts @@ -74,7 +74,7 @@ const copyErrorData = [ 'field', 'reason', 'stack', ] -type ErrorLike = Record & { +export type ErrorLike = Record & { message?: string } diff --git a/src/utils/get-app-id.ts b/src/utils/get-app-id.ts index 40aece8..a318660 100644 --- a/src/utils/get-app-id.ts +++ b/src/utils/get-app-id.ts @@ -10,12 +10,10 @@ export interface AppID { version: string } -export const getAppID = (it: AMQPTransport): AppID => { - return { - pid: process.pid, - name: it.config.name, - host: hostname(), - version: it.config.version, - utils_version: pkg.version, - } -} +export const getAppID = (it: AMQPTransport): AppID => ({ + pid: process.pid, + name: it.config.name, + host: hostname(), + version: it.config.version, + utils_version: pkg.version, +}) diff --git a/src/utils/init-routing-fn.ts b/src/utils/init-routing-fn.ts index 644ba29..5bbbef0 100644 --- a/src/utils/init-routing-fn.ts +++ b/src/utils/init-routing-fn.ts @@ -1,8 +1,9 @@ import { Tags, FORMAT_TEXT_MAP } from 'opentracing' import { AMQPTransport } from '../amqp-transport' +import { PublishOptions } from '../message-options' import { safeJSONParse } from './parsing' -import { MessageHandler, PublishingOpts, RawMessage } from '../types' +import { MessageHandler, RawMessage } from '../types' /** * Routing function HOC with reply RPC enhancer @@ -24,7 +25,7 @@ export const initRoutingFn = < * @param {mixed} data - Response data. * @returns {Promise<*>} */ - function responseHandler(this: undefined, raw: RawMessage, error: Error, data: ResponseBody) { + function responseHandler(this: undefined, raw: RawMessage, error?: Error, data?: ResponseBody) { const { properties, span } = raw return !properties.replyTo || !properties.correlationId ? transport.noop(error, data, span, raw) @@ -44,7 +45,7 @@ export const initRoutingFn = < return function router( this: AMQPTransport, message: RequestBody, - properties: PublishingOpts, + properties: PublishOptions, raw: RawMessage ) { // add instrumentation @@ -55,19 +56,22 @@ export const initRoutingFn = < FORMAT_TEXT_MAP, properties.headers ?? {} ) - const span = this.tracer.startSpan(`onConsume:${properties.routingKey}`, { - childOf, - }); - span.addTags({ - [Tags.SPAN_KIND]: Tags.SPAN_KIND_RPC_SERVER, - [Tags.PEER_SERVICE]: appId.name, - [Tags.PEER_HOSTNAME]: appId.host, - }) + if (childOf) { + const span = this.tracer.startSpan(`onConsume:${properties.routingKey}`, { + childOf, + }) - // define span in the original message - // so that userland has access to it - raw.span = span + span.addTags({ + [Tags.SPAN_KIND]: Tags.SPAN_KIND_RPC_SERVER, + [Tags.PEER_SERVICE]: appId.name, + [Tags.PEER_HOSTNAME]: appId.host, + }) + + // define span in the original message + // so that userland has access to it + raw.span = span + } return messageHandler( message, diff --git a/src/utils/latency.ts b/src/utils/latency.ts index aae0186..57e115b 100644 --- a/src/utils/latency.ts +++ b/src/utils/latency.ts @@ -1,9 +1,9 @@ export type HRTime = ReturnType -export function toMiliseconds(hrtime: HRTime) { +export function toMilliseconds(hrtime: HRTime) { return (hrtime[0] * 1e3) + (Math.round(hrtime[1] / 1e3) / 1e3) } export function latency(time: HRTime) { - return toMiliseconds(process.hrtime(time)) + return toMilliseconds(process.hrtime(time)) } diff --git a/src/utils/response.ts b/src/utils/response.ts index e4a31ea..2a0a562 100644 --- a/src/utils/response.ts +++ b/src/utils/response.ts @@ -1,4 +1,4 @@ -import { MessageHeaders, PublishingOpts } from '../types' +import { MessageHeaders, PublishOptions, ReplyOptions } from '../message-options' export interface Message< Body extends any, @@ -16,10 +16,6 @@ export interface Response< headers: Headers } -export interface ReplyOptions { - simpleResponse?: boolean -} - /** * @param {Object} response * @oaram {Object} response.data @@ -46,11 +42,11 @@ export function adaptResponse( */ export function buildResponse< Body extends any, - Properties extends PublishingOpts = PublishingOpts, + Properties extends PublishOptions = PublishOptions, >( message: Message, properties: Properties -) { +): Response { const { headers } = properties const { data } = message diff --git a/src/utils/serialization.ts b/src/utils/serialization.ts index ada6b31..7421f66 100644 --- a/src/utils/serialization.ts +++ b/src/utils/serialization.ts @@ -1,5 +1,14 @@ import is from '@sindresorhus/is' import Errors from 'common-errors' +import flatstr from 'flatstr' +import stringify from 'safe-stable-stringify' +import { promisify } from 'util' +import { gzip } from 'zlib' + +import { PublishOptions } from '../message-options' +import { ContentEncoding, ContentType } from '../types' + +const gzipAsync = promisify(gzip) export const enum SerializedContentType { MSError = 'ms-error', @@ -111,3 +120,27 @@ export function jsonDeserializer(_: string, value: Serialized | any) { return value } } + +export const serialize = async ( + message: any, + publishOptions: Pick +) => { + let serialized + + switch (publishOptions.contentType) { + case ContentType.Json: + case ContentType.Utf8: + serialized = Buffer.from(flatstr(stringify(message, jsonSerializer))) + break + + default: + throw new Error('invalid content-type') + } + + if (publishOptions.contentEncoding === ContentEncoding.Gzip) { + return gzipAsync(serialized) + } + + return serialized +} + diff --git a/src/utils/wrap-promise.ts b/src/utils/wrap-promise.ts new file mode 100644 index 0000000..bb34185 --- /dev/null +++ b/src/utils/wrap-promise.ts @@ -0,0 +1,29 @@ +import { Tags, Span } from 'opentracing' + +/** + * set span on error + * @param {Span} span opentracing span + * @param {Promise} promise pending promise + * + * @return {Promise} + */ +export const wrapPromise = ( + span: Span, + promise: Promise +) => { + try { + return promise + } catch (error) { + span.setTag(Tags.ERROR, true) + span.log({ + event: 'error', + 'error.object': error, + message: error.message, + stack: error.stack, + }) + + throw error + } finally { + span.finish() + } +} diff --git a/yarn.lock b/yarn.lock index 38f8559..a963106 100644 --- a/yarn.lock +++ b/yarn.lock @@ -288,6 +288,22 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@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" + "@hapi/address@^4.1.0": version "4.1.0" resolved "https://registry.yarnpkg.com/@hapi/address/-/address-4.1.0.tgz#d60c5c0d930e77456fdcde2598e77302e2955e1d" @@ -693,9 +709,9 @@ integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= "@types/lodash@^4.14.161": - version "4.14.162" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.162.tgz#65d78c397e0d883f44afbf1f7ba9867022411470" - integrity sha512-alvcho1kRUnnD1Gcl4J+hK0eencvzq9rmzvFPRmP5rPHx9VVsJj6bKLTATPVf9ktgv4ujzh7T+XWKp+jhuODig== + version "4.14.164" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.164.tgz#52348bcf909ac7b4c1bcbeda5c23135176e5dfa0" + integrity sha512-fXCEmONnrtbYUc5014avwBeMdhHHO8YJCkOBflUL9EoJBSKZ1dei+VO74fA7JkTHZ1GvZack2TyIw5U+1lT8jg== "@types/mime@*": version "2.0.3" @@ -713,9 +729,9 @@ integrity sha512-vyxR57nv8NfcU0GZu8EUXZLTbCMupIUwy95LJ6lllN+JRPG25CwMHoB1q5xKh8YKhQnHYRAn4yW2yuHbf/5xgg== "@types/node@*", "@types/node@^14.11.2": - version "14.11.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.8.tgz#fe2012f2355e4ce08bca44aeb3abbb21cf88d33f" - integrity sha512-KPcKqKm5UKDkaYPTuXSx8wEP7vE9GnuaXIZKijwRYcePpZFDVuy2a57LarFKiORbHOuTOOwYzxVxcUzsh2P2Pw== + 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/node@>= 8": version "14.11.2" @@ -745,9 +761,9 @@ "@types/node" "*" "@types/pino@^6.3.1": - version "6.3.2" - resolved "https://registry.yarnpkg.com/@types/pino/-/pino-6.3.2.tgz#3c18fca7a11e7ce4c5c67768cd1cd1f8d1ff541d" - integrity sha512-dLKNzFY35feTD92DLFtFY1YPEngQxlfjczK2iEzwtGhh/M2AlTNyxshcYsbstBA6yc8wpTKYNrmjw+NcppE2YQ== + version "6.3.3" + resolved "https://registry.yarnpkg.com/@types/pino/-/pino-6.3.3.tgz#a8114e07d792d36b48b79db0151557b6d42c8d95" + integrity sha512-YtT58N7Tt7B7f5B/upuq694p4eT4icM9TuhgYeKhm+dnF0Ahm7q5YJp1i7vC2mBMdWgH1IvOa2XK6rhUjBv0GQ== dependencies: "@types/node" "*" "@types/pino-std-serializers" "*" @@ -853,6 +869,11 @@ "@typescript-eslint/types" "4.2.0" eslint-visitor-keys "^2.0.0" +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + JSONStream@^1.0.4, JSONStream@^1.3.4, JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -1103,16 +1124,6 @@ array.prototype.flat@^1.2.3: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" -array.prototype.map@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.2.tgz#9a4159f416458a23e9483078de1106b2ef68f8ec" - integrity sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.4" - arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -1344,6 +1355,14 @@ caching-transform@^4.0.0: package-hash "^4.0.0" write-file-atomic "^3.0.0" +call-bind@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.0.tgz#24127054bb3f9bdcb4b1fb82418186072f77b8ce" + integrity sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.0" + call-limit@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/call-limit/-/call-limit-1.1.1.tgz#ef15f2670db3f1992557e2d965abc459e6e358d4" @@ -1435,10 +1454,10 @@ check-error@^1.0.2: resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= -chokidar@3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" - integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== +chokidar@3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.3.tgz#c1df38231448e45ca4ac588e6c79573ba6a57d5b" + integrity sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -1446,7 +1465,7 @@ chokidar@3.4.2: is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.4.0" + readdirp "~3.5.0" optionalDependencies: fsevents "~2.1.2" @@ -1918,20 +1937,13 @@ debug@3.1.0: dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: +debug@4, debug@4.2.0, debug@^4.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" -debug@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -1964,6 +1976,11 @@ decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + 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" @@ -2000,7 +2017,7 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" -define-properties@^1.1.2, define-properties@^1.1.3: +define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== @@ -2209,7 +2226,7 @@ error@^7.0.0: dependencies: string-template "~0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.4, es-abstract@^1.17.5: +es-abstract@^1.17.0: version "1.17.6" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== @@ -2226,41 +2243,40 @@ es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.4, es-abstrac string.prototype.trimend "^1.0.1" string.prototype.trimstart "^1.0.1" -es-abstract@^1.18.0-next.0: - version "1.18.0-next.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.0.tgz#b302834927e624d8e5837ed48224291f2c66e6fc" - integrity sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ== +es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: + version "1.17.7" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c" + integrity sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g== dependencies: es-to-primitive "^1.2.1" function-bind "^1.1.1" has "^1.0.3" has-symbols "^1.0.1" - is-callable "^1.2.0" - is-negative-zero "^2.0.0" + is-callable "^1.2.2" is-regex "^1.1.1" object-inspect "^1.8.0" object-keys "^1.1.1" - object.assign "^4.1.0" + object.assign "^4.1.1" string.prototype.trimend "^1.0.1" string.prototype.trimstart "^1.0.1" -es-array-method-boxes-properly@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" - integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== - -es-get-iterator@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.0.tgz#bb98ad9d6d63b31aacdc8f89d5d0ee57bcb5b4c8" - integrity sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ== +es-abstract@^1.18.0-next.1: + version "1.18.0-next.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" + integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== dependencies: - es-abstract "^1.17.4" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" has-symbols "^1.0.1" - is-arguments "^1.0.4" - is-map "^2.0.1" - is-set "^2.0.1" - is-string "^1.0.5" - isarray "^2.0.5" + is-callable "^1.2.2" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" es-to-primitive@^1.2.1: version "1.2.1" @@ -2516,12 +2532,12 @@ eslint@7.9.0: v8-compile-cache "^2.0.3" eslint@^7.2.0: - version "7.11.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.11.0.tgz#aaf2d23a0b5f1d652a08edacea0c19f7fadc0b3b" - integrity sha512-G9+qtYVCHaDi1ZuWzBsOWo2wSwd70TXnU6UHA3cTYHp7gCTXZcpggWFoUVAMRarg68qtPoNfFbzPh+VdOgmwmw== + 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.1.3" + "@eslint/eslintrc" "^0.2.1" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" @@ -2814,12 +2830,10 @@ flat-cache@^2.0.1: rimraf "2.6.3" write "1.0.3" -flat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" - integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== - dependencies: - is-buffer "~2.0.3" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatstr@^1.0.12: version "1.0.12" @@ -2994,6 +3008,15 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= +get-intrinsic@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.1.tgz#94a9768fcbdd0595a1c9273aacf4c89d075631be" + integrity sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + 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" @@ -3170,7 +3193,7 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.0, has-symbols@^1.0.1: +has-symbols@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== @@ -3354,7 +3377,15 @@ ignore@^5.1.4: 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.1.0, import-fresh@^3.2.1: +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-fresh@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== @@ -3454,11 +3485,6 @@ ip@1.1.5: resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= -is-arguments@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" - integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -3471,12 +3497,7 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-buffer@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" - integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== - -is-callable@^1.1.4, is-callable@^1.2.0: +is-callable@^1.1.4, is-callable@^1.2.0, is-callable@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== @@ -3542,11 +3563,6 @@ is-installed-globally@^0.1.0: global-dirs "^0.1.0" is-path-inside "^1.0.0" -is-map@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" - integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== - is-negative-zero@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" @@ -3584,6 +3600,11 @@ is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-plain-object@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" @@ -3606,11 +3627,6 @@ is-retry-allowed@^1.0.0: resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== -is-set@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43" - integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA== - is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -3621,7 +3637,7 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== -is-string@^1.0.4, is-string@^1.0.5: +is-string@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== @@ -3672,11 +3688,6 @@ isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -3762,19 +3773,6 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -iterate-iterator@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.1.tgz#1693a768c1ddd79c969051459453f082fe82e9f6" - integrity sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw== - -iterate-value@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/iterate-value/-/iterate-value-1.0.2.tgz#935115bd37d006a52046535ebc8d07e9c9337f57" - integrity sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ== - dependencies: - es-get-iterator "^1.0.2" - iterate-iterator "^1.0.1" - jaeger-client@^3.18.0: version "3.18.1" resolved "https://registry.yarnpkg.com/jaeger-client/-/jaeger-client-3.18.1.tgz#a8c7a778244ba117f4fb8775eb6aa5508703564e" @@ -4540,14 +4538,15 @@ mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.0: minimist "^1.2.5" mocha@^8.0.1: - version "8.1.3" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.1.3.tgz#5e93f873e35dfdd69617ea75f9c68c2ca61c2ac5" - integrity sha512-ZbaYib4hT4PpF4bdSO2DohooKXIn4lDeiYqB+vTmCdr6l2woW0b6H3pf5x4sM5nwQMru9RvjjHYWVGltR50ZBw== + version "8.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.2.0.tgz#f8aa79110b4b5a6580c65d4dd8083c425282624e" + integrity sha512-lEWEMq2LMfNJMKeuEwb5UELi+OgFDollXaytR5ggQcHpzG3NP/R7rvixAvF+9/lLsTWhWG+4yD2M70GsM06nxw== dependencies: + "@ungap/promise-all-settled" "1.1.2" ansi-colors "4.1.1" browser-stdout "1.3.1" - chokidar "3.4.2" - debug "4.1.1" + chokidar "3.4.3" + debug "4.2.0" diff "4.0.2" escape-string-regexp "4.0.0" find-up "5.0.0" @@ -4558,17 +4557,16 @@ mocha@^8.0.1: log-symbols "4.0.0" minimatch "3.0.4" ms "2.1.2" - object.assign "4.1.0" - promise.allsettled "1.0.2" - serialize-javascript "4.0.0" - strip-json-comments "3.0.1" - supports-color "7.1.0" + nanoid "3.1.12" + serialize-javascript "5.0.1" + strip-json-comments "3.1.1" + supports-color "7.2.0" which "2.0.2" wide-align "1.1.3" - workerpool "6.0.0" + workerpool "6.0.2" yargs "13.3.2" yargs-parser "13.1.2" - yargs-unparser "1.6.1" + yargs-unparser "2.0.0" modify-values@^1.0.0: version "1.0.1" @@ -4623,6 +4621,11 @@ mute-stream@~0.0.4: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +nanoid@3.1.12: + version "3.1.12" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.12.tgz#6f7736c62e8d39421601e4a0c77623a97ea69654" + integrity sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -5068,28 +5071,18 @@ object-inspect@^1.7.0, object-inspect@^1.8.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd" - integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA== +object.assign@^4.1.0, object.assign@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.18.0-next.0" has-symbols "^1.0.1" object-keys "^1.1.1" @@ -5605,17 +5598,6 @@ promise-retry@^1.1.1: err-code "^1.0.0" retry "^0.10.0" -promise.allsettled@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.2.tgz#d66f78fbb600e83e863d893e98b3d4376a9c47c9" - integrity sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg== - dependencies: - array.prototype.map "^1.0.1" - define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" - function-bind "^1.1.1" - iterate-value "^1.0.0" - promzard@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" @@ -5866,10 +5848,10 @@ readdir-scoped-modules@^1.0.0, readdir-scoped-modules@^1.1.0: graceful-fs "^4.1.2" once "^1.3.0" -readdirp@~3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" - integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== dependencies: picomatch "^2.2.1" @@ -6174,10 +6156,10 @@ semver@^6.0.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -serialize-javascript@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" - integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== +serialize-javascript@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== dependencies: randombytes "^2.1.0" @@ -6241,9 +6223,9 @@ signale@^1.2.1: pkg-conf "^2.1.0" sinon@^9.0.2: - version "9.2.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.0.tgz#1d333967e30023609f7347351ebc0dc964c0f3c9" - integrity sha512-eSNXz1XMcGEMHw08NJXSyTHIu6qTCOiN8x9ODACmZpNQpr0aXTBXBnI4xTzQzR+TEpOmLiKowGf9flCuKIzsbw== + version "9.2.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-9.2.1.tgz#64cc88beac718557055bd8caa526b34a2231be6d" + integrity sha512-naPfsamB5KEE1aiioaoqJ6MEhdUs/2vtI5w1hPAXX/UwvoPjXcwh1m5HiKx0HGgKR8lQSoFIgY5jM6KK8VrS9w== dependencies: "@sinonjs/commons" "^1.8.1" "@sinonjs/fake-timers" "^6.0.1" @@ -6510,20 +6492,20 @@ string-width@^4.1.0, string-width@^4.2.0: strip-ansi "^6.0.0" string.prototype.trimend@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" - integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + version "1.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz#6ddd9a8796bc714b489a3ae22246a208f37bfa46" + integrity sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw== dependencies: define-properties "^1.1.3" - es-abstract "^1.17.5" + es-abstract "^1.18.0-next.1" string.prototype.trimstart@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" - integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + version "1.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz#22d45da81015309cd0cdd79787e8919fc5c613e7" + integrity sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg== dependencies: define-properties "^1.1.3" - es-abstract "^1.17.5" + es-abstract "^1.18.0-next.1" string_decoder@^1.1.1: version "1.3.0" @@ -6604,12 +6586,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" - integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -6624,10 +6601,10 @@ stubs@^3.0.0: resolved "https://registry.yarnpkg.com/stubs/-/stubs-3.0.0.tgz#e8d2ba1fa9c90570303c030b6900f7d5f89abe5b" integrity sha1-6NK6H6nJBXAwPAMLaQD31fiavls= -supports-color@7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== +supports-color@7.2.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" @@ -6638,13 +6615,6 @@ supports-color@^5.3.0: 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.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" @@ -6898,9 +6868,9 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@^4.1.0-beta: - version "4.1.0-dev.20201012" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.0-dev.20201012.tgz#8c00f102c53f973eadbc39e81813739cf6e27017" - integrity sha512-afzjHTxmS6JszBOz3CkQqlP+5ZlvZ/ACbRJMXJWhEYfHPCDHdQGZVEMbdnYICM1KfgN2SUpubWJsWvyxkoNmHA== + version "4.1.0-dev.20201102" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.0-dev.20201102.tgz#e1978890ac063bb3f13d067067905b312c1e0897" + integrity sha512-kyL2MUGRx69NgowtHpnabYzNA3N8CR+XW51kL9my6MfSXyrojytW5P4YmaayHGQhWLRmzzdDvHfkf2PQBHgbUw== uglify-js@^3.1.4: version "3.10.4" @@ -7045,9 +7015,9 @@ uuid@^8.0.0: integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== v8-compile-cache@^2.0.3: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" - integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== + 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== validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" @@ -7147,10 +7117,10 @@ worker-farm@^1.6.0, worker-farm@^1.7.0: dependencies: errno "~0.1.7" -workerpool@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.0.0.tgz#85aad67fa1a2c8ef9386a1b43539900f61d03d58" - integrity sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA== +workerpool@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.0.2.tgz#e241b43d8d033f1beb52c7851069456039d1d438" + integrity sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q== wrap-ansi@^2.0.0: version "2.1.0" @@ -7317,16 +7287,15 @@ yargs-parser@^7.0.0: dependencies: camelcase "^4.1.0" -yargs-unparser@1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.1.tgz#bd4b0ee05b4c94d058929c32cb09e3fce71d3c5f" - integrity sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA== +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== dependencies: - camelcase "^5.3.1" - decamelize "^1.2.0" - flat "^4.1.0" - is-plain-obj "^1.1.0" - yargs "^14.2.3" + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" yargs@13.3.2: version "13.3.2" @@ -7446,6 +7415,6 @@ yn@3.1.1: integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== zod@^2.0.0-beta.8: - version "2.0.0-beta.9" - resolved "https://registry.yarnpkg.com/zod/-/zod-2.0.0-beta.9.tgz#385e89f60a12a5b6bb6ca91424dd5038566ed9d0" - integrity sha512-gGq+6RuCF6VdM7KcCFtay4vTzqy8nhzJypiYZj+1mj4TZI4EwPDrrs4A4mV5PTvlXp5e9vxecn83wzqCv7MfPg== + version "2.0.0-beta.16" + resolved "https://registry.yarnpkg.com/zod/-/zod-2.0.0-beta.16.tgz#1ca4bef96d951553b741fe29c708ded91d51169f" + integrity sha512-T5nksJPUQLc5jb3J0LEQ1lPjQxsLIhgaQcyWKnVn5NrwDLO8AnxnkyuqAegB9xhqvzx9F3WSBV3IP5RAncpavg==