From a59bfc08d861ec6201de871817d5943c8d0e2ea4 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Thu, 29 Aug 2019 10:09:14 -0700 Subject: [PATCH 01/29] POC aggregator --- Procfile | 1 + .../unit/aggregator/aggregatorHandler.js | 13 ++ __tests__/unit/aggregator/kafkaConsumer.js | 45 +++++++ __tests__/unit/aggregator/utils.js | 0 package.json | 1 + src/aggregator/aggregatorHandler.js | 55 ++++++++ src/aggregator/index.js | 24 ++++ src/aggregator/kafkaConsumer.js | 57 ++++++++ src/aggregator/utils.js | 126 ++++++++++++++++++ src/config.js | 14 ++ 10 files changed, 336 insertions(+) create mode 100644 __tests__/unit/aggregator/aggregatorHandler.js create mode 100644 __tests__/unit/aggregator/kafkaConsumer.js create mode 100644 __tests__/unit/aggregator/utils.js create mode 100644 src/aggregator/aggregatorHandler.js create mode 100644 src/aggregator/index.js create mode 100644 src/aggregator/kafkaConsumer.js create mode 100644 src/aggregator/utils.js diff --git a/Procfile b/Procfile index 39c4877..16aef72 100644 --- a/Procfile +++ b/Procfile @@ -1 +1,2 @@ logger: npm start +aggregator: npm run start-aggregator diff --git a/__tests__/unit/aggregator/aggregatorHandler.js b/__tests__/unit/aggregator/aggregatorHandler.js new file mode 100644 index 0000000..ebdd071 --- /dev/null +++ b/__tests__/unit/aggregator/aggregatorHandler.js @@ -0,0 +1,13 @@ +/** + * Copyright (c) 2019, salesforce.com, inc. + * All rights reserved. + * Licensed under the BSD 3-Clause license. + * For full license text, see LICENSE.txt file in the repo root or + * https://opensource.org/licenses/BSD-3-Clause + */ + +const { loggerHandler } = require('../../src/handlerUtil'); + +describe('test/unit/aggregator/aggregatorHandler.js', () => { + +}); diff --git a/__tests__/unit/aggregator/kafkaConsumer.js b/__tests__/unit/aggregator/kafkaConsumer.js new file mode 100644 index 0000000..63f187b --- /dev/null +++ b/__tests__/unit/aggregator/kafkaConsumer.js @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2019, salesforce.com, inc. + * All rights reserved. + * Licensed under the BSD 3-Clause license. + * For full license text, see LICENSE.txt file in the repo root or + * https://opensource.org/licenses/BSD-3-Clause + */ + +const kafkaConsumer = require('../../../src/kafkaConsumer'); +const kafka = require('no-kafka'); +jest.mock('no-kafka'); + +describe('test/unit/consumer.js', () => { + it('Creates the consumer with the right arguments', async () => { + const GroupConsumerMock = jest.spyOn(kafka, 'GroupConsumer'); + const topicHandlers = await kafkaConsumer.initConsumer(); + expect(GroupConsumerMock).toHaveBeenCalledWith( + { + clientId: `consumer-${process.pid}`, + connectionString: 'test-url', + groupId: 'test-prefixlogger-group', + idleTimeout: 1000, + maxBytes: 1048576, + maxWaitTime: 100, + ssl: { + cert: 'test-cert', + key: 'test-key', + }, + }); + }); + + it('Init throws an error', async () => { + const GroupConsumerMock = jest.spyOn(kafka, 'GroupConsumer'); + GroupConsumerMock.mockImplementationOnce(() => ({ + init: () => { + throw new Error(''); + }, + }) + ); + const callback = jest.fn(); + await kafkaConsumer.initConsumer(callback); + expect(callback).toHaveBeenCalled(); + }); + +}); diff --git a/__tests__/unit/aggregator/utils.js b/__tests__/unit/aggregator/utils.js new file mode 100644 index 0000000..e69de29 diff --git a/package.json b/package.json index 09ec55b..5938260 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "integration": "NODE_ENV=integration jest __tests__/integration/", "lint": "./node_modules/jscs/bin/jscs src __tests__", "start": "node src/.", + "start-aggregator": "node src/aggregator/.", "test": "NODE_ENV=development npm run lint && jest __tests__/unit --coverage --coverageDirectory=output/coverage/jest" }, "repository": { diff --git a/src/aggregator/aggregatorHandler.js b/src/aggregator/aggregatorHandler.js new file mode 100644 index 0000000..e13a9c7 --- /dev/null +++ b/src/aggregator/aggregatorHandler.js @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2019, salesforce.com, inc. + * All rights reserved. + * Licensed under the BSD 3-Clause license. + * For full license text, see LICENSE.txt file in the repo root or + * https://opensource.org/licenses/BSD-3-Clause + */ +/** + * src/handlerUtil.js + * Kafka handler utilities + */ + +const logger = require('pino')(); +const { + requestStartedHandler, + publishedHandler, + emittedHandler, + acknowledgedHandler, +} = require('./utils'); + +const messageTypes = { + requestStarted: requestStartedHandler, + published: publishedHandler, + emitted: emittedHandler, + acknowledged: acknowledgedHandler, +}; + +/** + * Handler triggered when a message is received on a topic + * Logs out the message received on that topic. + * @param {Array} messageSet - The set of messages that are received on this topic at each time + * the handler is triggered + * @param {String} topic - The topic in the Kafka Cluster + * @param {int} partition - The partition of the KafkaCluster the message is received from + */ +const aggregationHandler = (messageSet, topic, partition) => { + messageSet.forEach((m) => { + try { + // Not parsing the key on purpose, we want to keep it as a string + // in order have it hash as a string and not as object + // in our local map + const key = m.message.key.toString(); + const value = JSON.parse(m.message.value.toString()); + const message = value.message; + const type = message.type; + messageTypes[type](message, key); + } catch (err) { + logger.error(`Could not parse message error: ${err}`); + } + }); +}; + +module.exports = { + aggregationHandler, +}; diff --git a/src/aggregator/index.js b/src/aggregator/index.js new file mode 100644 index 0000000..b9d9249 --- /dev/null +++ b/src/aggregator/index.js @@ -0,0 +1,24 @@ +/** + * Copyright (c) 2019, salesforce.com, inc. + * All rights reserved. + * Licensed under the BSD 3-Clause license. + * For full license text, see LICENSE.txt file in the repo root or + * https://opensource.org/licenses/BSD-3-Clause + */ +/** + * src/index.js + * intialize the consumer + */ + +const debug = require('debug')('refocus-logging'); +const consumer = require('./kafkaConsumer'); +const logger = require('pino')(); + +debug(`Starting client consumer-${process.pid}`); + +const errorHandler = (message) => { + logger.error(message); +}; + +consumer.initConsumer(errorHandler); + diff --git a/src/aggregator/kafkaConsumer.js b/src/aggregator/kafkaConsumer.js new file mode 100644 index 0000000..2323f77 --- /dev/null +++ b/src/aggregator/kafkaConsumer.js @@ -0,0 +1,57 @@ +/** + * Copyright (c) 2019, salesforce.com, inc. + * All rights reserved. + * Licensed under the BSD 3-Clause license. + * For full license text, see LICENSE.txt file in the repo root or + * https://opensource.org/licenses/BSD-3-Clause + */ +/** + * src/kafkaConsumer.js + * Define consumer logic for the Kafka + * This starts up a consumer and subscribes to all topics + */ +const Kafka = require('no-kafka'); +const debug = require('debug')('refocus-aggregation'); +const config = require('./config').getConfig(); +const aggregationHandler = require('./handlerUtil').aggregationHandler; +const clientId = 'consumer-' + process.pid; + +/** + * Only one instance in a consumer group handles a message belonging to its partition + * Elected group leader will automatically assign partitions between all group members. + * Each group is composed of many consumer instances for scalability and fault tolerance. + * This is nothing more than publish-subscribe semantics where the + * subscriber is a cluster of consumers instead of a single process. +*/ +const initConsumer = async (errorCallback) => { + try { + const consumer = new Kafka.GroupConsumer({ + clientId, + groupId: config.prefix + 'aggregator-group', + connectionString: config.connectionString, + ssl: { + cert: config.sslCert, + key: config.sslKey, + }, + maxWaitTime: config.maxWaitTime, + maxBytes: config.maxBytes, + idleTimeout: config.idleTimeout, + }); + + const strategies = [{ + subscriptions: config.topics, + handler: aggregationHandler, + }, + ]; + + await consumer.init(strategies); + + debug(`Kafka consumer ${clientId} has been started`); + } catch (err) { + errorCallback(`Unable to start consumer error: ${err}`); + } +}; + +module.exports = { + initConsumer, +}; diff --git a/src/aggregator/utils.js b/src/aggregator/utils.js new file mode 100644 index 0000000..24db6ae --- /dev/null +++ b/src/aggregator/utils.js @@ -0,0 +1,126 @@ +const { aggregatorTimeout, expectedEmits } = require('../config').getConfig(); + +/** + * Key = JSON.stringify({ + * updatedAt, + * name, + * }); + */ +const aggregateMap = new Map(); + +const getAvg = (input) => { + const total = input.reduce((acc, c) => acc + c, 0); + return total / input.length; +}; + +const getMedian = input => { + input.sort((a, b) => a - b); + const lowMiddle = Math.floor((input.length - 1) / 2); + const highMiddle = Math.ceil((input.length - 1) / 2); + return ((input[lowMiddle] + input[highMiddle]) / 2); +}; + +/** + * message = { + * type, + * reqStartTime, + * jobStartTime + * } +*/ +const requestStartedHandler = (message, key) => { + aggregateMap.set(key, message); + setTimeout(() => { + const { + reqStartTime, + jobStartTime, + publishCompletedAt, + numClientsEmittedTo, + emittedAt, + acknowledgedAt, + } = aggregateMap.get(key); + + const queueTime = jobStartTime - reqStartTime; + + const isPublished = publishCompletedAt ? true : false; + + const publishLatency = publishCompletedAt - jobStartTime; + + const avgSubscribeLatency = Array.isArray(emittedAt) ? + getAvg(emittedAt.map(emitTime => emitTime - publishCompletedAt)) : 'N/A'; + + const numEmitted = Array.isArray(emittedAt) ? emittedAt.length : 0; + + const isSuccessfullyEmitted = numEmitted === expectedEmits ? true : false; + + const numClientsAcknowledged = Array.isArray(acknowledgedAt) ? + acknowledgedAt.length : 0; + + const endToEndLatency = acknowledgedAt.map(acknowledgeTime => + acknowledgeTime - jobStartTime); + + const avgEndToEndLatency = getAvg(endToEndLatency); + const mediaEndToEndLatency = getMedian(endToEndLatency); + + const aggregatedVal = { + queueTime, + publishLatency, + avgSubscribeLatency, + numEmitted, + endToEndLatency, + mediaEndToEndLatency, + isPublished, + isSuccessfullyEmitted, + numClientsAcknowledged, + }; + + logger.info('Key:', key, 'Value:', aggregatedVal); + + }, aggregatorTimeout); +}; + +/** + * message = { + * type, + * publishCompletedAt + * } +*/ +const publishedHandler = (message, key) => { + const { publishCompletedAt } = message; + aggregateMap.get(key).publishCompletedAt = publishCompletedAt; +}; + +/** + * message = { + * type, + * emittedAt, + * numClientsEmittedTo + * } +*/ +const emittedHandler = (message, key) => { + const { emittedAt, numClientsEmittedTo } = message; + const aggregateMapVal = aggregateMap.get(key); + aggregateMapVal.emittedAt = aggregateMapVal.emittedAt ? + aggregateMapVal.emittedAt.push(emittedAt) : [emittedAt]; + aggregateMapVal.numClientsEmittedTo = aggregateMapVal.numClientsEmittedTo + numClientsEmittedTo; +}; + +/** + * message = { + * type, + * acknowledgedAt + * } +*/ +const acknowledgedHandler = (message, key) => { + const { acknowledgedAt } = message; + const aggregateMapVal = aggregateMap.get(key); + aggregateMapVal.acknowledgedAt = aggregateMapVal.acknowledgedAt ? + aggregateMapVal.acknowledgedAt.push(acknowledgedAt) : [acknowledgedAt]; +}; + +module.exports = { + requestStartedHandler, + publishedHandler, + emittedHandler, + acknowledgedHandler, + aggregateMap, +}; diff --git a/src/config.js b/src/config.js index 0e7e032..d270f71 100644 --- a/src/config.js +++ b/src/config.js @@ -37,6 +37,15 @@ const getIdleTimeout = (input) => { return idleTimeout; }; +const getAggregatorTimeout = (input) => { + const aggregatorTimeout = +input; + if (isNaN(aggregatorTimeout) || aggregatorTimeout <= 0) { + return 30000; + } + + return aggregatorTimeout; +}; + const toTopicArray = (topics, prefix = '') => { if (!topics) return []; return topics.split(',') @@ -46,6 +55,7 @@ const toTopicArray = (topics, prefix = '') => { const herokuConfig = { prefix: process.env.KAFKA_PREFIX || '', + aggregationTopic: toTopicArray(process.env.AGGREGATION_TOPIC, process.env.KAFKA_PREFIX), topics: toTopicArray(process.env.TOPICS, process.env.KAFKA_PREFIX), sslCert: process.env.KAFKA_CLIENT_CERT || '.ssl/client.crt', sslKey: process.env.KAFKA_CLIENT_CERT_KEY || '.ssl/client.key', @@ -53,10 +63,13 @@ const herokuConfig = { maxWaitTime: getMaxWaitTime(process.env.KAFKA_CONSUMER_MAX_WAIT_TIME_MS), maxBytes: getMaxBytes(process.env.KAFKA_CONSUMER_MAX_BYTES), idleTimeout: getIdleTimeout(process.env.KAFKA_CONSUMER_IDLE_TIMEOUT), + aggregatorTimeout: getAggregatorTimeout(process.env.FLUSH_TO_PERSISTENCE_AFTER), + expectedEmits: process.env.NUM_REALTIME_PROCESSES, }; const devConfig = { prefix: 'test-prefix', + aggregationTopic: ['agg-foo'], topics: ['foo', 'bar'], sslCert: 'test-cert', sslKey: 'test-key', @@ -64,6 +77,7 @@ const devConfig = { maxWaitTime: 100, maxBytes: (1024 * 1024), idleTimeout: 1000, + aggregatorTimeout: 30000, }; const config = { From 84d1b3624464fdc02b35759cf91a77206e5c994f Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Thu, 29 Aug 2019 15:10:12 -0700 Subject: [PATCH 02/29] POC --- .../unit/aggregator/aggregatorHandler.js | 23 +- __tests__/unit/aggregator/utils.js | 16 + package-lock.json | 1983 +++++++++-------- package.json | 1 + src/aggregator/utils.js | 132 +- 5 files changed, 1103 insertions(+), 1052 deletions(-) diff --git a/__tests__/unit/aggregator/aggregatorHandler.js b/__tests__/unit/aggregator/aggregatorHandler.js index ebdd071..06dd489 100644 --- a/__tests__/unit/aggregator/aggregatorHandler.js +++ b/__tests__/unit/aggregator/aggregatorHandler.js @@ -6,8 +6,27 @@ * https://opensource.org/licenses/BSD-3-Clause */ -const { loggerHandler } = require('../../src/handlerUtil'); +const { aggregationHandler } = require('../../../src/aggregator/aggregatorHandler'); +const utils = require('../../../src/aggregator/utils'); +jest.mock('../../../src/aggregator/utils'); describe('test/unit/aggregator/aggregatorHandler.js', () => { - + it('Calls the right handler', () => { + const key = Buffer.from(JSON.stringify({ + updatedAt: new Date().toISOString(), + name: 'testSample', + })); + + const value = Buffer.from(JSON.stringify({ message: + { type: 'requestStarted' }, level: 'level', messageTime: new Date(), })); + const messageSet = [{ message: { value, key } }]; + const requestStartedHandlerMock = jest.spyOn(utils, 'requestStartedHandler'); + aggregationHandler(messageSet, 'foo', 0); + expect(requestStartedHandlerMock).nthCalledWith(1, + { type: 'requestStarted' }, key.toString() + ); + }); + + it('Logs for existing key', () => { + }); }); diff --git a/__tests__/unit/aggregator/utils.js b/__tests__/unit/aggregator/utils.js index e69de29..ae110d0 100644 --- a/__tests__/unit/aggregator/utils.js +++ b/__tests__/unit/aggregator/utils.js @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2019, salesforce.com, inc. + * All rights reserved. + * Licensed under the BSD 3-Clause license. + * For full license text, see LICENSE.txt file in the repo root or + * https://opensource.org/licenses/BSD-3-Clause + */ + +const { aggregationHandler } = require('../../../src/aggregator/aggregatorHandler'); +const utils = require('../../../src/aggregator/utils'); +jest.mock('../../../src/aggregator/utils'); + +describe('test/unit/aggregator/aggregatorHandler.js', () => { + it('Calls the right handler', () => { + }); +}); diff --git a/package-lock.json b/package-lock.json index 6d4f58d..cbbc161 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", "dev": true, "requires": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "7.0.0" } }, "@babel/core": { @@ -19,20 +19,20 @@ "integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helpers": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.5", - "@babel/types": "^7.4.4", - "convert-source-map": "^1.1.0", - "debug": "^4.1.0", - "json5": "^2.1.0", - "lodash": "^4.17.11", - "resolve": "^1.3.2", - "semver": "^5.4.1", - "source-map": "^0.5.0" + "@babel/code-frame": "7.0.0", + "@babel/generator": "7.4.4", + "@babel/helpers": "7.4.4", + "@babel/parser": "7.4.5", + "@babel/template": "7.4.4", + "@babel/traverse": "7.4.5", + "@babel/types": "7.4.4", + "convert-source-map": "1.6.0", + "debug": "4.1.1", + "json5": "2.1.0", + "lodash": "4.17.11", + "resolve": "1.11.1", + "semver": "5.7.0", + "source-map": "0.5.7" }, "dependencies": { "debug": { @@ -41,7 +41,7 @@ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -64,11 +64,11 @@ "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", "dev": true, "requires": { - "@babel/types": "^7.4.4", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "@babel/types": "7.4.4", + "jsesc": "2.5.2", + "lodash": "4.17.11", + "source-map": "0.5.7", + "trim-right": "1.0.1" }, "dependencies": { "source-map": { @@ -85,9 +85,9 @@ "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-get-function-arity": "7.0.0", + "@babel/template": "7.4.4", + "@babel/types": "7.4.4" } }, "@babel/helper-get-function-arity": { @@ -96,7 +96,7 @@ "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "7.4.4" } }, "@babel/helper-plugin-utils": { @@ -111,7 +111,7 @@ "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "7.4.4" } }, "@babel/helpers": { @@ -120,9 +120,9 @@ "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", "dev": true, "requires": { - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/template": "7.4.4", + "@babel/traverse": "7.4.5", + "@babel/types": "7.4.4" } }, "@babel/highlight": { @@ -131,9 +131,9 @@ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", "dev": true, "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" + "chalk": "2.4.2", + "esutils": "2.0.2", + "js-tokens": "4.0.0" } }, "@babel/parser": { @@ -148,7 +148,7 @@ "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "7.0.0" } }, "@babel/template": { @@ -157,9 +157,9 @@ "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/code-frame": "7.0.0", + "@babel/parser": "7.4.5", + "@babel/types": "7.4.4" } }, "@babel/traverse": { @@ -168,15 +168,15 @@ "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" + "@babel/code-frame": "7.0.0", + "@babel/generator": "7.4.4", + "@babel/helper-function-name": "7.1.0", + "@babel/helper-split-export-declaration": "7.4.4", + "@babel/parser": "7.4.5", + "@babel/types": "7.4.4", + "debug": "4.1.1", + "globals": "11.12.0", + "lodash": "4.17.11" }, "dependencies": { "debug": { @@ -185,7 +185,7 @@ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -202,9 +202,9 @@ "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", "dev": true, "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" + "esutils": "2.0.2", + "lodash": "4.17.11", + "to-fast-properties": "2.0.0" } }, "@cnakazawa/watch": { @@ -213,8 +213,8 @@ "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", "dev": true, "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" + "exec-sh": "0.3.2", + "minimist": "1.2.0" } }, "@jest/console": { @@ -223,9 +223,9 @@ "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==", "dev": true, "requires": { - "@jest/source-map": "^24.3.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" + "@jest/source-map": "24.3.0", + "chalk": "2.4.2", + "slash": "2.0.0" } }, "@jest/core": { @@ -234,33 +234,33 @@ "integrity": "sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.8.0", - "jest-config": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-regex-util": "^24.3.0", - "jest-resolve-dependencies": "^24.8.0", - "jest-runner": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", - "jest-watcher": "^24.8.0", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "strip-ansi": "^5.0.0" + "@jest/console": "24.7.1", + "@jest/reporters": "24.8.0", + "@jest/test-result": "24.8.0", + "@jest/transform": "24.8.0", + "@jest/types": "24.8.0", + "ansi-escapes": "3.2.0", + "chalk": "2.4.2", + "exit": "0.1.2", + "graceful-fs": "4.2.0", + "jest-changed-files": "24.8.0", + "jest-config": "24.8.0", + "jest-haste-map": "24.8.1", + "jest-message-util": "24.8.0", + "jest-regex-util": "24.3.0", + "jest-resolve-dependencies": "24.8.0", + "jest-runner": "24.8.0", + "jest-runtime": "24.8.0", + "jest-snapshot": "24.8.0", + "jest-util": "24.8.0", + "jest-validate": "24.8.0", + "jest-watcher": "24.8.0", + "micromatch": "3.1.10", + "p-each-series": "1.0.0", + "pirates": "4.0.1", + "realpath-native": "1.1.0", + "rimraf": "2.6.3", + "strip-ansi": "5.2.0" } }, "@jest/environment": { @@ -269,10 +269,10 @@ "integrity": "sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw==", "dev": true, "requires": { - "@jest/fake-timers": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0" + "@jest/fake-timers": "24.8.0", + "@jest/transform": "24.8.0", + "@jest/types": "24.8.0", + "jest-mock": "24.8.0" } }, "@jest/fake-timers": { @@ -281,9 +281,9 @@ "integrity": "sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw==", "dev": true, "requires": { - "@jest/types": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-mock": "^24.8.0" + "@jest/types": "24.8.0", + "jest-message-util": "24.8.0", + "jest-mock": "24.8.0" } }, "@jest/reporters": { @@ -292,27 +292,27 @@ "integrity": "sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw==", "dev": true, "requires": { - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.1.1", - "jest-haste-map": "^24.8.0", - "jest-resolve": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-util": "^24.8.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.2.1", - "slash": "^2.0.0", - "source-map": "^0.6.0", - "string-length": "^2.0.0" + "@jest/environment": "24.8.0", + "@jest/test-result": "24.8.0", + "@jest/transform": "24.8.0", + "@jest/types": "24.8.0", + "chalk": "2.4.2", + "exit": "0.1.2", + "glob": "7.1.4", + "istanbul-lib-coverage": "2.0.5", + "istanbul-lib-instrument": "3.3.0", + "istanbul-lib-report": "2.0.8", + "istanbul-lib-source-maps": "3.0.6", + "istanbul-reports": "2.2.6", + "jest-haste-map": "24.8.1", + "jest-resolve": "24.8.0", + "jest-runtime": "24.8.0", + "jest-util": "24.8.0", + "jest-worker": "24.6.0", + "node-notifier": "5.4.0", + "slash": "2.0.0", + "source-map": "0.6.1", + "string-length": "2.0.0" } }, "@jest/source-map": { @@ -321,9 +321,9 @@ "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", "dev": true, "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" + "callsites": "3.1.0", + "graceful-fs": "4.2.0", + "source-map": "0.6.1" } }, "@jest/test-result": { @@ -332,9 +332,9 @@ "integrity": "sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/types": "^24.8.0", - "@types/istanbul-lib-coverage": "^2.0.0" + "@jest/console": "24.7.1", + "@jest/types": "24.8.0", + "@types/istanbul-lib-coverage": "2.0.1" } }, "@jest/test-sequencer": { @@ -343,10 +343,10 @@ "integrity": "sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg==", "dev": true, "requires": { - "@jest/test-result": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-runner": "^24.8.0", - "jest-runtime": "^24.8.0" + "@jest/test-result": "24.8.0", + "jest-haste-map": "24.8.1", + "jest-runner": "24.8.0", + "jest-runtime": "24.8.0" } }, "@jest/transform": { @@ -355,20 +355,20 @@ "integrity": "sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.8.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.8.0", - "jest-regex-util": "^24.3.0", - "jest-util": "^24.8.0", - "micromatch": "^3.1.10", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", + "@babel/core": "7.4.5", + "@jest/types": "24.8.0", + "babel-plugin-istanbul": "5.1.4", + "chalk": "2.4.2", + "convert-source-map": "1.6.0", + "fast-json-stable-stringify": "2.0.0", + "graceful-fs": "4.2.0", + "jest-haste-map": "24.8.1", + "jest-regex-util": "24.3.0", + "jest-util": "24.8.0", + "micromatch": "3.1.10", + "realpath-native": "1.1.0", + "slash": "2.0.0", + "source-map": "0.6.1", "write-file-atomic": "2.4.1" } }, @@ -378,9 +378,9 @@ "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^12.0.9" + "@types/istanbul-lib-coverage": "2.0.1", + "@types/istanbul-reports": "1.1.1", + "@types/yargs": "12.0.12" } }, "@types/babel__core": { @@ -389,11 +389,11 @@ "integrity": "sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg==", "dev": true, "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@babel/parser": "7.4.5", + "@babel/types": "7.4.4", + "@types/babel__generator": "7.0.2", + "@types/babel__template": "7.0.2", + "@types/babel__traverse": "7.0.7" } }, "@types/babel__generator": { @@ -402,7 +402,7 @@ "integrity": "sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "7.4.4" } }, "@types/babel__template": { @@ -411,8 +411,8 @@ "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", "dev": true, "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/parser": "7.4.5", + "@babel/types": "7.4.4" } }, "@types/babel__traverse": { @@ -421,7 +421,7 @@ "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", "dev": true, "requires": { - "@babel/types": "^7.3.0" + "@babel/types": "7.4.4" } }, "@types/bluebird": { @@ -441,7 +441,7 @@ "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "*" + "@types/istanbul-lib-coverage": "2.0.1" } }, "@types/istanbul-reports": { @@ -450,8 +450,8 @@ "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", "dev": true, "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" + "@types/istanbul-lib-coverage": "2.0.1", + "@types/istanbul-lib-report": "1.1.1" } }, "@types/lodash": { @@ -495,8 +495,8 @@ "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", "dev": true, "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" + "acorn": "6.1.1", + "acorn-walk": "6.1.1" }, "dependencies": { "acorn": { @@ -519,10 +519,10 @@ "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" } }, "ansi-escapes": { @@ -543,7 +543,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "anymatch": { @@ -552,8 +552,8 @@ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "micromatch": "3.1.10", + "normalize-path": "2.1.1" } }, "argparse": { @@ -562,7 +562,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "sprintf-js": "1.0.3" } }, "arr-diff": { @@ -601,7 +601,7 @@ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "requires": { - "safer-buffer": "~2.1.0" + "safer-buffer": "2.1.2" } }, "assert-plus": { @@ -664,13 +664,13 @@ "integrity": "sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw==", "dev": true, "requires": { - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.6.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" + "@jest/transform": "24.8.0", + "@jest/types": "24.8.0", + "@types/babel__core": "7.1.2", + "babel-plugin-istanbul": "5.1.4", + "babel-preset-jest": "24.6.0", + "chalk": "2.4.2", + "slash": "2.0.0" } }, "babel-plugin-istanbul": { @@ -679,9 +679,9 @@ "integrity": "sha512-dySz4VJMH+dpndj0wjJ8JPs/7i1TdSPb1nRrn56/92pKOF9VKC1FMFJmMXjzlGGusnCAqujP6PBCiKq0sVA+YQ==", "dev": true, "requires": { - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" + "find-up": "3.0.0", + "istanbul-lib-instrument": "3.3.0", + "test-exclude": "5.2.3" } }, "babel-plugin-jest-hoist": { @@ -690,7 +690,7 @@ "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", "dev": true, "requires": { - "@types/babel__traverse": "^7.0.6" + "@types/babel__traverse": "7.0.7" } }, "babel-preset-jest": { @@ -699,8 +699,8 @@ "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", "dev": true, "requires": { - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.6.0" + "@babel/plugin-syntax-object-rest-spread": "7.2.0", + "babel-plugin-jest-hoist": "24.6.0" } }, "babel-runtime": { @@ -709,8 +709,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" + "core-js": "2.6.9", + "regenerator-runtime": "0.11.1" } }, "babylon": { @@ -731,13 +731,13 @@ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "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" + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.3.0", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.2", + "pascalcase": "0.1.1" }, "dependencies": { "define-property": { @@ -746,7 +746,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -755,7 +755,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -764,7 +764,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -773,9 +773,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } @@ -786,7 +786,7 @@ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "requires": { - "tweetnacl": "^0.14.3" + "tweetnacl": "0.14.5" } }, "bin-protocol": { @@ -794,9 +794,9 @@ "resolved": "https://registry.npmjs.org/bin-protocol/-/bin-protocol-3.1.1.tgz", "integrity": "sha512-9vCGfaHC2GBHZwGQdG+DpyXfmLvx9uKtf570wMLwIc9wmTIDgsdCBXQxTZu5X2GyogkfBks2Ode4N0sUVxJ2qQ==", "requires": { - "lodash": "^4.17.11", - "long": "^4.0.0", - "protocol-buffers-schema": "^3.0.0" + "lodash": "4.17.11", + "long": "4.0.0", + "protocol-buffers-schema": "3.3.2" } }, "bluebird": { @@ -810,7 +810,7 @@ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -820,16 +820,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "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" + "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.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" }, "dependencies": { "extend-shallow": { @@ -838,7 +838,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -872,7 +872,7 @@ "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", "dev": true, "requires": { - "node-int64": "^0.4.0" + "node-int64": "0.4.0" } }, "buffer-crc32": { @@ -892,15 +892,15 @@ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "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" + "collection-visit": "1.0.0", + "component-emitter": "1.3.0", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.1", + "to-object-path": "0.3.0", + "union-value": "1.0.1", + "unset-value": "1.0.0" } }, "callsites": { @@ -921,7 +921,7 @@ "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", "dev": true, "requires": { - "rsvp": "^4.8.4" + "rsvp": "4.8.5" } }, "caseless": { @@ -936,9 +936,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" } }, "ci-info": { @@ -953,10 +953,10 @@ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" }, "dependencies": { "define-property": { @@ -965,7 +965,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -985,9 +985,9 @@ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" }, "dependencies": { "ansi-regex": { @@ -1002,7 +1002,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -1025,8 +1025,8 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "map-visit": "1.0.0", + "object-visit": "1.0.1" } }, "color-convert": { @@ -1056,7 +1056,7 @@ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { - "delayed-stream": "~1.0.0" + "delayed-stream": "1.0.0" } }, "commander": { @@ -1072,7 +1072,7 @@ "integrity": "sha1-PAPwd2uGo239mgosl8YwfzMggv4=", "dev": true, "requires": { - "readable-stream": "^2.0.4" + "readable-stream": "2.3.6" } }, "component-emitter": { @@ -1098,7 +1098,7 @@ "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "dev": true, "requires": { - "safe-buffer": "~5.1.1" + "safe-buffer": "5.1.2" } }, "copy-descriptor": { @@ -1125,11 +1125,11 @@ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "nice-try": "1.0.5", + "path-key": "2.0.1", + "semver": "5.7.0", + "shebang-command": "1.2.0", + "which": "1.3.1" } }, "cssom": { @@ -1144,7 +1144,7 @@ "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", "dev": true, "requires": { - "cssom": "0.3.x" + "cssom": "0.3.6" } }, "cst": { @@ -1153,9 +1153,9 @@ "integrity": "sha512-U5ETe1IOjq2h56ZcBE3oe9rT7XryCH6IKgPMv0L7sSk6w29yR3p5egCK0T3BDNHHV95OoUBgXsqiVG+3a900Ag==", "dev": true, "requires": { - "babel-runtime": "^6.9.2", - "babylon": "^6.8.1", - "source-map-support": "^0.4.0" + "babel-runtime": "6.26.0", + "babylon": "6.18.0", + "source-map-support": "0.4.18" }, "dependencies": { "source-map": { @@ -1170,7 +1170,7 @@ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "source-map": "^0.5.6" + "source-map": "0.5.7" } } } @@ -1187,7 +1187,7 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "data-urls": { @@ -1196,9 +1196,9 @@ "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", "dev": true, "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "abab": "2.0.0", + "whatwg-mimetype": "2.3.0", + "whatwg-url": "7.0.0" }, "dependencies": { "whatwg-url": { @@ -1207,9 +1207,9 @@ "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", "dev": true, "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "lodash.sortby": "4.7.0", + "tr46": "1.0.1", + "webidl-conversions": "4.0.2" } } } @@ -1219,7 +1219,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" }, "dependencies": { "ms": { @@ -1259,7 +1259,7 @@ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "object-keys": "^1.0.12" + "object-keys": "1.1.1" } }, "define-property": { @@ -1268,8 +1268,8 @@ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "is-descriptor": "1.0.2", + "isobject": "3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -1278,7 +1278,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -1287,7 +1287,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -1296,9 +1296,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } @@ -1327,8 +1327,8 @@ "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", "dev": true, "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" + "domelementtype": "1.3.1", + "entities": "1.1.2" }, "dependencies": { "entities": { @@ -1351,7 +1351,7 @@ "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", "dev": true, "requires": { - "webidl-conversions": "^4.0.2" + "webidl-conversions": "4.0.2" } }, "domhandler": { @@ -1360,7 +1360,7 @@ "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", "dev": true, "requires": { - "domelementtype": "1" + "domelementtype": "1.3.1" } }, "domutils": { @@ -1369,8 +1369,8 @@ "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "dev": true, "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "0.1.1", + "domelementtype": "1.3.1" } }, "ecc-jsbn": { @@ -1379,8 +1379,8 @@ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "jsbn": "0.1.1", + "safer-buffer": "2.1.2" } }, "end-of-stream": { @@ -1389,7 +1389,7 @@ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { - "once": "^1.4.0" + "once": "1.4.0" } }, "entities": { @@ -1404,7 +1404,7 @@ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "is-arrayish": "0.2.1" } }, "es-abstract": { @@ -1413,12 +1413,12 @@ "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", "dev": true, "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" + "es-to-primitive": "1.2.0", + "function-bind": "1.1.1", + "has": "1.0.3", + "is-callable": "1.1.4", + "is-regex": "1.0.4", + "object-keys": "1.1.1" } }, "es-to-primitive": { @@ -1427,9 +1427,9 @@ "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "1.1.4", + "is-date-object": "1.0.1", + "is-symbol": "1.0.2" } }, "escape-string-regexp": { @@ -1444,11 +1444,11 @@ "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", "dev": true, "requires": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" + "esprima": "3.1.3", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.6.1" } }, "esprima": { @@ -1481,13 +1481,13 @@ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "6.0.5", + "get-stream": "4.1.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" } }, "exit": { @@ -1502,13 +1502,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "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" + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "debug": { @@ -1526,7 +1526,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -1535,7 +1535,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -1546,12 +1546,12 @@ "integrity": "sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA==", "dev": true, "requires": { - "@jest/types": "^24.8.0", - "ansi-styles": "^3.2.0", - "jest-get-type": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-regex-util": "^24.3.0" + "@jest/types": "24.8.0", + "ansi-styles": "3.2.1", + "jest-get-type": "24.8.0", + "jest-matcher-utils": "24.8.0", + "jest-message-util": "24.8.0", + "jest-regex-util": "24.3.0" } }, "extend": { @@ -1566,8 +1566,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -1576,7 +1576,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -1587,14 +1587,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "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" + "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.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -1603,7 +1603,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "extend-shallow": { @@ -1612,7 +1612,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -1621,7 +1621,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -1630,7 +1630,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -1639,9 +1639,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } @@ -1692,7 +1692,7 @@ "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", "dev": true, "requires": { - "bser": "^2.0.0" + "bser": "2.1.0" } }, "fill-range": { @@ -1701,10 +1701,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" }, "dependencies": { "extend-shallow": { @@ -1713,7 +1713,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -1724,7 +1724,7 @@ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "locate-path": "3.0.0" } }, "flatstr": { @@ -1750,9 +1750,9 @@ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "asynckit": "0.4.0", + "combined-stream": "1.0.8", + "mime-types": "2.1.24" } }, "fragment-cache": { @@ -1761,7 +1761,7 @@ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "^0.2.2" + "map-cache": "0.2.2" } }, "fs.realpath": { @@ -1777,8 +1777,8 @@ "dev": true, "optional": true, "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" + "nan": "2.14.0", + "node-pre-gyp": "0.12.0" }, "dependencies": { "abbrev": { @@ -2336,7 +2336,7 @@ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "pump": "^3.0.0" + "pump": "3.0.0" } }, "get-value": { @@ -2351,7 +2351,7 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "glob": { @@ -2360,12 +2360,12 @@ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.4", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "globals": { @@ -2398,10 +2398,10 @@ "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", "dev": true, "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" + "neo-async": "2.6.1", + "optimist": "0.6.1", + "source-map": "0.6.1", + "uglify-js": "3.6.0" } }, "har-schema": { @@ -2416,8 +2416,8 @@ "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" + "ajv": "6.10.0", + "har-schema": "2.0.0" } }, "has": { @@ -2426,7 +2426,7 @@ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "function-bind": "^1.1.1" + "function-bind": "1.1.1" } }, "has-ansi": { @@ -2435,7 +2435,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" }, "dependencies": { "ansi-regex": { @@ -2470,9 +2470,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" } }, "has-values": { @@ -2481,8 +2481,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "is-number": "3.0.0", + "kind-of": "4.0.0" }, "dependencies": { "kind-of": { @@ -2491,7 +2491,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -2501,8 +2501,8 @@ "resolved": "https://registry.npmjs.org/hashring/-/hashring-3.2.0.tgz", "integrity": "sha1-/aTv3oqiLNuX+x0qZeiEAeHBRM4=", "requires": { - "connection-parse": "0.0.x", - "simple-lru-cache": "0.0.x" + "connection-parse": "0.0.7", + "simple-lru-cache": "0.0.2" } }, "hosted-git-info": { @@ -2517,7 +2517,7 @@ "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", "dev": true, "requires": { - "whatwg-encoding": "^1.0.1" + "whatwg-encoding": "1.0.5" } }, "htmlparser2": { @@ -2526,11 +2526,11 @@ "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", "dev": true, "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" + "domelementtype": "1.3.1", + "domhandler": "2.3.0", + "domutils": "1.5.1", + "entities": "1.0.0", + "readable-stream": "1.1.14" }, "dependencies": { "isarray": { @@ -2545,10 +2545,10 @@ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "core-util-is": "1.0.2", + "inherits": "2.0.4", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } }, "string_decoder": { @@ -2565,9 +2565,9 @@ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.16.1" } }, "i": { @@ -2582,7 +2582,7 @@ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": "2.1.2" } }, "import-local": { @@ -2591,8 +2591,8 @@ "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", "dev": true, "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "pkg-dir": "3.0.0", + "resolve-cwd": "2.0.0" } }, "imurmurhash": { @@ -2607,8 +2607,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherit": { @@ -2629,7 +2629,7 @@ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { - "loose-envify": "^1.0.0" + "loose-envify": "1.4.0" } }, "invert-kv": { @@ -2644,7 +2644,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -2653,7 +2653,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -2682,7 +2682,7 @@ "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, "requires": { - "ci-info": "^2.0.0" + "ci-info": "2.0.0" } }, "is-data-descriptor": { @@ -2691,7 +2691,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -2700,7 +2700,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -2717,9 +2717,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" }, "dependencies": { "kind-of": { @@ -2754,7 +2754,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -2763,7 +2763,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -2774,7 +2774,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" } }, "is-regex": { @@ -2783,7 +2783,7 @@ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "has": "^1.0.1" + "has": "1.0.3" } }, "is-stream": { @@ -2798,7 +2798,7 @@ "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", "dev": true, "requires": { - "has-symbols": "^1.0.0" + "has-symbols": "1.0.0" } }, "is-typedarray": { @@ -2861,13 +2861,13 @@ "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", "dev": true, "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" + "@babel/generator": "7.4.4", + "@babel/parser": "7.4.5", + "@babel/template": "7.4.4", + "@babel/traverse": "7.4.5", + "@babel/types": "7.4.4", + "istanbul-lib-coverage": "2.0.5", + "semver": "6.1.2" }, "dependencies": { "semver": { @@ -2884,9 +2884,9 @@ "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", "dev": true, "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" + "istanbul-lib-coverage": "2.0.5", + "make-dir": "2.1.0", + "supports-color": "6.1.0" }, "dependencies": { "supports-color": { @@ -2895,7 +2895,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -2906,11 +2906,11 @@ "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", "dev": true, "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" + "debug": "4.1.1", + "istanbul-lib-coverage": "2.0.5", + "make-dir": "2.1.0", + "rimraf": "2.6.3", + "source-map": "0.6.1" }, "dependencies": { "debug": { @@ -2919,7 +2919,7 @@ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -2936,7 +2936,7 @@ "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", "dev": true, "requires": { - "handlebars": "^4.1.2" + "handlebars": "4.1.2" } }, "jest": { @@ -2945,8 +2945,8 @@ "integrity": "sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg==", "dev": true, "requires": { - "import-local": "^2.0.0", - "jest-cli": "^24.8.0" + "import-local": "2.0.0", + "jest-cli": "24.8.0" }, "dependencies": { "jest-cli": { @@ -2955,19 +2955,19 @@ "integrity": "sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA==", "dev": true, "requires": { - "@jest/core": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "import-local": "^2.0.0", - "is-ci": "^2.0.0", - "jest-config": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", - "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^12.0.2" + "@jest/core": "24.8.0", + "@jest/test-result": "24.8.0", + "@jest/types": "24.8.0", + "chalk": "2.4.2", + "exit": "0.1.2", + "import-local": "2.0.0", + "is-ci": "2.0.0", + "jest-config": "24.8.0", + "jest-util": "24.8.0", + "jest-validate": "24.8.0", + "prompts": "2.1.0", + "realpath-native": "1.1.0", + "yargs": "12.0.5" } } } @@ -2978,9 +2978,9 @@ "integrity": "sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug==", "dev": true, "requires": { - "@jest/types": "^24.8.0", - "execa": "^1.0.0", - "throat": "^4.0.0" + "@jest/types": "24.8.0", + "execa": "1.0.0", + "throat": "4.1.0" } }, "jest-config": { @@ -2989,23 +2989,23 @@ "integrity": "sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw==", "dev": true, "requires": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.8.0", - "@jest/types": "^24.8.0", - "babel-jest": "^24.8.0", - "chalk": "^2.0.1", - "glob": "^7.1.1", - "jest-environment-jsdom": "^24.8.0", - "jest-environment-node": "^24.8.0", - "jest-get-type": "^24.8.0", - "jest-jasmine2": "^24.8.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", - "micromatch": "^3.1.10", - "pretty-format": "^24.8.0", - "realpath-native": "^1.1.0" + "@babel/core": "7.4.5", + "@jest/test-sequencer": "24.8.0", + "@jest/types": "24.8.0", + "babel-jest": "24.8.0", + "chalk": "2.4.2", + "glob": "7.1.4", + "jest-environment-jsdom": "24.8.0", + "jest-environment-node": "24.8.0", + "jest-get-type": "24.8.0", + "jest-jasmine2": "24.8.0", + "jest-regex-util": "24.3.0", + "jest-resolve": "24.8.0", + "jest-util": "24.8.0", + "jest-validate": "24.8.0", + "micromatch": "3.1.10", + "pretty-format": "24.8.0", + "realpath-native": "1.1.0" } }, "jest-diff": { @@ -3014,10 +3014,10 @@ "integrity": "sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g==", "dev": true, "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.3.0", - "jest-get-type": "^24.8.0", - "pretty-format": "^24.8.0" + "chalk": "2.4.2", + "diff-sequences": "24.3.0", + "jest-get-type": "24.8.0", + "pretty-format": "24.8.0" } }, "jest-docblock": { @@ -3026,7 +3026,7 @@ "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", "dev": true, "requires": { - "detect-newline": "^2.1.0" + "detect-newline": "2.1.0" } }, "jest-each": { @@ -3035,11 +3035,11 @@ "integrity": "sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA==", "dev": true, "requires": { - "@jest/types": "^24.8.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.8.0", - "jest-util": "^24.8.0", - "pretty-format": "^24.8.0" + "@jest/types": "24.8.0", + "chalk": "2.4.2", + "jest-get-type": "24.8.0", + "jest-util": "24.8.0", + "pretty-format": "24.8.0" } }, "jest-environment-jsdom": { @@ -3048,12 +3048,12 @@ "integrity": "sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ==", "dev": true, "requires": { - "@jest/environment": "^24.8.0", - "@jest/fake-timers": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-util": "^24.8.0", - "jsdom": "^11.5.1" + "@jest/environment": "24.8.0", + "@jest/fake-timers": "24.8.0", + "@jest/types": "24.8.0", + "jest-mock": "24.8.0", + "jest-util": "24.8.0", + "jsdom": "11.12.0" } }, "jest-environment-node": { @@ -3062,11 +3062,11 @@ "integrity": "sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q==", "dev": true, "requires": { - "@jest/environment": "^24.8.0", - "@jest/fake-timers": "^24.8.0", - "@jest/types": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-util": "^24.8.0" + "@jest/environment": "24.8.0", + "@jest/fake-timers": "24.8.0", + "@jest/types": "24.8.0", + "jest-mock": "24.8.0", + "jest-util": "24.8.0" } }, "jest-get-type": { @@ -3081,18 +3081,18 @@ "integrity": "sha512-SwaxMGVdAZk3ernAx2Uv2sorA7jm3Kx+lR0grp6rMmnY06Kn/urtKx1LPN2mGTea4fCT38impYT28FfcLUhX0g==", "dev": true, "requires": { - "@jest/types": "^24.8.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.4.0", - "jest-util": "^24.8.0", - "jest-worker": "^24.6.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" + "@jest/types": "24.8.0", + "anymatch": "2.0.0", + "fb-watchman": "2.0.0", + "fsevents": "1.2.9", + "graceful-fs": "4.2.0", + "invariant": "2.2.4", + "jest-serializer": "24.4.0", + "jest-util": "24.8.0", + "jest-worker": "24.6.0", + "micromatch": "3.1.10", + "sane": "4.1.0", + "walker": "1.0.7" } }, "jest-jasmine2": { @@ -3101,22 +3101,22 @@ "integrity": "sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong==", "dev": true, "requires": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", - "chalk": "^2.0.1", - "co": "^4.6.0", - "expect": "^24.8.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "pretty-format": "^24.8.0", - "throat": "^4.0.0" + "@babel/traverse": "7.4.5", + "@jest/environment": "24.8.0", + "@jest/test-result": "24.8.0", + "@jest/types": "24.8.0", + "chalk": "2.4.2", + "co": "4.6.0", + "expect": "24.8.0", + "is-generator-fn": "2.1.0", + "jest-each": "24.8.0", + "jest-matcher-utils": "24.8.0", + "jest-message-util": "24.8.0", + "jest-runtime": "24.8.0", + "jest-snapshot": "24.8.0", + "jest-util": "24.8.0", + "pretty-format": "24.8.0", + "throat": "4.1.0" } }, "jest-leak-detector": { @@ -3125,7 +3125,7 @@ "integrity": "sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g==", "dev": true, "requires": { - "pretty-format": "^24.8.0" + "pretty-format": "24.8.0" } }, "jest-matcher-utils": { @@ -3134,10 +3134,10 @@ "integrity": "sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw==", "dev": true, "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.8.0", - "jest-get-type": "^24.8.0", - "pretty-format": "^24.8.0" + "chalk": "2.4.2", + "jest-diff": "24.8.0", + "jest-get-type": "24.8.0", + "pretty-format": "24.8.0" } }, "jest-message-util": { @@ -3146,14 +3146,14 @@ "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" + "@babel/code-frame": "7.0.0", + "@jest/test-result": "24.8.0", + "@jest/types": "24.8.0", + "@types/stack-utils": "1.0.1", + "chalk": "2.4.2", + "micromatch": "3.1.10", + "slash": "2.0.0", + "stack-utils": "1.0.2" } }, "jest-mock": { @@ -3162,7 +3162,7 @@ "integrity": "sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A==", "dev": true, "requires": { - "@jest/types": "^24.8.0" + "@jest/types": "24.8.0" } }, "jest-pnp-resolver": { @@ -3183,11 +3183,11 @@ "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", "dev": true, "requires": { - "@jest/types": "^24.8.0", - "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", - "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" + "@jest/types": "24.8.0", + "browser-resolve": "1.11.3", + "chalk": "2.4.2", + "jest-pnp-resolver": "1.2.1", + "realpath-native": "1.1.0" } }, "jest-resolve-dependencies": { @@ -3196,9 +3196,9 @@ "integrity": "sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw==", "dev": true, "requires": { - "@jest/types": "^24.8.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.8.0" + "@jest/types": "24.8.0", + "jest-regex-util": "24.3.0", + "jest-snapshot": "24.8.0" } }, "jest-runner": { @@ -3207,25 +3207,25 @@ "integrity": "sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.8.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", - "chalk": "^2.4.2", - "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.8.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.8.0", - "jest-jasmine2": "^24.8.0", - "jest-leak-detector": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-resolve": "^24.8.0", - "jest-runtime": "^24.8.0", - "jest-util": "^24.8.0", - "jest-worker": "^24.6.0", - "source-map-support": "^0.5.6", - "throat": "^4.0.0" + "@jest/console": "24.7.1", + "@jest/environment": "24.8.0", + "@jest/test-result": "24.8.0", + "@jest/types": "24.8.0", + "chalk": "2.4.2", + "exit": "0.1.2", + "graceful-fs": "4.2.0", + "jest-config": "24.8.0", + "jest-docblock": "24.3.0", + "jest-haste-map": "24.8.1", + "jest-jasmine2": "24.8.0", + "jest-leak-detector": "24.8.0", + "jest-message-util": "24.8.0", + "jest-resolve": "24.8.0", + "jest-runtime": "24.8.0", + "jest-util": "24.8.0", + "jest-worker": "24.6.0", + "source-map-support": "0.5.12", + "throat": "4.1.0" } }, "jest-runtime": { @@ -3234,29 +3234,29 @@ "integrity": "sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.8.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/yargs": "^12.0.2", - "chalk": "^2.0.1", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.8.0", - "jest-haste-map": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-mock": "^24.8.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.8.0", - "jest-snapshot": "^24.8.0", - "jest-util": "^24.8.0", - "jest-validate": "^24.8.0", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^12.0.2" + "@jest/console": "24.7.1", + "@jest/environment": "24.8.0", + "@jest/source-map": "24.3.0", + "@jest/transform": "24.8.0", + "@jest/types": "24.8.0", + "@types/yargs": "12.0.12", + "chalk": "2.4.2", + "exit": "0.1.2", + "glob": "7.1.4", + "graceful-fs": "4.2.0", + "jest-config": "24.8.0", + "jest-haste-map": "24.8.1", + "jest-message-util": "24.8.0", + "jest-mock": "24.8.0", + "jest-regex-util": "24.3.0", + "jest-resolve": "24.8.0", + "jest-snapshot": "24.8.0", + "jest-util": "24.8.0", + "jest-validate": "24.8.0", + "realpath-native": "1.1.0", + "slash": "2.0.0", + "strip-bom": "3.0.0", + "yargs": "12.0.5" } }, "jest-serializer": { @@ -3271,18 +3271,18 @@ "integrity": "sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg==", "dev": true, "requires": { - "@babel/types": "^7.0.0", - "@jest/types": "^24.8.0", - "chalk": "^2.0.1", - "expect": "^24.8.0", - "jest-diff": "^24.8.0", - "jest-matcher-utils": "^24.8.0", - "jest-message-util": "^24.8.0", - "jest-resolve": "^24.8.0", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^24.8.0", - "semver": "^5.5.0" + "@babel/types": "7.4.4", + "@jest/types": "24.8.0", + "chalk": "2.4.2", + "expect": "24.8.0", + "jest-diff": "24.8.0", + "jest-matcher-utils": "24.8.0", + "jest-message-util": "24.8.0", + "jest-resolve": "24.8.0", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "pretty-format": "24.8.0", + "semver": "5.7.0" } }, "jest-util": { @@ -3291,18 +3291,18 @@ "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/fake-timers": "^24.8.0", - "@jest/source-map": "^24.3.0", - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" + "@jest/console": "24.7.1", + "@jest/fake-timers": "24.8.0", + "@jest/source-map": "24.3.0", + "@jest/test-result": "24.8.0", + "@jest/types": "24.8.0", + "callsites": "3.1.0", + "chalk": "2.4.2", + "graceful-fs": "4.2.0", + "is-ci": "2.0.0", + "mkdirp": "0.5.1", + "slash": "2.0.0", + "source-map": "0.6.1" } }, "jest-validate": { @@ -3311,12 +3311,12 @@ "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==", "dev": true, "requires": { - "@jest/types": "^24.8.0", - "camelcase": "^5.0.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.8.0", - "leven": "^2.1.0", - "pretty-format": "^24.8.0" + "@jest/types": "24.8.0", + "camelcase": "5.3.1", + "chalk": "2.4.2", + "jest-get-type": "24.8.0", + "leven": "2.1.0", + "pretty-format": "24.8.0" } }, "jest-watcher": { @@ -3325,13 +3325,13 @@ "integrity": "sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw==", "dev": true, "requires": { - "@jest/test-result": "^24.8.0", - "@jest/types": "^24.8.0", - "@types/yargs": "^12.0.9", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "jest-util": "^24.8.0", - "string-length": "^2.0.0" + "@jest/test-result": "24.8.0", + "@jest/types": "24.8.0", + "@types/yargs": "12.0.12", + "ansi-escapes": "3.2.0", + "chalk": "2.4.2", + "jest-util": "24.8.0", + "string-length": "2.0.0" } }, "jest-worker": { @@ -3340,8 +3340,8 @@ "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", "dev": true, "requires": { - "merge-stream": "^1.0.1", - "supports-color": "^6.1.0" + "merge-stream": "1.0.1", + "supports-color": "6.1.0" }, "dependencies": { "supports-color": { @@ -3350,7 +3350,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -3367,9 +3367,9 @@ "integrity": "sha1-a+GyP2JJ9T0pM3D9TRqqY84bTrA=", "dev": true, "requires": { - "argparse": "^1.0.2", - "esprima": "^2.6.0", - "inherit": "^2.2.2" + "argparse": "1.0.10", + "esprima": "2.7.3", + "inherit": "2.2.7" }, "dependencies": { "esprima": { @@ -3392,32 +3392,32 @@ "integrity": "sha1-cUG03/W4bjLQ6Z12S4NnZ8MNIBo=", "dev": true, "requires": { - "chalk": "~1.1.0", - "cli-table": "~0.3.1", - "commander": "~2.9.0", - "cst": "^0.4.3", - "estraverse": "^4.1.0", - "exit": "~0.1.2", - "glob": "^5.0.1", + "chalk": "1.1.3", + "cli-table": "0.3.1", + "commander": "2.9.0", + "cst": "0.4.10", + "estraverse": "4.2.0", + "exit": "0.1.2", + "glob": "5.0.15", "htmlparser2": "3.8.3", - "js-yaml": "~3.4.0", - "jscs-jsdoc": "^2.0.0", - "jscs-preset-wikimedia": "~1.0.0", - "jsonlint": "~1.6.2", - "lodash": "~3.10.0", - "minimatch": "~3.0.0", - "natural-compare": "~1.2.2", - "pathval": "~0.1.1", - "prompt": "~0.2.14", - "reserved-words": "^0.1.1", - "resolve": "^1.1.6", - "strip-bom": "^2.0.0", - "strip-json-comments": "~1.0.2", - "to-double-quotes": "^2.0.0", - "to-single-quotes": "^2.0.0", - "vow": "~0.4.8", - "vow-fs": "~0.3.4", - "xmlbuilder": "^3.1.0" + "js-yaml": "3.4.6", + "jscs-jsdoc": "2.0.0", + "jscs-preset-wikimedia": "1.0.1", + "jsonlint": "1.6.3", + "lodash": "3.10.1", + "minimatch": "3.0.4", + "natural-compare": "1.2.2", + "pathval": "0.1.1", + "prompt": "0.2.14", + "reserved-words": "0.1.2", + "resolve": "1.11.1", + "strip-bom": "2.0.0", + "strip-json-comments": "1.0.4", + "to-double-quotes": "2.0.0", + "to-single-quotes": "2.0.1", + "vow": "0.4.19", + "vow-fs": "0.3.6", + "xmlbuilder": "3.1.0" }, "dependencies": { "ansi-regex": { @@ -3438,11 +3438,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, "commander": { @@ -3451,7 +3451,7 @@ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", "dev": true, "requires": { - "graceful-readlink": ">= 1.0.0" + "graceful-readlink": "1.0.1" } }, "glob": { @@ -3460,11 +3460,11 @@ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true, "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "inflight": "1.0.6", + "inherits": "2.0.4", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "lodash": { @@ -3491,7 +3491,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-bom": { @@ -3500,7 +3500,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "^0.2.0" + "is-utf8": "0.2.1" } }, "supports-color": { @@ -3517,8 +3517,8 @@ "integrity": "sha1-9T684CmqMSW9iCkLpQ1k1FEKSHE=", "dev": true, "requires": { - "comment-parser": "^0.3.1", - "jsdoctypeparser": "~1.2.0" + "comment-parser": "0.3.2", + "jsdoctypeparser": "1.2.0" } }, "jscs-preset-wikimedia": { @@ -3533,7 +3533,7 @@ "integrity": "sha1-597cFToRhJ/8UUEUSuhqfvDCU5I=", "dev": true, "requires": { - "lodash": "^3.7.0" + "lodash": "3.10.1" }, "dependencies": { "lodash": { @@ -3550,32 +3550,32 @@ "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", "dev": true, "requires": { - "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.1", - "escodegen": "^1.9.1", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", + "abab": "2.0.0", + "acorn": "5.7.3", + "acorn-globals": "4.3.2", + "array-equal": "1.0.0", + "cssom": "0.3.6", + "cssstyle": "1.2.2", + "data-urls": "1.1.0", + "domexception": "1.0.1", + "escodegen": "1.11.1", + "html-encoding-sniffer": "1.0.2", + "left-pad": "1.3.0", + "nwsapi": "2.1.4", "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", - "xml-name-validator": "^3.0.0" + "pn": "1.1.0", + "request": "2.88.0", + "request-promise-native": "1.0.7", + "sax": "1.2.4", + "symbol-tree": "3.2.4", + "tough-cookie": "2.5.0", + "w3c-hr-time": "1.0.1", + "webidl-conversions": "4.0.2", + "whatwg-encoding": "1.0.5", + "whatwg-mimetype": "2.3.0", + "whatwg-url": "6.5.0", + "ws": "5.2.2", + "xml-name-validator": "3.0.0" } }, "jsesc": { @@ -3614,7 +3614,7 @@ "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "1.2.0" } }, "jsonlint": { @@ -3623,8 +3623,8 @@ "integrity": "sha512-jMVTMzP+7gU/IyC6hvKyWpUU8tmTkK5b3BPNuMI9U8Sit+YAWLlZwB6Y6YrdCxfg2kNz05p3XY3Bmm4m26Nv3A==", "dev": true, "requires": { - "JSV": "^4.0.x", - "nomnom": "^1.5.x" + "JSV": "4.0.2", + "nomnom": "1.8.1" } }, "jsprim": { @@ -3657,7 +3657,7 @@ "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { - "invert-kv": "^2.0.0" + "invert-kv": "2.0.0" } }, "left-pad": { @@ -3678,8 +3678,8 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "1.1.2", + "type-check": "0.3.2" } }, "load-json-file": { @@ -3688,10 +3688,10 @@ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "graceful-fs": "4.2.0", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" } }, "locate-path": { @@ -3700,8 +3700,8 @@ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "3.0.0", + "path-exists": "3.0.0" } }, "lodash": { @@ -3726,7 +3726,7 @@ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" + "js-tokens": "4.0.0" } }, "make-dir": { @@ -3735,8 +3735,8 @@ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "pify": "4.0.1", + "semver": "5.7.0" }, "dependencies": { "pify": { @@ -3753,7 +3753,7 @@ "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "dev": true, "requires": { - "tmpl": "1.0.x" + "tmpl": "1.0.4" } }, "map-age-cleaner": { @@ -3762,7 +3762,7 @@ "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, "requires": { - "p-defer": "^1.0.0" + "p-defer": "1.0.0" } }, "map-cache": { @@ -3777,7 +3777,7 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "^1.0.0" + "object-visit": "1.0.1" } }, "mem": { @@ -3786,9 +3786,9 @@ "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" + "map-age-cleaner": "0.1.3", + "mimic-fn": "2.1.0", + "p-is-promise": "2.1.0" } }, "merge-stream": { @@ -3797,7 +3797,7 @@ "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", "dev": true, "requires": { - "readable-stream": "^2.0.1" + "readable-stream": "2.3.6" } }, "micromatch": { @@ -3806,19 +3806,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "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" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "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.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } }, "mime-db": { @@ -3848,7 +3848,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -3863,8 +3863,8 @@ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "for-in": "1.0.2", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -3873,7 +3873,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -3925,17 +3925,17 @@ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { - "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" + "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.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } }, "natural-compare": { @@ -3961,7 +3961,7 @@ "resolved": "https://registry.npmjs.org/nice-simple-logger/-/nice-simple-logger-1.0.1.tgz", "integrity": "sha1-D55khSe+e+PkmrdvqMjAmK+VG/Y=", "requires": { - "lodash": "^4.3.0" + "lodash": "4.17.11" } }, "nice-try": { @@ -3976,15 +3976,15 @@ "integrity": "sha512-hYnkg1OWVdaxORdzVvdQ4ueWYpf7IICObPzd24BBiDyVG5219VkUnRxSH9wZmisFb6NpgABzlSIL1pIZaCKmXg==", "requires": { "@types/bluebird": "3.5.0", - "@types/lodash": "^4.14.55", - "bin-protocol": "^3.1.1", - "bluebird": "^3.3.3", - "buffer-crc32": "^0.2.5", - "hashring": "^3.2.0", - "lodash": "=4.17.11", - "murmur-hash-js": "^1.0.0", - "nice-simple-logger": "^1.0.1", - "wrr-pool": "^1.0.3" + "@types/lodash": "4.14.135", + "bin-protocol": "3.1.1", + "bluebird": "3.5.5", + "buffer-crc32": "0.2.13", + "hashring": "3.2.0", + "lodash": "4.17.11", + "murmur-hash-js": "1.0.0", + "nice-simple-logger": "1.0.1", + "wrr-pool": "1.1.4" } }, "node-int64": { @@ -4005,11 +4005,11 @@ "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", "dev": true, "requires": { - "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", - "shellwords": "^0.1.1", - "which": "^1.3.0" + "growly": "1.3.0", + "is-wsl": "1.1.0", + "semver": "5.7.0", + "shellwords": "0.1.1", + "which": "1.3.1" } }, "nomnom": { @@ -4018,8 +4018,8 @@ "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", "dev": true, "requires": { - "chalk": "~0.4.0", - "underscore": "~1.6.0" + "chalk": "0.4.0", + "underscore": "1.6.0" }, "dependencies": { "ansi-styles": { @@ -4034,9 +4034,9 @@ "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", "dev": true, "requires": { - "ansi-styles": "~1.0.0", - "has-color": "~0.1.0", - "strip-ansi": "~0.1.0" + "ansi-styles": "1.0.0", + "has-color": "0.1.7", + "strip-ansi": "0.1.1" } }, "strip-ansi": { @@ -4053,10 +4053,10 @@ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "2.7.1", + "resolve": "1.11.1", + "semver": "5.7.0", + "validate-npm-package-license": "3.0.4" } }, "normalize-path": { @@ -4065,7 +4065,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "^1.0.1" + "remove-trailing-separator": "1.1.0" } }, "npm-run-path": { @@ -4074,7 +4074,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "^2.0.0" + "path-key": "2.0.1" } }, "number-is-nan": { @@ -4101,9 +4101,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" }, "dependencies": { "define-property": { @@ -4112,7 +4112,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "kind-of": { @@ -4121,7 +4121,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -4138,7 +4138,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "^3.0.0" + "isobject": "3.0.1" } }, "object.getownpropertydescriptors": { @@ -4147,8 +4147,8 @@ "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "define-properties": "1.1.3", + "es-abstract": "1.13.0" } }, "object.pick": { @@ -4157,7 +4157,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" } }, "once": { @@ -4166,7 +4166,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "optimist": { @@ -4175,8 +4175,8 @@ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" + "minimist": "0.0.10", + "wordwrap": "0.0.3" }, "dependencies": { "minimist": { @@ -4193,12 +4193,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" }, "dependencies": { "wordwrap": { @@ -4215,9 +4215,9 @@ "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" + "execa": "1.0.0", + "lcid": "2.0.0", + "mem": "4.3.0" } }, "p-defer": { @@ -4232,7 +4232,7 @@ "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", "dev": true, "requires": { - "p-reduce": "^1.0.0" + "p-reduce": "1.0.0" } }, "p-finally": { @@ -4253,7 +4253,7 @@ "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "p-try": "2.2.0" } }, "p-locate": { @@ -4262,7 +4262,7 @@ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "p-limit": "2.2.0" } }, "p-reduce": { @@ -4283,8 +4283,8 @@ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "error-ex": "1.3.2", + "json-parse-better-errors": "1.0.2" } }, "parse5": { @@ -4329,9 +4329,14 @@ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "pify": "^3.0.0" + "pify": "3.0.0" } }, + "percentile": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/percentile/-/percentile-1.2.2.tgz", + "integrity": "sha512-yb/W/Y3WNxEZ6/P75qkAvE3lu81AO1qDk95j7jPJg4Vj+wDWSDs0CMLVGoAUCOZbXOUOz3b3rWWR6Bf1hyzNJg==" + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -4349,12 +4354,12 @@ "resolved": "https://registry.npmjs.org/pino/-/pino-5.12.6.tgz", "integrity": "sha512-LM5ug2b27uymIIkaBw54ncF+9DSf8S4z1uzw+Y5I94dRu3Z+lFuB13j0kg1InAeyxy+CsLGnWHKy9+zgTreFOg==", "requires": { - "fast-redact": "^1.4.4", - "fast-safe-stringify": "^2.0.6", - "flatstr": "^1.0.9", - "pino-std-serializers": "^2.3.0", - "quick-format-unescaped": "^3.0.2", - "sonic-boom": "^0.7.3" + "fast-redact": "1.5.0", + "fast-safe-stringify": "2.0.6", + "flatstr": "1.0.12", + "pino-std-serializers": "2.4.2", + "quick-format-unescaped": "3.0.2", + "sonic-boom": "0.7.4" } }, "pino-std-serializers": { @@ -4368,7 +4373,7 @@ "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", "dev": true, "requires": { - "node-modules-regexp": "^1.0.0" + "node-modules-regexp": "1.0.0" } }, "pkg-dir": { @@ -4377,7 +4382,7 @@ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "find-up": "^3.0.0" + "find-up": "3.0.0" } }, "pkginfo": { @@ -4410,10 +4415,10 @@ "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", "dev": true, "requires": { - "@jest/types": "^24.8.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "@jest/types": "24.8.0", + "ansi-regex": "4.1.0", + "ansi-styles": "3.2.1", + "react-is": "16.8.6" } }, "process-nextick-args": { @@ -4428,11 +4433,11 @@ "integrity": "sha1-V3VPZPVD/XsIRXB8gY7OYY8F/9w=", "dev": true, "requires": { - "pkginfo": "0.x.x", - "read": "1.0.x", - "revalidator": "0.1.x", - "utile": "0.2.x", - "winston": "0.8.x" + "pkginfo": "0.4.1", + "read": "1.0.7", + "revalidator": "0.1.8", + "utile": "0.2.1", + "winston": "0.8.3" } }, "prompts": { @@ -4441,8 +4446,8 @@ "integrity": "sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg==", "dev": true, "requires": { - "kleur": "^3.0.2", - "sisteransi": "^1.0.0" + "kleur": "3.0.3", + "sisteransi": "1.0.0" } }, "protocol-buffers-schema": { @@ -4462,8 +4467,8 @@ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "end-of-stream": "1.4.1", + "once": "1.4.0" } }, "punycode": { @@ -4495,7 +4500,7 @@ "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", "dev": true, "requires": { - "mute-stream": "~0.0.4" + "mute-stream": "0.0.8" } }, "read-pkg": { @@ -4504,9 +4509,9 @@ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "load-json-file": "4.0.0", + "normalize-package-data": "2.5.0", + "path-type": "3.0.0" } }, "read-pkg-up": { @@ -4515,8 +4520,8 @@ "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", "dev": true, "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" + "find-up": "3.0.0", + "read-pkg": "3.0.0" } }, "readable-stream": { @@ -4525,13 +4530,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "realpath-native": { @@ -4540,7 +4545,7 @@ "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", "dev": true, "requires": { - "util.promisify": "^1.0.0" + "util.promisify": "1.0.0" } }, "regenerator-runtime": { @@ -4555,8 +4560,8 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" } }, "remove-trailing-separator": { @@ -4583,26 +4588,26 @@ "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "aws-sign2": "0.7.0", + "aws4": "1.8.0", + "caseless": "0.12.0", + "combined-stream": "1.0.8", + "extend": "3.0.2", + "forever-agent": "0.6.1", + "form-data": "2.3.3", + "har-validator": "5.1.3", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.24", + "oauth-sign": "0.9.0", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.4.3", + "tunnel-agent": "0.6.0", + "uuid": "3.3.2" }, "dependencies": { "punycode": { @@ -4617,8 +4622,8 @@ "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "dev": true, "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "psl": "1.1.33", + "punycode": "1.4.1" } } } @@ -4629,7 +4634,7 @@ "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", "dev": true, "requires": { - "lodash": "^4.17.11" + "lodash": "4.17.11" } }, "request-promise-native": { @@ -4639,8 +4644,8 @@ "dev": true, "requires": { "request-promise-core": "1.1.2", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" + "stealthy-require": "1.1.1", + "tough-cookie": "2.5.0" } }, "require-directory": { @@ -4667,7 +4672,7 @@ "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", "dev": true, "requires": { - "path-parse": "^1.0.6" + "path-parse": "1.0.6" } }, "resolve-cwd": { @@ -4676,7 +4681,7 @@ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { - "resolve-from": "^3.0.0" + "resolve-from": "3.0.0" } }, "resolve-from": { @@ -4709,7 +4714,7 @@ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "glob": "^7.1.3" + "glob": "7.1.4" } }, "rsvp": { @@ -4730,7 +4735,7 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "~0.1.10" + "ret": "0.1.15" } }, "safer-buffer": { @@ -4745,15 +4750,15 @@ "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", "dev": true, "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" + "@cnakazawa/watch": "1.0.3", + "anymatch": "2.0.0", + "capture-exit": "2.0.0", + "exec-sh": "0.3.2", + "execa": "1.0.0", + "fb-watchman": "2.0.0", + "micromatch": "3.1.10", + "minimist": "1.2.0", + "walker": "1.0.7" } }, "sax": { @@ -4780,10 +4785,10 @@ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" }, "dependencies": { "extend-shallow": { @@ -4792,7 +4797,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -4803,7 +4808,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "1.0.0" } }, "shebang-regex": { @@ -4847,14 +4852,14 @@ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "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" + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.1.1" }, "dependencies": { "debug": { @@ -4872,7 +4877,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -4881,7 +4886,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "source-map": { @@ -4898,9 +4903,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" }, "dependencies": { "define-property": { @@ -4909,7 +4914,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -4918,7 +4923,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -4927,7 +4932,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -4936,9 +4941,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } } } @@ -4949,7 +4954,7 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "^3.2.0" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -4958,7 +4963,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -4968,7 +4973,7 @@ "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-0.7.4.tgz", "integrity": "sha512-8JRAJg0RxZtFLQMxolwETvWd2JSlH3ZGo/Z4xPxMbpqF14xCgVYPVeFCFOR3zyr3pcfG82QDVj6537Sx5ZWdNw==", "requires": { - "flatstr": "^1.0.9" + "flatstr": "1.0.12" } }, "source-map": { @@ -4983,11 +4988,11 @@ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "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": { @@ -4996,8 +5001,8 @@ "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "buffer-from": "1.1.1", + "source-map": "0.6.1" } }, "source-map-url": { @@ -5012,8 +5017,8 @@ "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.4" } }, "spdx-exceptions": { @@ -5028,8 +5033,8 @@ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "spdx-exceptions": "2.2.0", + "spdx-license-ids": "3.0.4" } }, "spdx-license-ids": { @@ -5044,7 +5049,7 @@ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "^3.0.0" + "extend-shallow": "3.0.2" } }, "sprintf-js": { @@ -5059,15 +5064,15 @@ "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" + "asn1": "0.2.4", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.2", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.2", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" } }, "stack-trace": { @@ -5088,8 +5093,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "define-property": "0.2.5", + "object-copy": "0.1.0" }, "dependencies": { "define-property": { @@ -5098,7 +5103,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -5115,8 +5120,8 @@ "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", "dev": true, "requires": { - "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" + "astral-regex": "1.0.0", + "strip-ansi": "4.0.0" }, "dependencies": { "ansi-regex": { @@ -5131,7 +5136,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -5142,8 +5147,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" }, "dependencies": { "ansi-regex": { @@ -5158,7 +5163,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -5169,7 +5174,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } }, "strip-ansi": { @@ -5178,7 +5183,7 @@ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "4.1.0" } }, "strip-bom": { @@ -5205,7 +5210,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } }, "symbol-tree": { @@ -5220,10 +5225,10 @@ "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", "dev": true, "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" + "glob": "7.1.4", + "minimatch": "3.0.4", + "read-pkg-up": "4.0.0", + "require-main-filename": "2.0.0" } }, "throat": { @@ -5256,7 +5261,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -5265,7 +5270,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -5276,10 +5281,10 @@ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" } }, "to-regex-range": { @@ -5288,8 +5293,8 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "3.0.0", + "repeat-string": "1.6.1" } }, "to-single-quotes": { @@ -5304,8 +5309,8 @@ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "1.1.33", + "punycode": "2.1.1" } }, "tr46": { @@ -5314,7 +5319,7 @@ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", "dev": true, "requires": { - "punycode": "^2.1.0" + "punycode": "2.1.1" } }, "trim-right": { @@ -5329,7 +5334,7 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.1.2" } }, "tweetnacl": { @@ -5344,7 +5349,7 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "1.1.2" } }, "uglify-js": { @@ -5354,8 +5359,8 @@ "dev": true, "optional": true, "requires": { - "commander": "~2.20.0", - "source-map": "~0.6.1" + "commander": "2.20.0", + "source-map": "0.6.1" } }, "underscore": { @@ -5370,10 +5375,10 @@ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "2.0.1" } }, "unset-value": { @@ -5382,8 +5387,8 @@ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "has-value": "0.3.1", + "isobject": "3.0.1" }, "dependencies": { "has-value": { @@ -5392,9 +5397,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" }, "dependencies": { "isobject": { @@ -5422,7 +5427,7 @@ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "punycode": "^2.1.0" + "punycode": "2.1.1" } }, "urix": { @@ -5449,8 +5454,8 @@ "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" + "define-properties": "1.1.3", + "object.getownpropertydescriptors": "2.0.3" } }, "utile": { @@ -5459,12 +5464,12 @@ "integrity": "sha1-kwyI6ZCY1iIINMNWy9mncFItkNc=", "dev": true, "requires": { - "async": "~0.2.9", - "deep-equal": "*", - "i": "0.3.x", - "mkdirp": "0.x.x", - "ncp": "0.4.x", - "rimraf": "2.x.x" + "async": "0.2.10", + "deep-equal": "1.0.1", + "i": "0.3.6", + "mkdirp": "0.5.1", + "ncp": "0.4.2", + "rimraf": "2.6.3" } }, "uuid": { @@ -5479,8 +5484,8 @@ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "spdx-correct": "3.1.0", + "spdx-expression-parse": "3.0.0" } }, "verror": { @@ -5489,9 +5494,9 @@ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "^1.0.0", + "assert-plus": "1.0.0", "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "extsprintf": "1.3.0" } }, "vow": { @@ -5506,10 +5511,10 @@ "integrity": "sha1-LUxZviLivyYY3fWXq0uqkjvnIA0=", "dev": true, "requires": { - "glob": "^7.0.5", - "uuid": "^2.0.2", - "vow": "^0.4.7", - "vow-queue": "^0.4.1" + "glob": "7.1.4", + "uuid": "2.0.3", + "vow": "0.4.19", + "vow-queue": "0.4.3" }, "dependencies": { "uuid": { @@ -5526,7 +5531,7 @@ "integrity": "sha512-/poAKDTFL3zYbeQg7cl4BGcfP4sGgXKrHnRFSKj97dteUFu8oyXMwIcdwu8NSx/RmPGIuYx1Bik/y5vU4H/VKw==", "dev": true, "requires": { - "vow": "^0.4.17" + "vow": "0.4.19" } }, "w3c-hr-time": { @@ -5535,7 +5540,7 @@ "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", "dev": true, "requires": { - "browser-process-hrtime": "^0.1.2" + "browser-process-hrtime": "0.1.3" } }, "walker": { @@ -5544,7 +5549,7 @@ "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "dev": true, "requires": { - "makeerror": "1.0.x" + "makeerror": "1.0.11" } }, "webidl-conversions": { @@ -5574,9 +5579,9 @@ "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", "dev": true, "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "lodash.sortby": "4.7.0", + "tr46": "1.0.1", + "webidl-conversions": "4.0.2" } }, "which": { @@ -5585,7 +5590,7 @@ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } }, "which-module": { @@ -5600,13 +5605,13 @@ "integrity": "sha1-ZLar9M0Brcrv1QCTk7HY6L7BnbA=", "dev": true, "requires": { - "async": "0.2.x", - "colors": "0.6.x", - "cycle": "1.0.x", - "eyes": "0.1.x", - "isstream": "0.1.x", - "pkginfo": "0.3.x", - "stack-trace": "0.0.x" + "async": "0.2.10", + "colors": "0.6.2", + "cycle": "1.0.3", + "eyes": "0.1.8", + "isstream": "0.1.2", + "pkginfo": "0.3.1", + "stack-trace": "0.0.10" }, "dependencies": { "colors": { @@ -5635,8 +5640,8 @@ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "string-width": "1.0.2", + "strip-ansi": "3.0.1" }, "dependencies": { "ansi-regex": { @@ -5651,7 +5656,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "string-width": { @@ -5660,9 +5665,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "strip-ansi": { @@ -5671,7 +5676,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } } } @@ -5688,9 +5693,9 @@ "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "graceful-fs": "4.2.0", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" } }, "wrr-pool": { @@ -5698,7 +5703,7 @@ "resolved": "https://registry.npmjs.org/wrr-pool/-/wrr-pool-1.1.4.tgz", "integrity": "sha512-+lEdj42HlYqmzhvkZrx6xEymj0wzPBxqr7U1Xh9IWikMzOge03JSQT9YzTGq54SkOh/noViq32UejADZVzrgAg==", "requires": { - "lodash": "^4.17.11" + "lodash": "4.17.11" } }, "ws": { @@ -5707,7 +5712,7 @@ "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", "dev": true, "requires": { - "async-limiter": "~1.0.0" + "async-limiter": "1.0.0" } }, "xml-name-validator": { @@ -5722,7 +5727,7 @@ "integrity": "sha1-LIaIjy1OrehQ+jjKf3Ij9yCVFuE=", "dev": true, "requires": { - "lodash": "^3.5.0" + "lodash": "3.10.1" }, "dependencies": { "lodash": { @@ -5745,18 +5750,18 @@ "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.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 || ^4.0.0", - "yargs-parser": "^11.1.1" + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "3.0.0", + "get-caller-file": "1.0.3", + "os-locale": "3.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "4.0.0", + "yargs-parser": "11.1.1" }, "dependencies": { "require-main-filename": { @@ -5773,8 +5778,8 @@ "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "camelcase": "5.3.1", + "decamelize": "1.2.0" } } } diff --git a/package.json b/package.json index 5938260..05efa44 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "dependencies": { "debug": "^4.1.1", "no-kafka": "^3.4.3", + "percentile": "^1.2.2", "pino": "^5.12.6" }, "devDependencies": { diff --git a/src/aggregator/utils.js b/src/aggregator/utils.js index 24db6ae..d8534e3 100644 --- a/src/aggregator/utils.js +++ b/src/aggregator/utils.js @@ -1,4 +1,5 @@ const { aggregatorTimeout, expectedEmits } = require('../config').getConfig(); +const percentile = require('percentile'); /** * Key = JSON.stringify({ @@ -9,72 +10,75 @@ const { aggregatorTimeout, expectedEmits } = require('../config').getConfig(); const aggregateMap = new Map(); const getAvg = (input) => { + if (!Array.isArray(input)) { + return; + }; + const total = input.reduce((acc, c) => acc + c, 0); return total / input.length; }; -const getMedian = input => { - input.sort((a, b) => a - b); - const lowMiddle = Math.floor((input.length - 1) / 2); - const highMiddle = Math.ceil((input.length - 1) / 2); - return ((input[lowMiddle] + input[highMiddle]) / 2); -}; - -/** - * message = { - * type, - * reqStartTime, - * jobStartTime - * } -*/ -const requestStartedHandler = (message, key) => { - aggregateMap.set(key, message); - setTimeout(() => { - const { - reqStartTime, - jobStartTime, - publishCompletedAt, - numClientsEmittedTo, - emittedAt, - acknowledgedAt, - } = aggregateMap.get(key); +const flush = (key) => { + const { + reqStartTime, + jobStartTime, + publishCompletedAt, + numClientsEmittedTo, + emittedAt, + acknowledgedAt, + } = aggregateMap.get(key); - const queueTime = jobStartTime - reqStartTime; + const queueTime = jobStartTime - reqStartTime; - const isPublished = publishCompletedAt ? true : false; + const isPublished = publishCompletedAt ? true : false; - const publishLatency = publishCompletedAt - jobStartTime; + const publishLatency = publishCompletedAt - jobStartTime; - const avgSubscribeLatency = Array.isArray(emittedAt) ? - getAvg(emittedAt.map(emitTime => emitTime - publishCompletedAt)) : 'N/A'; + const avgSubscribeLatency = Array.isArray(emittedAt) ? + getAvg(emittedAt.map(emitTime => emitTime - publishCompletedAt)) : -1; - const numEmitted = Array.isArray(emittedAt) ? emittedAt.length : 0; + const numEmitted = Array.isArray(emittedAt) ? emittedAt.length : 0; - const isSuccessfullyEmitted = numEmitted === expectedEmits ? true : false; + const isSuccessfullyEmitted = numEmitted === expectedEmits ? true : false; - const numClientsAcknowledged = Array.isArray(acknowledgedAt) ? - acknowledgedAt.length : 0; + const numClientsAcknowledged = Array.isArray(acknowledgedAt) ? + acknowledgedAt.length : 0; - const endToEndLatency = acknowledgedAt.map(acknowledgeTime => - acknowledgeTime - jobStartTime); + const endToEndLatency = acknowledgedAt.map(acknowledgeTime => + acknowledgeTime - jobStartTime); - const avgEndToEndLatency = getAvg(endToEndLatency); - const mediaEndToEndLatency = getMedian(endToEndLatency); + const avgEndToEndLatency = getAvg(endToEndLatency); + const medianEndToEndLatency = percentile(50, endToEndLatency); + const ninetyFifthPercentile = percentile(95, endToEndLatency); - const aggregatedVal = { - queueTime, - publishLatency, - avgSubscribeLatency, - numEmitted, - endToEndLatency, - mediaEndToEndLatency, - isPublished, - isSuccessfullyEmitted, - numClientsAcknowledged, - }; + const aggregatedVal = { + queueTime, + publishLatency, + avgSubscribeLatency, + numEmitted, + avgEndToEndLatency, + medianEndToEndLatency, + ninetyFifthPercentile, + isPublished, + isSuccessfullyEmitted, + numClientsAcknowledged, + }; - logger.info('Key:', key, 'Value:', aggregatedVal); + const parsedKey = JSON.parse(key); + logger.info('Key:', parsedKey, 'Value:', aggregatedVal); +}; +/** + * message = { + * type, + * reqStartTime, + * jobStartTime + * } +*/ +const requestStartedHandler = (message, key) => { + aggregateMap.set(key, message); + setTimeout(() => { + flush(key); }, aggregatorTimeout); }; @@ -85,8 +89,10 @@ const requestStartedHandler = (message, key) => { * } */ const publishedHandler = (message, key) => { - const { publishCompletedAt } = message; - aggregateMap.get(key).publishCompletedAt = publishCompletedAt; + if (aggregateMap.has(key)) { + const { publishCompletedAt } = message; + aggregateMap.get(key).publishCompletedAt = publishCompletedAt; + } }; /** @@ -97,11 +103,13 @@ const publishedHandler = (message, key) => { * } */ const emittedHandler = (message, key) => { - const { emittedAt, numClientsEmittedTo } = message; - const aggregateMapVal = aggregateMap.get(key); - aggregateMapVal.emittedAt = aggregateMapVal.emittedAt ? - aggregateMapVal.emittedAt.push(emittedAt) : [emittedAt]; - aggregateMapVal.numClientsEmittedTo = aggregateMapVal.numClientsEmittedTo + numClientsEmittedTo; + if (aggregateMap.has(key)) { + const { emittedAt, numClientsEmittedTo } = message; + const aggregateMapVal = aggregateMap.get(key); + aggregateMapVal.emittedAt = aggregateMapVal.emittedAt ? + aggregateMapVal.emittedAt.push(emittedAt) : [emittedAt]; + aggregateMapVal.numClientsEmittedTo = aggregateMapVal.numClientsEmittedTo + numClientsEmittedTo; + } }; /** @@ -111,10 +119,12 @@ const emittedHandler = (message, key) => { * } */ const acknowledgedHandler = (message, key) => { - const { acknowledgedAt } = message; - const aggregateMapVal = aggregateMap.get(key); - aggregateMapVal.acknowledgedAt = aggregateMapVal.acknowledgedAt ? - aggregateMapVal.acknowledgedAt.push(acknowledgedAt) : [acknowledgedAt]; + if (aggregateMap.has(key)) { + const { acknowledgedAt } = message; + const aggregateMapVal = aggregateMap.get(key); + aggregateMapVal.acknowledgedAt = aggregateMapVal.acknowledgedAt ? + aggregateMapVal.acknowledgedAt.push(acknowledgedAt) : [acknowledgedAt]; + } }; module.exports = { From bf4421d52d194c849089f3bdd5aa1f3e6ce66839 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Fri, 30 Aug 2019 13:07:07 -0700 Subject: [PATCH 03/29] add end to end tests --- .../unit/aggregator/aggregatorHandler.js | 76 ++++++++++++++++--- __tests__/unit/aggregator/utils.js | 15 +++- src/aggregator/persist.js | 8 ++ src/aggregator/utils.js | 59 ++++++++++---- src/config.js | 3 +- 5 files changed, 129 insertions(+), 32 deletions(-) create mode 100644 src/aggregator/persist.js diff --git a/__tests__/unit/aggregator/aggregatorHandler.js b/__tests__/unit/aggregator/aggregatorHandler.js index 06dd489..1ee226d 100644 --- a/__tests__/unit/aggregator/aggregatorHandler.js +++ b/__tests__/unit/aggregator/aggregatorHandler.js @@ -7,26 +7,78 @@ */ const { aggregationHandler } = require('../../../src/aggregator/aggregatorHandler'); -const utils = require('../../../src/aggregator/utils'); -jest.mock('../../../src/aggregator/utils'); +const persist = require('../../../src/aggregator/persist'); +jest.mock('../../../src/aggregator/persist'); + +jest.useFakeTimers(); describe('test/unit/aggregator/aggregatorHandler.js', () => { - it('Calls the right handler', () => { + it('end-to-end', () => { const key = Buffer.from(JSON.stringify({ updatedAt: new Date().toISOString(), name: 'testSample', })); - const value = Buffer.from(JSON.stringify({ message: - { type: 'requestStarted' }, level: 'level', messageTime: new Date(), })); - const messageSet = [{ message: { value, key } }]; - const requestStartedHandlerMock = jest.spyOn(utils, 'requestStartedHandler'); + const reqStartTime = Date.now(); + const jobStartTime = reqStartTime + 2; + const publishCompletedAt = jobStartTime + 4; + const emittedAt1 = publishCompletedAt + 4; + const emittedAt2 = publishCompletedAt + 6; + const emittedAt3 = publishCompletedAt + 8; + const numClientsEmittedTo = 2; + const acknowledgedAt1 = emittedAt3 + 6; + const acknowledgedAt2 = emittedAt2 + 4; + + const value1 = Buffer.from(JSON.stringify({ message: + { type: 'requestStarted', reqStartTime, jobStartTime }, })); + + const value2 = Buffer.from(JSON.stringify({ message: + { type: 'published', publishCompletedAt }, })); + + const value3 = Buffer.from(JSON.stringify({ message: + { type: 'emitted', emittedAt: emittedAt1 }, })); + + const value4 = Buffer.from(JSON.stringify({ message: + { type: 'emitted', emittedAt: emittedAt2 }, })); + + const value5 = Buffer.from(JSON.stringify({ message: + { type: 'emitted', emittedAt: emittedAt3 }, })); + + const value6 = Buffer.from(JSON.stringify({ message: + { type: 'acknowledged', acknowledgedAt: acknowledgedAt1 }, })); + + const value7 = Buffer.from(JSON.stringify({ message: + { type: 'acknowledged', acknowledgedAt: acknowledgedAt2 }, })); + + const messageSet = []; + + messageSet.push({ message: { value: value1, key } }); + messageSet.push({ message: { value: value2, key } }); + messageSet.push({ message: { value: value3, key } }); + messageSet.push({ message: { value: value4, key } }); + messageSet.push({ message: { value: value5, key } }); + messageSet.push({ message: { value: value6, key } }); + messageSet.push({ message: { value: value7, key } }); + + const result = { + jobStartTime, + queueTime: 2, + publishLatency: 4, + avgSubscribeLatency: 6, + numSubsMissed: 0, + avgEndToEndLatency: 16, + medianEndToEndLatency: 16, + ninetyFifthPercentileEndToEndLatency: 18, + isPublished: true, + isSuccessfullyEmitted: true, + numClientsAcknowledged: 2, + }; + + const persistMock = jest.spyOn(persist, 'persist'); aggregationHandler(messageSet, 'foo', 0); - expect(requestStartedHandlerMock).nthCalledWith(1, - { type: 'requestStarted' }, key.toString() - ); - }); + jest.advanceTimersByTime(40000); + console.log(persistMock); + expect(persistMock).toHaveBeenCalledWith(JSON.parse(key.toString()), result); - it('Logs for existing key', () => { }); }); diff --git a/__tests__/unit/aggregator/utils.js b/__tests__/unit/aggregator/utils.js index ae110d0..efb79b4 100644 --- a/__tests__/unit/aggregator/utils.js +++ b/__tests__/unit/aggregator/utils.js @@ -8,9 +8,18 @@ const { aggregationHandler } = require('../../../src/aggregator/aggregatorHandler'); const utils = require('../../../src/aggregator/utils'); -jest.mock('../../../src/aggregator/utils'); -describe('test/unit/aggregator/aggregatorHandler.js', () => { - it('Calls the right handler', () => { +describe('test/unit/aggregator/utils.js', () => { + it('Happy path: OK', () => { + // utils.requestStartedHandler(); + // utils.publishedHandler(); + // utils.emittedHandler(); + // utils.emittedHandler(); + // utils.emittedHandler(); + + // utils.acknowledgedHandler(); + // utils.acknowledgedHandler(); + // utils.acknowledgedHandler(); + }); }); diff --git a/src/aggregator/persist.js b/src/aggregator/persist.js new file mode 100644 index 0000000..0a655e7 --- /dev/null +++ b/src/aggregator/persist.js @@ -0,0 +1,8 @@ +const persist = (parsedKey, val) => { + logger.info(parsedKey); + logger.info(val); +}; + +module.exports = { + persist, +}; diff --git a/src/aggregator/utils.js b/src/aggregator/utils.js index d8534e3..08ecef5 100644 --- a/src/aggregator/utils.js +++ b/src/aggregator/utils.js @@ -1,5 +1,7 @@ -const { aggregatorTimeout, expectedEmits } = require('../config').getConfig(); +const logger = require('pino')(); const percentile = require('percentile'); +const persist = require('./persist').persist; +const { aggregatorTimeout, expectedEmits } = require('../config').getConfig(); /** * Key = JSON.stringify({ @@ -18,7 +20,18 @@ const getAvg = (input) => { return total / input.length; }; -const flush = (key) => { +const getMedian = (input) => { + if (!Array.isArray(input)) { + return; + }; + + input.sort((a, b) => a - b); + const lowMiddle = Math.floor((input.length - 1) / 2); + const highMiddle = Math.ceil((input.length - 1) / 2); + return ((input[lowMiddle] + input[highMiddle]) / 2); +}; + +const flush = async (key) => { const { reqStartTime, jobStartTime, @@ -37,35 +50,37 @@ const flush = (key) => { const avgSubscribeLatency = Array.isArray(emittedAt) ? getAvg(emittedAt.map(emitTime => emitTime - publishCompletedAt)) : -1; - const numEmitted = Array.isArray(emittedAt) ? emittedAt.length : 0; + const numSubsMissed = Array.isArray(emittedAt) ? expectedEmits - emittedAt.length : expectedEmits; - const isSuccessfullyEmitted = numEmitted === expectedEmits ? true : false; + const isSuccessfullyEmitted = numSubsMissed === 0 ? true : false; const numClientsAcknowledged = Array.isArray(acknowledgedAt) ? acknowledgedAt.length : 0; - const endToEndLatency = acknowledgedAt.map(acknowledgeTime => - acknowledgeTime - jobStartTime); + const endToEndLatency = Array.isArray(acknowledgedAt) ? acknowledgedAt.map(acknowledgeTime => + acknowledgeTime - jobStartTime) : []; const avgEndToEndLatency = getAvg(endToEndLatency); - const medianEndToEndLatency = percentile(50, endToEndLatency); - const ninetyFifthPercentile = percentile(95, endToEndLatency); + const ninetyFifthPercentileEndToEndLatency = percentile(95, endToEndLatency); + const medianEndToEndLatency = getMedian(endToEndLatency); const aggregatedVal = { + jobStartTime, queueTime, publishLatency, avgSubscribeLatency, - numEmitted, + numSubsMissed, avgEndToEndLatency, medianEndToEndLatency, - ninetyFifthPercentile, + ninetyFifthPercentileEndToEndLatency, isPublished, isSuccessfullyEmitted, numClientsAcknowledged, }; const parsedKey = JSON.parse(key); - logger.info('Key:', parsedKey, 'Value:', aggregatedVal); + + persist(parsedKey, aggregatedVal); }; /** @@ -76,7 +91,10 @@ const flush = (key) => { * } */ const requestStartedHandler = (message, key) => { - aggregateMap.set(key, message); + aggregateMap.set(key, { + reqStartTime: message.reqStartTime, + jobStartTime: message.jobStartTime, + }); setTimeout(() => { flush(key); }, aggregatorTimeout); @@ -106,8 +124,12 @@ const emittedHandler = (message, key) => { if (aggregateMap.has(key)) { const { emittedAt, numClientsEmittedTo } = message; const aggregateMapVal = aggregateMap.get(key); - aggregateMapVal.emittedAt = aggregateMapVal.emittedAt ? - aggregateMapVal.emittedAt.push(emittedAt) : [emittedAt]; + if (aggregateMapVal.emittedAt) { + aggregateMapVal.emittedAt.push(emittedAt); + } else { + aggregateMapVal.emittedAt = [emittedAt]; + }; + aggregateMapVal.numClientsEmittedTo = aggregateMapVal.numClientsEmittedTo + numClientsEmittedTo; } }; @@ -122,8 +144,11 @@ const acknowledgedHandler = (message, key) => { if (aggregateMap.has(key)) { const { acknowledgedAt } = message; const aggregateMapVal = aggregateMap.get(key); - aggregateMapVal.acknowledgedAt = aggregateMapVal.acknowledgedAt ? - aggregateMapVal.acknowledgedAt.push(acknowledgedAt) : [acknowledgedAt]; + if (aggregateMapVal.acknowledgedAt) { + aggregateMapVal.acknowledgedAt.push(acknowledgedAt); + } else { + aggregateMapVal.acknowledgedAt = [acknowledgedAt]; + }; } }; @@ -133,4 +158,6 @@ module.exports = { emittedHandler, acknowledgedHandler, aggregateMap, + flush, + persist, }; diff --git a/src/config.js b/src/config.js index d270f71..f6a45d7 100644 --- a/src/config.js +++ b/src/config.js @@ -64,7 +64,7 @@ const herokuConfig = { maxBytes: getMaxBytes(process.env.KAFKA_CONSUMER_MAX_BYTES), idleTimeout: getIdleTimeout(process.env.KAFKA_CONSUMER_IDLE_TIMEOUT), aggregatorTimeout: getAggregatorTimeout(process.env.FLUSH_TO_PERSISTENCE_AFTER), - expectedEmits: process.env.NUM_REALTIME_PROCESSES, + expectedEmits: process.env.NUM_REALTIME_PROCESSES || 3, }; const devConfig = { @@ -78,6 +78,7 @@ const devConfig = { maxBytes: (1024 * 1024), idleTimeout: 1000, aggregatorTimeout: 30000, + expectedEmits: 3, }; const config = { From 9ad0e853cfb209ab2638d36c69e58c6f19a5b99b Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Fri, 30 Aug 2019 14:17:13 -0700 Subject: [PATCH 04/29] complete --- .../unit/aggregator/aggregatorHandler.js | 5 +- __tests__/unit/aggregator/utils.js | 25 --- package-lock.json | 13 ++ package.json | 3 +- src/aggregator/aggregatorHandler.js | 141 ++++++++++++++- src/aggregator/utils.js | 163 ------------------ 6 files changed, 151 insertions(+), 199 deletions(-) delete mode 100644 __tests__/unit/aggregator/utils.js delete mode 100644 src/aggregator/utils.js diff --git a/__tests__/unit/aggregator/aggregatorHandler.js b/__tests__/unit/aggregator/aggregatorHandler.js index 1ee226d..2f3658d 100644 --- a/__tests__/unit/aggregator/aggregatorHandler.js +++ b/__tests__/unit/aggregator/aggregatorHandler.js @@ -8,6 +8,7 @@ const { aggregationHandler } = require('../../../src/aggregator/aggregatorHandler'); const persist = require('../../../src/aggregator/persist'); +const timeout = require('../../../src/config').getConfig().aggregatorTimeout; jest.mock('../../../src/aggregator/persist'); jest.useFakeTimers(); @@ -76,9 +77,7 @@ describe('test/unit/aggregator/aggregatorHandler.js', () => { const persistMock = jest.spyOn(persist, 'persist'); aggregationHandler(messageSet, 'foo', 0); - jest.advanceTimersByTime(40000); - console.log(persistMock); + jest.advanceTimersByTime(timeout); expect(persistMock).toHaveBeenCalledWith(JSON.parse(key.toString()), result); - }); }); diff --git a/__tests__/unit/aggregator/utils.js b/__tests__/unit/aggregator/utils.js deleted file mode 100644 index efb79b4..0000000 --- a/__tests__/unit/aggregator/utils.js +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) 2019, salesforce.com, inc. - * All rights reserved. - * Licensed under the BSD 3-Clause license. - * For full license text, see LICENSE.txt file in the repo root or - * https://opensource.org/licenses/BSD-3-Clause - */ - -const { aggregationHandler } = require('../../../src/aggregator/aggregatorHandler'); -const utils = require('../../../src/aggregator/utils'); - -describe('test/unit/aggregator/utils.js', () => { - it('Happy path: OK', () => { - // utils.requestStartedHandler(); - // utils.publishedHandler(); - // utils.emittedHandler(); - // utils.emittedHandler(); - // utils.emittedHandler(); - - // utils.acknowledgedHandler(); - // utils.acknowledgedHandler(); - // utils.acknowledgedHandler(); - - }); -}); diff --git a/package-lock.json b/package-lock.json index cbbc161..af9a68d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2837,6 +2837,11 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "isnumber": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isnumber/-/isnumber-1.0.0.tgz", + "integrity": "sha1-Dj+XWbWB2Z3YUIbw7Cp0kJz63QE=" + }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", @@ -5108,6 +5113,14 @@ } } }, + "stats-lite": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stats-lite/-/stats-lite-2.2.0.tgz", + "integrity": "sha512-/Kz55rgUIv2KP2MKphwYT/NCuSfAlbbMRv2ZWw7wyXayu230zdtzhxxuXXcvsc6EmmhS8bSJl3uS1wmMHFumbA==", + "requires": { + "isnumber": "1.0.0" + } + }, "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", diff --git a/package.json b/package.json index 05efa44..bb4e044 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,8 @@ "debug": "^4.1.1", "no-kafka": "^3.4.3", "percentile": "^1.2.2", - "pino": "^5.12.6" + "pino": "^5.12.6", + "stats-lite": "^2.2.0" }, "devDependencies": { "jest": "^24.8.0", diff --git a/src/aggregator/aggregatorHandler.js b/src/aggregator/aggregatorHandler.js index e13a9c7..35f5cbf 100644 --- a/src/aggregator/aggregatorHandler.js +++ b/src/aggregator/aggregatorHandler.js @@ -11,12 +11,138 @@ */ const logger = require('pino')(); -const { - requestStartedHandler, - publishedHandler, - emittedHandler, - acknowledgedHandler, -} = require('./utils'); +const stats = require('stats-lite'); +const persist = require('./persist').persist; +const { aggregatorTimeout, expectedEmits } = require('../config').getConfig(); + +/** + * Key = JSON.stringify({ + * updatedAt, + * name, + * }); + */ +const aggregateMap = new Map(); + +const flush = async (key) => { + const { + reqStartTime, + jobStartTime, + publishCompletedAt, + numClientsEmittedTo, + emittedAt, + acknowledgedAt, + } = aggregateMap.get(key); + + const queueTime = jobStartTime - reqStartTime; + + const isPublished = publishCompletedAt ? true : false; + + const publishLatency = publishCompletedAt - jobStartTime; + + const avgSubscribeLatency = Array.isArray(emittedAt) ? + stats.mean(emittedAt.map(emitTime => emitTime - publishCompletedAt)) : null; + + const numSubsMissed = Array.isArray(emittedAt) ? expectedEmits - emittedAt.length : expectedEmits; + + const isSuccessfullyEmitted = numSubsMissed === 0 ? true : false; + + const numClientsAcknowledged = Array.isArray(acknowledgedAt) ? + acknowledgedAt.length : 0; + + const endToEndLatency = Array.isArray(acknowledgedAt) ? acknowledgedAt.map(acknowledgeTime => + acknowledgeTime - jobStartTime) : []; + + const avgEndToEndLatency = stats.mean(endToEndLatency); + const ninetyFifthPercentileEndToEndLatency = stats.percentile(endToEndLatency, 0.95); + const medianEndToEndLatency = stats.median(endToEndLatency); + + const aggregatedVal = { + jobStartTime, + queueTime, + publishLatency, + avgSubscribeLatency, + numSubsMissed, + avgEndToEndLatency, + medianEndToEndLatency, + ninetyFifthPercentileEndToEndLatency, + isPublished, + isSuccessfullyEmitted, + numClientsAcknowledged, + }; + + const parsedKey = JSON.parse(key); + + persist(parsedKey, aggregatedVal); +}; + +/** + * message = { + * type, + * reqStartTime, + * jobStartTime + * } +*/ +const requestStartedHandler = (message, key) => { + aggregateMap.set(key, { + reqStartTime: message.reqStartTime, + jobStartTime: message.jobStartTime, + }); + setTimeout(() => { + flush(key); + }, aggregatorTimeout); +}; + +/** + * message = { + * type, + * publishCompletedAt + * } +*/ +const publishedHandler = (message, key) => { + if (aggregateMap.has(key)) { + const { publishCompletedAt } = message; + aggregateMap.get(key).publishCompletedAt = publishCompletedAt; + } +}; + +/** + * message = { + * type, + * emittedAt, + * numClientsEmittedTo + * } +*/ +const emittedHandler = (message, key) => { + if (aggregateMap.has(key)) { + const { emittedAt, numClientsEmittedTo } = message; + const aggregateMapVal = aggregateMap.get(key); + if (aggregateMapVal.emittedAt) { + aggregateMapVal.emittedAt.push(emittedAt); + } else { + aggregateMapVal.emittedAt = [emittedAt]; + }; + + aggregateMapVal.numClientsEmittedTo = aggregateMapVal.numClientsEmittedTo + numClientsEmittedTo; + } +}; + +/** + * message = { + * type, + * acknowledgedAt + * } +*/ +const acknowledgedHandler = (message, key) => { + if (aggregateMap.has(key)) { + const { acknowledgedAt } = message; + const aggregateMapVal = aggregateMap.get(key); + if (aggregateMapVal.acknowledgedAt) { + aggregateMapVal.acknowledgedAt.push(acknowledgedAt); + } else { + aggregateMapVal.acknowledgedAt = [acknowledgedAt]; + }; + } +}; const messageTypes = { requestStarted: requestStartedHandler, @@ -27,7 +153,8 @@ const messageTypes = { /** * Handler triggered when a message is received on a topic - * Logs out the message received on that topic. + * Triggers the right type of handler among requestStartedHandler, + * publishedHandler, emittedHandler, acknowledgedHandler based of type of message * @param {Array} messageSet - The set of messages that are received on this topic at each time * the handler is triggered * @param {String} topic - The topic in the Kafka Cluster diff --git a/src/aggregator/utils.js b/src/aggregator/utils.js deleted file mode 100644 index 08ecef5..0000000 --- a/src/aggregator/utils.js +++ /dev/null @@ -1,163 +0,0 @@ -const logger = require('pino')(); -const percentile = require('percentile'); -const persist = require('./persist').persist; -const { aggregatorTimeout, expectedEmits } = require('../config').getConfig(); - -/** - * Key = JSON.stringify({ - * updatedAt, - * name, - * }); - */ -const aggregateMap = new Map(); - -const getAvg = (input) => { - if (!Array.isArray(input)) { - return; - }; - - const total = input.reduce((acc, c) => acc + c, 0); - return total / input.length; -}; - -const getMedian = (input) => { - if (!Array.isArray(input)) { - return; - }; - - input.sort((a, b) => a - b); - const lowMiddle = Math.floor((input.length - 1) / 2); - const highMiddle = Math.ceil((input.length - 1) / 2); - return ((input[lowMiddle] + input[highMiddle]) / 2); -}; - -const flush = async (key) => { - const { - reqStartTime, - jobStartTime, - publishCompletedAt, - numClientsEmittedTo, - emittedAt, - acknowledgedAt, - } = aggregateMap.get(key); - - const queueTime = jobStartTime - reqStartTime; - - const isPublished = publishCompletedAt ? true : false; - - const publishLatency = publishCompletedAt - jobStartTime; - - const avgSubscribeLatency = Array.isArray(emittedAt) ? - getAvg(emittedAt.map(emitTime => emitTime - publishCompletedAt)) : -1; - - const numSubsMissed = Array.isArray(emittedAt) ? expectedEmits - emittedAt.length : expectedEmits; - - const isSuccessfullyEmitted = numSubsMissed === 0 ? true : false; - - const numClientsAcknowledged = Array.isArray(acknowledgedAt) ? - acknowledgedAt.length : 0; - - const endToEndLatency = Array.isArray(acknowledgedAt) ? acknowledgedAt.map(acknowledgeTime => - acknowledgeTime - jobStartTime) : []; - - const avgEndToEndLatency = getAvg(endToEndLatency); - const ninetyFifthPercentileEndToEndLatency = percentile(95, endToEndLatency); - const medianEndToEndLatency = getMedian(endToEndLatency); - - const aggregatedVal = { - jobStartTime, - queueTime, - publishLatency, - avgSubscribeLatency, - numSubsMissed, - avgEndToEndLatency, - medianEndToEndLatency, - ninetyFifthPercentileEndToEndLatency, - isPublished, - isSuccessfullyEmitted, - numClientsAcknowledged, - }; - - const parsedKey = JSON.parse(key); - - persist(parsedKey, aggregatedVal); -}; - -/** - * message = { - * type, - * reqStartTime, - * jobStartTime - * } -*/ -const requestStartedHandler = (message, key) => { - aggregateMap.set(key, { - reqStartTime: message.reqStartTime, - jobStartTime: message.jobStartTime, - }); - setTimeout(() => { - flush(key); - }, aggregatorTimeout); -}; - -/** - * message = { - * type, - * publishCompletedAt - * } -*/ -const publishedHandler = (message, key) => { - if (aggregateMap.has(key)) { - const { publishCompletedAt } = message; - aggregateMap.get(key).publishCompletedAt = publishCompletedAt; - } -}; - -/** - * message = { - * type, - * emittedAt, - * numClientsEmittedTo - * } -*/ -const emittedHandler = (message, key) => { - if (aggregateMap.has(key)) { - const { emittedAt, numClientsEmittedTo } = message; - const aggregateMapVal = aggregateMap.get(key); - if (aggregateMapVal.emittedAt) { - aggregateMapVal.emittedAt.push(emittedAt); - } else { - aggregateMapVal.emittedAt = [emittedAt]; - }; - - aggregateMapVal.numClientsEmittedTo = aggregateMapVal.numClientsEmittedTo + numClientsEmittedTo; - } -}; - -/** - * message = { - * type, - * acknowledgedAt - * } -*/ -const acknowledgedHandler = (message, key) => { - if (aggregateMap.has(key)) { - const { acknowledgedAt } = message; - const aggregateMapVal = aggregateMap.get(key); - if (aggregateMapVal.acknowledgedAt) { - aggregateMapVal.acknowledgedAt.push(acknowledgedAt); - } else { - aggregateMapVal.acknowledgedAt = [acknowledgedAt]; - }; - } -}; - -module.exports = { - requestStartedHandler, - publishedHandler, - emittedHandler, - acknowledgedHandler, - aggregateMap, - flush, - persist, -}; From 78eae443923e06ed753f95f428692bcd739e65f3 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Fri, 30 Aug 2019 14:19:41 -0700 Subject: [PATCH 05/29] fix lib --- package-lock.json | 1742 +++++++++++++++++++++------------------------ package.json | 1 - 2 files changed, 804 insertions(+), 939 deletions(-) diff --git a/package-lock.json b/package-lock.json index af9a68d..2976210 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,49 +5,40 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "dev": true, "requires": { - "@babel/highlight": "7.0.0" + "@babel/highlight": "7.5.0" } }, "@babel/core": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz", - "integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", "dev": true, "requires": { - "@babel/code-frame": "7.0.0", - "@babel/generator": "7.4.4", - "@babel/helpers": "7.4.4", - "@babel/parser": "7.4.5", + "@babel/code-frame": "7.5.5", + "@babel/generator": "7.5.5", + "@babel/helpers": "7.5.5", + "@babel/parser": "7.5.5", "@babel/template": "7.4.4", - "@babel/traverse": "7.4.5", - "@babel/types": "7.4.4", + "@babel/traverse": "7.5.5", + "@babel/types": "7.5.5", "convert-source-map": "1.6.0", "debug": "4.1.1", "json5": "2.1.0", - "lodash": "4.17.11", - "resolve": "1.11.1", - "semver": "5.7.0", + "lodash": "4.17.15", + "resolve": "1.12.0", + "semver": "5.7.1", "source-map": "0.5.7" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "source-map": { @@ -59,18 +50,24 @@ } }, "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", "dev": true, "requires": { - "@babel/types": "7.4.4", + "@babel/types": "7.5.5", "jsesc": "2.5.2", - "lodash": "4.17.11", + "lodash": "4.17.15", "source-map": "0.5.7", "trim-right": "1.0.1" }, "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -87,7 +84,7 @@ "requires": { "@babel/helper-get-function-arity": "7.0.0", "@babel/template": "7.4.4", - "@babel/types": "7.4.4" + "@babel/types": "7.5.5" } }, "@babel/helper-get-function-arity": { @@ -96,7 +93,7 @@ "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", "dev": true, "requires": { - "@babel/types": "7.4.4" + "@babel/types": "7.5.5" } }, "@babel/helper-plugin-utils": { @@ -111,35 +108,35 @@ "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", "dev": true, "requires": { - "@babel/types": "7.4.4" + "@babel/types": "7.5.5" } }, "@babel/helpers": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", - "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", "dev": true, "requires": { "@babel/template": "7.4.4", - "@babel/traverse": "7.4.5", - "@babel/types": "7.4.4" + "@babel/traverse": "7.5.5", + "@babel/types": "7.5.5" } }, "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", "dev": true, "requires": { "chalk": "2.4.2", - "esutils": "2.0.2", + "esutils": "2.0.3", "js-tokens": "4.0.0" } }, "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", "dev": true }, "@babel/plugin-syntax-object-rest-spread": { @@ -157,54 +154,53 @@ "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", "dev": true, "requires": { - "@babel/code-frame": "7.0.0", - "@babel/parser": "7.4.5", - "@babel/types": "7.4.4" + "@babel/code-frame": "7.5.5", + "@babel/parser": "7.5.5", + "@babel/types": "7.5.5" } }, "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", "dev": true, "requires": { - "@babel/code-frame": "7.0.0", - "@babel/generator": "7.4.4", + "@babel/code-frame": "7.5.5", + "@babel/generator": "7.5.5", "@babel/helper-function-name": "7.1.0", "@babel/helper-split-export-declaration": "7.4.4", - "@babel/parser": "7.4.5", - "@babel/types": "7.4.4", + "@babel/parser": "7.5.5", + "@babel/types": "7.5.5", "debug": "4.1.1", "globals": "11.12.0", - "lodash": "4.17.11" + "lodash": "4.17.15" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true } } }, "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", "dev": true, "requires": { - "esutils": "2.0.2", - "lodash": "4.17.11", + "esutils": "2.0.3", + "lodash": "4.17.15", "to-fast-properties": "2.0.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + } } }, "@cnakazawa/watch": { @@ -218,84 +214,85 @@ } }, "@jest/console": { - "version": "24.7.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz", - "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", "dev": true, "requires": { - "@jest/source-map": "24.3.0", + "@jest/source-map": "24.9.0", "chalk": "2.4.2", "slash": "2.0.0" } }, "@jest/core": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.8.0.tgz", - "integrity": "sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", + "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", "dev": true, "requires": { - "@jest/console": "24.7.1", - "@jest/reporters": "24.8.0", - "@jest/test-result": "24.8.0", - "@jest/transform": "24.8.0", - "@jest/types": "24.8.0", + "@jest/console": "24.9.0", + "@jest/reporters": "24.9.0", + "@jest/test-result": "24.9.0", + "@jest/transform": "24.9.0", + "@jest/types": "24.9.0", "ansi-escapes": "3.2.0", "chalk": "2.4.2", "exit": "0.1.2", - "graceful-fs": "4.2.0", - "jest-changed-files": "24.8.0", - "jest-config": "24.8.0", - "jest-haste-map": "24.8.1", - "jest-message-util": "24.8.0", - "jest-regex-util": "24.3.0", - "jest-resolve-dependencies": "24.8.0", - "jest-runner": "24.8.0", - "jest-runtime": "24.8.0", - "jest-snapshot": "24.8.0", - "jest-util": "24.8.0", - "jest-validate": "24.8.0", - "jest-watcher": "24.8.0", + "graceful-fs": "4.2.2", + "jest-changed-files": "24.9.0", + "jest-config": "24.9.0", + "jest-haste-map": "24.9.0", + "jest-message-util": "24.9.0", + "jest-regex-util": "24.9.0", + "jest-resolve": "24.9.0", + "jest-resolve-dependencies": "24.9.0", + "jest-runner": "24.9.0", + "jest-runtime": "24.9.0", + "jest-snapshot": "24.9.0", + "jest-util": "24.9.0", + "jest-validate": "24.9.0", + "jest-watcher": "24.9.0", "micromatch": "3.1.10", "p-each-series": "1.0.0", - "pirates": "4.0.1", "realpath-native": "1.1.0", - "rimraf": "2.6.3", + "rimraf": "2.7.1", + "slash": "2.0.0", "strip-ansi": "5.2.0" } }, "@jest/environment": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.8.0.tgz", - "integrity": "sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", + "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", "dev": true, "requires": { - "@jest/fake-timers": "24.8.0", - "@jest/transform": "24.8.0", - "@jest/types": "24.8.0", - "jest-mock": "24.8.0" + "@jest/fake-timers": "24.9.0", + "@jest/transform": "24.9.0", + "@jest/types": "24.9.0", + "jest-mock": "24.9.0" } }, "@jest/fake-timers": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.8.0.tgz", - "integrity": "sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", "dev": true, "requires": { - "@jest/types": "24.8.0", - "jest-message-util": "24.8.0", - "jest-mock": "24.8.0" + "@jest/types": "24.9.0", + "jest-message-util": "24.9.0", + "jest-mock": "24.9.0" } }, "@jest/reporters": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.8.0.tgz", - "integrity": "sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", + "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", "dev": true, "requires": { - "@jest/environment": "24.8.0", - "@jest/test-result": "24.8.0", - "@jest/transform": "24.8.0", - "@jest/types": "24.8.0", + "@jest/environment": "24.9.0", + "@jest/test-result": "24.9.0", + "@jest/transform": "24.9.0", + "@jest/types": "24.9.0", "chalk": "2.4.2", "exit": "0.1.2", "glob": "7.1.4", @@ -304,68 +301,69 @@ "istanbul-lib-report": "2.0.8", "istanbul-lib-source-maps": "3.0.6", "istanbul-reports": "2.2.6", - "jest-haste-map": "24.8.1", - "jest-resolve": "24.8.0", - "jest-runtime": "24.8.0", - "jest-util": "24.8.0", - "jest-worker": "24.6.0", - "node-notifier": "5.4.0", + "jest-haste-map": "24.9.0", + "jest-resolve": "24.9.0", + "jest-runtime": "24.9.0", + "jest-util": "24.9.0", + "jest-worker": "24.9.0", + "node-notifier": "5.4.3", "slash": "2.0.0", "source-map": "0.6.1", "string-length": "2.0.0" } }, "@jest/source-map": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", - "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", "dev": true, "requires": { "callsites": "3.1.0", - "graceful-fs": "4.2.0", + "graceful-fs": "4.2.2", "source-map": "0.6.1" } }, "@jest/test-result": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.8.0.tgz", - "integrity": "sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", "dev": true, "requires": { - "@jest/console": "24.7.1", - "@jest/types": "24.8.0", + "@jest/console": "24.9.0", + "@jest/types": "24.9.0", "@types/istanbul-lib-coverage": "2.0.1" } }, "@jest/test-sequencer": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz", - "integrity": "sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", + "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", "dev": true, "requires": { - "@jest/test-result": "24.8.0", - "jest-haste-map": "24.8.1", - "jest-runner": "24.8.0", - "jest-runtime": "24.8.0" + "@jest/test-result": "24.9.0", + "jest-haste-map": "24.9.0", + "jest-runner": "24.9.0", + "jest-runtime": "24.9.0" } }, "@jest/transform": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.8.0.tgz", - "integrity": "sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", "dev": true, "requires": { - "@babel/core": "7.4.5", - "@jest/types": "24.8.0", - "babel-plugin-istanbul": "5.1.4", + "@babel/core": "7.5.5", + "@jest/types": "24.9.0", + "babel-plugin-istanbul": "5.2.0", "chalk": "2.4.2", "convert-source-map": "1.6.0", "fast-json-stable-stringify": "2.0.0", - "graceful-fs": "4.2.0", - "jest-haste-map": "24.8.1", - "jest-regex-util": "24.3.0", - "jest-util": "24.8.0", + "graceful-fs": "4.2.2", + "jest-haste-map": "24.9.0", + "jest-regex-util": "24.9.0", + "jest-util": "24.9.0", "micromatch": "3.1.10", + "pirates": "4.0.1", "realpath-native": "1.1.0", "slash": "2.0.0", "source-map": "0.6.1", @@ -373,14 +371,14 @@ } }, "@jest/types": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz", - "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "2.0.1", "@types/istanbul-reports": "1.1.1", - "@types/yargs": "12.0.12" + "@types/yargs": "13.0.2" } }, "@types/babel__core": { @@ -389,8 +387,8 @@ "integrity": "sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg==", "dev": true, "requires": { - "@babel/parser": "7.4.5", - "@babel/types": "7.4.4", + "@babel/parser": "7.5.5", + "@babel/types": "7.5.5", "@types/babel__generator": "7.0.2", "@types/babel__template": "7.0.2", "@types/babel__traverse": "7.0.7" @@ -402,7 +400,7 @@ "integrity": "sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ==", "dev": true, "requires": { - "@babel/types": "7.4.4" + "@babel/types": "7.5.5" } }, "@types/babel__template": { @@ -411,8 +409,8 @@ "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", "dev": true, "requires": { - "@babel/parser": "7.4.5", - "@babel/types": "7.4.4" + "@babel/parser": "7.5.5", + "@babel/types": "7.5.5" } }, "@types/babel__traverse": { @@ -421,7 +419,7 @@ "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", "dev": true, "requires": { - "@babel/types": "7.4.4" + "@babel/types": "7.5.5" } }, "@types/bluebird": { @@ -455,9 +453,9 @@ } }, "@types/lodash": { - "version": "4.14.135", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.135.tgz", - "integrity": "sha512-Ed+tSZ9qM1oYpi5kzdsBuOzcAIn1wDW+e8TFJ50IMJMlSopGdJgKAbhHzN6h1E1OfjlGOr2JepzEWtg9NIfoNg==" + "version": "4.14.138", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.138.tgz", + "integrity": "sha512-A4uJgHz4hakwNBdHNPdxOTkYmXNgmUAKLbXZ7PKGslgeV0Mb8P3BlbYfPovExek1qnod4pDfRbxuzcVs3dlFLg==" }, "@types/stack-utils": { "version": "1.0.1", @@ -466,9 +464,18 @@ "dev": true }, "@types/yargs": { - "version": "12.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", - "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.2.tgz", + "integrity": "sha512-lwwgizwk/bIIU+3ELORkyuOgDjCh7zuWDFqRtPPhhVgq9N1F7CvLNKg1TX4f2duwtKQ0p044Au9r1PLIXHrIzQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "13.0.0" + } + }, + "@types/yargs-parser": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-wBlsw+8n21e6eTd4yVv8YD/E3xq0O6nNnJIquutAsFGE7EyMKz7W6RNT6BRu1SmdgmlCZ9tb0X+j+D6HGr8pZw==", "dev": true }, "JSV": { @@ -478,9 +485,9 @@ "dev": true }, "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.1.tgz", + "integrity": "sha512-1zSbbCuoIjafKZ3mblY5ikvAb0ODUbqBnFuUb7f6uLeQhhGJ0vEV4ntmtxKLT2WgXCO94E07BjunsIw1jOMPZw==", "dev": true }, "acorn": { @@ -490,33 +497,33 @@ "dev": true }, "acorn-globals": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", - "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.3.tgz", + "integrity": "sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ==", "dev": true, "requires": { - "acorn": "6.1.1", - "acorn-walk": "6.1.1" + "acorn": "6.3.0", + "acorn-walk": "6.2.0" }, "dependencies": { "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", + "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", "dev": true } } }, "acorn-walk": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", - "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "dev": true }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "dev": true, "requires": { "fast-deep-equal": "2.0.1", @@ -629,9 +636,9 @@ "dev": true }, "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", "dev": true }, "asynckit": { @@ -659,48 +666,49 @@ "dev": true }, "babel-jest": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.8.0.tgz", - "integrity": "sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", "dev": true, "requires": { - "@jest/transform": "24.8.0", - "@jest/types": "24.8.0", + "@jest/transform": "24.9.0", + "@jest/types": "24.9.0", "@types/babel__core": "7.1.2", - "babel-plugin-istanbul": "5.1.4", - "babel-preset-jest": "24.6.0", + "babel-plugin-istanbul": "5.2.0", + "babel-preset-jest": "24.9.0", "chalk": "2.4.2", "slash": "2.0.0" } }, "babel-plugin-istanbul": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz", - "integrity": "sha512-dySz4VJMH+dpndj0wjJ8JPs/7i1TdSPb1nRrn56/92pKOF9VKC1FMFJmMXjzlGGusnCAqujP6PBCiKq0sVA+YQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", "dev": true, "requires": { + "@babel/helper-plugin-utils": "7.0.0", "find-up": "3.0.0", "istanbul-lib-instrument": "3.3.0", "test-exclude": "5.2.3" } }, "babel-plugin-jest-hoist": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz", - "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", "dev": true, "requires": { "@types/babel__traverse": "7.0.7" } }, "babel-preset-jest": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", - "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", "dev": true, "requires": { "@babel/plugin-syntax-object-rest-spread": "7.2.0", - "babel-plugin-jest-hoist": "24.6.0" + "babel-plugin-jest-hoist": "24.9.0" } }, "babel-runtime": { @@ -980,31 +988,14 @@ } }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } + "string-width": "3.1.0", + "strip-ansi": "5.2.0", + "wrap-ansi": "5.1.0" } }, "co": { @@ -1013,12 +1004,6 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -1073,6 +1058,32 @@ "dev": true, "requires": { "readable-stream": "2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + } } }, "component-emitter": { @@ -1127,24 +1138,24 @@ "requires": { "nice-try": "1.0.5", "path-key": "2.0.1", - "semver": "5.7.0", + "semver": "5.7.1", "shebang-command": "1.2.0", "which": "1.3.1" } }, "cssom": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", - "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, "cssstyle": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", - "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", "dev": true, "requires": { - "cssom": "0.3.6" + "cssom": "0.3.8" } }, "cst": { @@ -1196,7 +1207,7 @@ "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", "dev": true, "requires": { - "abab": "2.0.0", + "abab": "2.0.1", "whatwg-mimetype": "2.3.0", "whatwg-url": "7.0.0" }, @@ -1220,13 +1231,6 @@ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "decamelize": { @@ -1242,10 +1246,18 @@ "dev": true }, "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz", + "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==", + "dev": true, + "requires": { + "is-arguments": "1.0.4", + "is-date-object": "1.0.1", + "is-regex": "1.0.4", + "object-is": "1.0.1", + "object-keys": "1.1.1", + "regexp.prototype.flags": "1.2.0" + } }, "deep-is": { "version": "0.1.3", @@ -1316,25 +1328,31 @@ "dev": true }, "diff-sequences": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz", - "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", + "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", "dev": true }, "dom-serializer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.1.tgz", + "integrity": "sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==", "dev": true, "requires": { - "domelementtype": "1.3.1", - "entities": "1.1.2" + "domelementtype": "2.0.1", + "entities": "2.0.0" }, "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + }, "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", "dev": true } } @@ -1369,7 +1387,7 @@ "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "dev": true, "requires": { - "dom-serializer": "0.1.1", + "dom-serializer": "0.2.1", "domelementtype": "1.3.1" } }, @@ -1383,6 +1401,12 @@ "safer-buffer": "2.1.2" } }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -1439,14 +1463,14 @@ "dev": true }, "escodegen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", - "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", "dev": true, "requires": { "esprima": "3.1.3", - "estraverse": "4.2.0", - "esutils": "2.0.2", + "estraverse": "4.3.0", + "esutils": "2.0.3", "optionator": "0.8.2", "source-map": "0.6.1" } @@ -1458,15 +1482,15 @@ "dev": true }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "exec-sh": { @@ -1537,21 +1561,27 @@ "requires": { "is-extendable": "0.1.1" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, "expect": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.8.0.tgz", - "integrity": "sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", + "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", "dev": true, "requires": { - "@jest/types": "24.8.0", + "@jest/types": "24.9.0", "ansi-styles": "3.2.1", - "jest-get-type": "24.8.0", - "jest-matcher-utils": "24.8.0", - "jest-message-util": "24.8.0", - "jest-regex-util": "24.3.0" + "jest-get-type": "24.9.0", + "jest-matcher-utils": "24.9.0", + "jest-message-util": "24.9.0", + "jest-regex-util": "24.9.0" } }, "extend": { @@ -1790,8 +1820,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -1805,23 +1834,21 @@ "dev": true, "optional": true, "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "delegates": "1.0.0", + "readable-stream": "2.3.6" } }, "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -1834,20 +1861,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -1861,7 +1885,7 @@ "dev": true, "optional": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.1" } }, "deep-extend": { @@ -1888,7 +1912,7 @@ "dev": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "2.3.5" } }, "fs.realpath": { @@ -1903,14 +1927,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.3" } }, "glob": { @@ -1919,12 +1943,12 @@ "dev": true, "optional": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "has-unicode": { @@ -1939,7 +1963,7 @@ "dev": true, "optional": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": "2.1.2" } }, "ignore-walk": { @@ -1948,7 +1972,7 @@ "dev": true, "optional": true, "requires": { - "minimatch": "^3.0.4" + "minimatch": "3.0.4" } }, "inflight": { @@ -1957,15 +1981,14 @@ "dev": true, "optional": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -1977,9 +2000,8 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "isarray": { @@ -1992,25 +2014,22 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, - "optional": true, "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "safe-buffer": "5.1.2", + "yallist": "3.0.3" } }, "minizlib": { @@ -2019,14 +2038,13 @@ "dev": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "2.3.5" } }, "mkdirp": { "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -2043,9 +2061,9 @@ "dev": true, "optional": true, "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" + "debug": "4.1.1", + "iconv-lite": "0.4.24", + "sax": "1.2.4" } }, "node-pre-gyp": { @@ -2054,16 +2072,16 @@ "dev": true, "optional": true, "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" + "detect-libc": "1.0.3", + "mkdirp": "0.5.1", + "needle": "2.3.0", + "nopt": "4.0.1", + "npm-packlist": "1.4.1", + "npmlog": "4.1.2", + "rc": "1.2.8", + "rimraf": "2.6.3", + "semver": "5.7.0", + "tar": "4.4.8" } }, "nopt": { @@ -2072,8 +2090,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "1.1.1", + "osenv": "0.1.5" } }, "npm-bundled": { @@ -2088,8 +2106,8 @@ "dev": true, "optional": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.6" } }, "npmlog": { @@ -2098,17 +2116,16 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "1.1.5", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" } }, "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -2120,9 +2137,8 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "os-homedir": { @@ -2143,8 +2159,8 @@ "dev": true, "optional": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" } }, "path-is-absolute": { @@ -2165,10 +2181,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "deep-extend": "0.6.0", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" }, "dependencies": { "minimist": { @@ -2185,13 +2201,13 @@ "dev": true, "optional": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "rimraf": { @@ -2200,14 +2216,13 @@ "dev": true, "optional": true, "requires": { - "glob": "^7.1.3" + "glob": "7.1.3" } }, "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -2243,11 +2258,10 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "string_decoder": { @@ -2256,16 +2270,15 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } }, "strip-ansi": { "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-json-comments": { @@ -2280,13 +2293,13 @@ "dev": true, "optional": true, "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" + "chownr": "1.1.1", + "fs-minipass": "1.2.5", + "minipass": "2.3.5", + "minizlib": "1.2.1", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.2", + "yallist": "3.0.3" } }, "util-deprecate": { @@ -2301,20 +2314,18 @@ "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2 || 2" + "string-width": "1.0.2" } }, "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -2325,9 +2336,9 @@ "dev": true }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-stream": { @@ -2375,9 +2386,9 @@ "dev": true }, "graceful-fs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", - "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", "dev": true }, "graceful-readlink": { @@ -2416,7 +2427,7 @@ "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "6.10.0", + "ajv": "6.10.2", "har-schema": "2.0.0" } }, @@ -2506,9 +2517,9 @@ } }, "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", "dev": true }, "html-encoding-sniffer": { @@ -2531,32 +2542,6 @@ "domutils": "1.5.1", "entities": "1.0.0", "readable-stream": "1.1.14" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.4", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } } }, "http-signature": { @@ -2632,12 +2617,6 @@ "loose-envify": "1.4.0" } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -2658,6 +2637,12 @@ } } }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -2866,19 +2851,19 @@ "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", "dev": true, "requires": { - "@babel/generator": "7.4.4", - "@babel/parser": "7.4.5", + "@babel/generator": "7.5.5", + "@babel/parser": "7.5.5", "@babel/template": "7.4.4", - "@babel/traverse": "7.4.5", - "@babel/types": "7.4.4", + "@babel/traverse": "7.5.5", + "@babel/types": "7.5.5", "istanbul-lib-coverage": "2.0.5", - "semver": "6.1.2" + "semver": "6.3.0" }, "dependencies": { "semver": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.2.tgz", - "integrity": "sha512-z4PqiCpomGtWj8633oeAdXm1Kn1W++3T8epkZYnwiVgIYIJ0QHszhInYSJTYxebByQH7KVCEAn8R9duzZW2PhQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -2914,25 +2899,8 @@ "debug": "4.1.1", "istanbul-lib-coverage": "2.0.5", "make-dir": "2.1.0", - "rimraf": "2.6.3", + "rimraf": "2.7.1", "source-map": "0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "istanbul-reports": { @@ -2945,215 +2913,216 @@ } }, "jest": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.8.0.tgz", - "integrity": "sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", + "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", "dev": true, "requires": { "import-local": "2.0.0", - "jest-cli": "24.8.0" + "jest-cli": "24.9.0" }, "dependencies": { "jest-cli": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.8.0.tgz", - "integrity": "sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", + "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", "dev": true, "requires": { - "@jest/core": "24.8.0", - "@jest/test-result": "24.8.0", - "@jest/types": "24.8.0", + "@jest/core": "24.9.0", + "@jest/test-result": "24.9.0", + "@jest/types": "24.9.0", "chalk": "2.4.2", "exit": "0.1.2", "import-local": "2.0.0", "is-ci": "2.0.0", - "jest-config": "24.8.0", - "jest-util": "24.8.0", - "jest-validate": "24.8.0", - "prompts": "2.1.0", + "jest-config": "24.9.0", + "jest-util": "24.9.0", + "jest-validate": "24.9.0", + "prompts": "2.2.1", "realpath-native": "1.1.0", - "yargs": "12.0.5" + "yargs": "13.3.0" } } } }, "jest-changed-files": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.8.0.tgz", - "integrity": "sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", "dev": true, "requires": { - "@jest/types": "24.8.0", + "@jest/types": "24.9.0", "execa": "1.0.0", "throat": "4.1.0" } }, "jest-config": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.8.0.tgz", - "integrity": "sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", + "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", "dev": true, "requires": { - "@babel/core": "7.4.5", - "@jest/test-sequencer": "24.8.0", - "@jest/types": "24.8.0", - "babel-jest": "24.8.0", + "@babel/core": "7.5.5", + "@jest/test-sequencer": "24.9.0", + "@jest/types": "24.9.0", + "babel-jest": "24.9.0", "chalk": "2.4.2", "glob": "7.1.4", - "jest-environment-jsdom": "24.8.0", - "jest-environment-node": "24.8.0", - "jest-get-type": "24.8.0", - "jest-jasmine2": "24.8.0", - "jest-regex-util": "24.3.0", - "jest-resolve": "24.8.0", - "jest-util": "24.8.0", - "jest-validate": "24.8.0", + "jest-environment-jsdom": "24.9.0", + "jest-environment-node": "24.9.0", + "jest-get-type": "24.9.0", + "jest-jasmine2": "24.9.0", + "jest-regex-util": "24.9.0", + "jest-resolve": "24.9.0", + "jest-util": "24.9.0", + "jest-validate": "24.9.0", "micromatch": "3.1.10", - "pretty-format": "24.8.0", + "pretty-format": "24.9.0", "realpath-native": "1.1.0" } }, "jest-diff": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.8.0.tgz", - "integrity": "sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", + "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", "dev": true, "requires": { "chalk": "2.4.2", - "diff-sequences": "24.3.0", - "jest-get-type": "24.8.0", - "pretty-format": "24.8.0" + "diff-sequences": "24.9.0", + "jest-get-type": "24.9.0", + "pretty-format": "24.9.0" } }, "jest-docblock": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz", - "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", + "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", "dev": true, "requires": { "detect-newline": "2.1.0" } }, "jest-each": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.8.0.tgz", - "integrity": "sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", + "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", "dev": true, "requires": { - "@jest/types": "24.8.0", + "@jest/types": "24.9.0", "chalk": "2.4.2", - "jest-get-type": "24.8.0", - "jest-util": "24.8.0", - "pretty-format": "24.8.0" + "jest-get-type": "24.9.0", + "jest-util": "24.9.0", + "pretty-format": "24.9.0" } }, "jest-environment-jsdom": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz", - "integrity": "sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", + "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", "dev": true, "requires": { - "@jest/environment": "24.8.0", - "@jest/fake-timers": "24.8.0", - "@jest/types": "24.8.0", - "jest-mock": "24.8.0", - "jest-util": "24.8.0", + "@jest/environment": "24.9.0", + "@jest/fake-timers": "24.9.0", + "@jest/types": "24.9.0", + "jest-mock": "24.9.0", + "jest-util": "24.9.0", "jsdom": "11.12.0" } }, "jest-environment-node": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.8.0.tgz", - "integrity": "sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", + "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", "dev": true, "requires": { - "@jest/environment": "24.8.0", - "@jest/fake-timers": "24.8.0", - "@jest/types": "24.8.0", - "jest-mock": "24.8.0", - "jest-util": "24.8.0" + "@jest/environment": "24.9.0", + "@jest/fake-timers": "24.9.0", + "@jest/types": "24.9.0", + "jest-mock": "24.9.0", + "jest-util": "24.9.0" } }, "jest-get-type": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.8.0.tgz", - "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", "dev": true }, "jest-haste-map": { - "version": "24.8.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.1.tgz", - "integrity": "sha512-SwaxMGVdAZk3ernAx2Uv2sorA7jm3Kx+lR0grp6rMmnY06Kn/urtKx1LPN2mGTea4fCT38impYT28FfcLUhX0g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", "dev": true, "requires": { - "@jest/types": "24.8.0", + "@jest/types": "24.9.0", "anymatch": "2.0.0", "fb-watchman": "2.0.0", "fsevents": "1.2.9", - "graceful-fs": "4.2.0", + "graceful-fs": "4.2.2", "invariant": "2.2.4", - "jest-serializer": "24.4.0", - "jest-util": "24.8.0", - "jest-worker": "24.6.0", + "jest-serializer": "24.9.0", + "jest-util": "24.9.0", + "jest-worker": "24.9.0", "micromatch": "3.1.10", "sane": "4.1.0", "walker": "1.0.7" } }, "jest-jasmine2": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz", - "integrity": "sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", + "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", "dev": true, "requires": { - "@babel/traverse": "7.4.5", - "@jest/environment": "24.8.0", - "@jest/test-result": "24.8.0", - "@jest/types": "24.8.0", + "@babel/traverse": "7.5.5", + "@jest/environment": "24.9.0", + "@jest/test-result": "24.9.0", + "@jest/types": "24.9.0", "chalk": "2.4.2", "co": "4.6.0", - "expect": "24.8.0", + "expect": "24.9.0", "is-generator-fn": "2.1.0", - "jest-each": "24.8.0", - "jest-matcher-utils": "24.8.0", - "jest-message-util": "24.8.0", - "jest-runtime": "24.8.0", - "jest-snapshot": "24.8.0", - "jest-util": "24.8.0", - "pretty-format": "24.8.0", + "jest-each": "24.9.0", + "jest-matcher-utils": "24.9.0", + "jest-message-util": "24.9.0", + "jest-runtime": "24.9.0", + "jest-snapshot": "24.9.0", + "jest-util": "24.9.0", + "pretty-format": "24.9.0", "throat": "4.1.0" } }, "jest-leak-detector": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz", - "integrity": "sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", + "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", "dev": true, "requires": { - "pretty-format": "24.8.0" + "jest-get-type": "24.9.0", + "pretty-format": "24.9.0" } }, "jest-matcher-utils": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz", - "integrity": "sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", + "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", "dev": true, "requires": { "chalk": "2.4.2", - "jest-diff": "24.8.0", - "jest-get-type": "24.8.0", - "pretty-format": "24.8.0" + "jest-diff": "24.9.0", + "jest-get-type": "24.9.0", + "pretty-format": "24.9.0" } }, "jest-message-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz", - "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", "dev": true, "requires": { - "@babel/code-frame": "7.0.0", - "@jest/test-result": "24.8.0", - "@jest/types": "24.8.0", + "@babel/code-frame": "7.5.5", + "@jest/test-result": "24.9.0", + "@jest/types": "24.9.0", "@types/stack-utils": "1.0.1", "chalk": "2.4.2", "micromatch": "3.1.10", @@ -3162,12 +3131,12 @@ } }, "jest-mock": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.8.0.tgz", - "integrity": "sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", "dev": true, "requires": { - "@jest/types": "24.8.0" + "@jest/types": "24.9.0" } }, "jest-pnp-resolver": { @@ -3177,18 +3146,18 @@ "dev": true }, "jest-regex-util": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", - "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", "dev": true }, "jest-resolve": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", - "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", + "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", "dev": true, "requires": { - "@jest/types": "24.8.0", + "@jest/types": "24.9.0", "browser-resolve": "1.11.3", "chalk": "2.4.2", "jest-pnp-resolver": "1.2.1", @@ -3196,114 +3165,123 @@ } }, "jest-resolve-dependencies": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz", - "integrity": "sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", + "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", "dev": true, "requires": { - "@jest/types": "24.8.0", - "jest-regex-util": "24.3.0", - "jest-snapshot": "24.8.0" + "@jest/types": "24.9.0", + "jest-regex-util": "24.9.0", + "jest-snapshot": "24.9.0" } }, "jest-runner": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.8.0.tgz", - "integrity": "sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", + "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", "dev": true, "requires": { - "@jest/console": "24.7.1", - "@jest/environment": "24.8.0", - "@jest/test-result": "24.8.0", - "@jest/types": "24.8.0", + "@jest/console": "24.9.0", + "@jest/environment": "24.9.0", + "@jest/test-result": "24.9.0", + "@jest/types": "24.9.0", "chalk": "2.4.2", "exit": "0.1.2", - "graceful-fs": "4.2.0", - "jest-config": "24.8.0", - "jest-docblock": "24.3.0", - "jest-haste-map": "24.8.1", - "jest-jasmine2": "24.8.0", - "jest-leak-detector": "24.8.0", - "jest-message-util": "24.8.0", - "jest-resolve": "24.8.0", - "jest-runtime": "24.8.0", - "jest-util": "24.8.0", - "jest-worker": "24.6.0", - "source-map-support": "0.5.12", + "graceful-fs": "4.2.2", + "jest-config": "24.9.0", + "jest-docblock": "24.9.0", + "jest-haste-map": "24.9.0", + "jest-jasmine2": "24.9.0", + "jest-leak-detector": "24.9.0", + "jest-message-util": "24.9.0", + "jest-resolve": "24.9.0", + "jest-runtime": "24.9.0", + "jest-util": "24.9.0", + "jest-worker": "24.9.0", + "source-map-support": "0.5.13", "throat": "4.1.0" } }, "jest-runtime": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.8.0.tgz", - "integrity": "sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", + "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", "dev": true, "requires": { - "@jest/console": "24.7.1", - "@jest/environment": "24.8.0", - "@jest/source-map": "24.3.0", - "@jest/transform": "24.8.0", - "@jest/types": "24.8.0", - "@types/yargs": "12.0.12", + "@jest/console": "24.9.0", + "@jest/environment": "24.9.0", + "@jest/source-map": "24.9.0", + "@jest/transform": "24.9.0", + "@jest/types": "24.9.0", + "@types/yargs": "13.0.2", "chalk": "2.4.2", "exit": "0.1.2", "glob": "7.1.4", - "graceful-fs": "4.2.0", - "jest-config": "24.8.0", - "jest-haste-map": "24.8.1", - "jest-message-util": "24.8.0", - "jest-mock": "24.8.0", - "jest-regex-util": "24.3.0", - "jest-resolve": "24.8.0", - "jest-snapshot": "24.8.0", - "jest-util": "24.8.0", - "jest-validate": "24.8.0", + "graceful-fs": "4.2.2", + "jest-config": "24.9.0", + "jest-haste-map": "24.9.0", + "jest-message-util": "24.9.0", + "jest-mock": "24.9.0", + "jest-regex-util": "24.9.0", + "jest-resolve": "24.9.0", + "jest-snapshot": "24.9.0", + "jest-util": "24.9.0", + "jest-validate": "24.9.0", "realpath-native": "1.1.0", "slash": "2.0.0", "strip-bom": "3.0.0", - "yargs": "12.0.5" + "yargs": "13.3.0" } }, "jest-serializer": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz", - "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", "dev": true }, "jest-snapshot": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.8.0.tgz", - "integrity": "sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", + "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", "dev": true, "requires": { - "@babel/types": "7.4.4", - "@jest/types": "24.8.0", + "@babel/types": "7.5.5", + "@jest/types": "24.9.0", "chalk": "2.4.2", - "expect": "24.8.0", - "jest-diff": "24.8.0", - "jest-matcher-utils": "24.8.0", - "jest-message-util": "24.8.0", - "jest-resolve": "24.8.0", + "expect": "24.9.0", + "jest-diff": "24.9.0", + "jest-get-type": "24.9.0", + "jest-matcher-utils": "24.9.0", + "jest-message-util": "24.9.0", + "jest-resolve": "24.9.0", "mkdirp": "0.5.1", "natural-compare": "1.4.0", - "pretty-format": "24.8.0", - "semver": "5.7.0" + "pretty-format": "24.9.0", + "semver": "6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "jest-util": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz", - "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", "dev": true, "requires": { - "@jest/console": "24.7.1", - "@jest/fake-timers": "24.8.0", - "@jest/source-map": "24.3.0", - "@jest/test-result": "24.8.0", - "@jest/types": "24.8.0", + "@jest/console": "24.9.0", + "@jest/fake-timers": "24.9.0", + "@jest/source-map": "24.9.0", + "@jest/test-result": "24.9.0", + "@jest/types": "24.9.0", "callsites": "3.1.0", "chalk": "2.4.2", - "graceful-fs": "4.2.0", + "graceful-fs": "4.2.2", "is-ci": "2.0.0", "mkdirp": "0.5.1", "slash": "2.0.0", @@ -3311,41 +3289,41 @@ } }, "jest-validate": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz", - "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", "dev": true, "requires": { - "@jest/types": "24.8.0", + "@jest/types": "24.9.0", "camelcase": "5.3.1", "chalk": "2.4.2", - "jest-get-type": "24.8.0", - "leven": "2.1.0", - "pretty-format": "24.8.0" + "jest-get-type": "24.9.0", + "leven": "3.1.0", + "pretty-format": "24.9.0" } }, "jest-watcher": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.8.0.tgz", - "integrity": "sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", + "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", "dev": true, "requires": { - "@jest/test-result": "24.8.0", - "@jest/types": "24.8.0", - "@types/yargs": "12.0.12", + "@jest/test-result": "24.9.0", + "@jest/types": "24.9.0", + "@types/yargs": "13.0.2", "ansi-escapes": "3.2.0", "chalk": "2.4.2", - "jest-util": "24.8.0", + "jest-util": "24.9.0", "string-length": "2.0.0" } }, "jest-worker": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz", - "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", "dev": true, "requires": { - "merge-stream": "1.0.1", + "merge-stream": "2.0.0", "supports-color": "6.1.0" }, "dependencies": { @@ -3401,7 +3379,7 @@ "cli-table": "0.3.1", "commander": "2.9.0", "cst": "0.4.10", - "estraverse": "4.2.0", + "estraverse": "4.3.0", "exit": "0.1.2", "glob": "5.0.15", "htmlparser2": "3.8.3", @@ -3415,12 +3393,12 @@ "pathval": "0.1.1", "prompt": "0.2.14", "reserved-words": "0.1.2", - "resolve": "1.11.1", + "resolve": "1.12.0", "strip-bom": "2.0.0", "strip-json-comments": "1.0.4", "to-double-quotes": "2.0.0", "to-single-quotes": "2.0.1", - "vow": "0.4.19", + "vow": "0.4.20", "vow-fs": "0.3.6", "xmlbuilder": "3.1.0" }, @@ -3484,12 +3462,6 @@ "integrity": "sha1-H5bWDjFBysG20FZTzg2urHY69qo=", "dev": true }, - "pathval": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-0.1.1.tgz", - "integrity": "sha1-CPkRzcqczllCiA2ngXvAtyO2bYI=", - "dev": true - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -3555,15 +3527,15 @@ "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", "dev": true, "requires": { - "abab": "2.0.0", + "abab": "2.0.1", "acorn": "5.7.3", - "acorn-globals": "4.3.2", + "acorn-globals": "4.3.3", "array-equal": "1.0.0", - "cssom": "0.3.6", - "cssstyle": "1.2.2", + "cssom": "0.3.8", + "cssstyle": "1.4.0", "data-urls": "1.1.0", "domexception": "1.0.1", - "escodegen": "1.11.1", + "escodegen": "1.12.0", "html-encoding-sniffer": "1.0.2", "left-pad": "1.3.0", "nwsapi": "2.1.4", @@ -3656,15 +3628,6 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "2.0.0" - } - }, "left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", @@ -3672,9 +3635,9 @@ "dev": true }, "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, "levn": { @@ -3693,7 +3656,7 @@ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { - "graceful-fs": "4.2.0", + "graceful-fs": "4.2.2", "parse-json": "4.0.0", "pify": "3.0.0", "strip-bom": "3.0.0" @@ -3741,7 +3704,7 @@ "dev": true, "requires": { "pify": "4.0.1", - "semver": "5.7.0" + "semver": "5.7.1" }, "dependencies": { "pify": { @@ -3761,15 +3724,6 @@ "tmpl": "1.0.4" } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "1.0.0" - } - }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -3785,25 +3739,11 @@ "object-visit": "1.0.1" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "0.1.3", - "mimic-fn": "2.1.0", - "p-is-promise": "2.1.0" - } - }, "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "2.3.6" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "micromatch": { "version": "3.1.10", @@ -3841,12 +3781,6 @@ "mime-db": "1.40.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -3901,10 +3835,9 @@ } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "murmur-hash-js": { "version": "1.0.0", @@ -3981,7 +3914,7 @@ "integrity": "sha512-hYnkg1OWVdaxORdzVvdQ4ueWYpf7IICObPzd24BBiDyVG5219VkUnRxSH9wZmisFb6NpgABzlSIL1pIZaCKmXg==", "requires": { "@types/bluebird": "3.5.0", - "@types/lodash": "4.14.135", + "@types/lodash": "4.14.138", "bin-protocol": "3.1.1", "bluebird": "3.5.5", "buffer-crc32": "0.2.13", @@ -4005,14 +3938,14 @@ "dev": true }, "node-notifier": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", - "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", "dev": true, "requires": { "growly": "1.3.0", "is-wsl": "1.1.0", - "semver": "5.7.0", + "semver": "5.7.1", "shellwords": "0.1.1", "which": "1.3.1" } @@ -4058,9 +3991,9 @@ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { - "hosted-git-info": "2.7.1", - "resolve": "1.11.1", - "semver": "5.7.0", + "hosted-git-info": "2.8.4", + "resolve": "1.12.0", + "semver": "5.7.1", "validate-npm-package-license": "3.0.4" } }, @@ -4082,12 +4015,6 @@ "path-key": "2.0.1" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "nwsapi": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", @@ -4131,6 +4058,12 @@ } } }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -4214,23 +4147,6 @@ } } }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "1.0.0", - "lcid": "2.0.0", - "mem": "4.3.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, "p-each-series": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", @@ -4246,16 +4162,10 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { "p-try": "2.2.0" @@ -4267,7 +4177,7 @@ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "p-limit": "2.2.0" + "p-limit": "2.2.1" } }, "p-reduce": { @@ -4337,10 +4247,11 @@ "pify": "3.0.0" } }, - "percentile": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/percentile/-/percentile-1.2.2.tgz", - "integrity": "sha512-yb/W/Y3WNxEZ6/P75qkAvE3lu81AO1qDk95j7jPJg4Vj+wDWSDs0CMLVGoAUCOZbXOUOz3b3rWWR6Bf1hyzNJg==" + "pathval": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-0.1.1.tgz", + "integrity": "sha1-CPkRzcqczllCiA2ngXvAtyO2bYI=", + "dev": true }, "performance-now": { "version": "2.1.0", @@ -4355,16 +4266,16 @@ "dev": true }, "pino": { - "version": "5.12.6", - "resolved": "https://registry.npmjs.org/pino/-/pino-5.12.6.tgz", - "integrity": "sha512-LM5ug2b27uymIIkaBw54ncF+9DSf8S4z1uzw+Y5I94dRu3Z+lFuB13j0kg1InAeyxy+CsLGnWHKy9+zgTreFOg==", + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/pino/-/pino-5.13.2.tgz", + "integrity": "sha512-WwOSCy36/gWhinsqWqAnuwIi2WtcH+jvoyeLm3bjUALIrzWIst0AovQjK4jVvSN2l64KFPfi3gd2fjsTovjdLQ==", "requires": { "fast-redact": "1.5.0", "fast-safe-stringify": "2.0.6", "flatstr": "1.0.12", "pino-std-serializers": "2.4.2", "quick-format-unescaped": "3.0.2", - "sonic-boom": "0.7.4" + "sonic-boom": "0.7.5" } }, "pino-std-serializers": { @@ -4415,15 +4326,15 @@ "dev": true }, "pretty-format": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", - "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", "dev": true, "requires": { - "@jest/types": "24.8.0", + "@jest/types": "24.9.0", "ansi-regex": "4.1.0", "ansi-styles": "3.2.1", - "react-is": "16.8.6" + "react-is": "16.9.0" } }, "process-nextick-args": { @@ -4446,13 +4357,13 @@ } }, "prompts": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.1.0.tgz", - "integrity": "sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.2.1.tgz", + "integrity": "sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw==", "dev": true, "requires": { "kleur": "3.0.3", - "sisteransi": "1.0.0" + "sisteransi": "1.0.3" } }, "protocol-buffers-schema": { @@ -4461,9 +4372,9 @@ "integrity": "sha512-Xdayp8sB/mU+sUV4G7ws8xtYMGdQnxbeIfLjyO9TZZRJdztBGhlmbI5x1qcY4TG5hBkIKGnc28i7nXxaugu88w==" }, "psl": { - "version": "1.1.33", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.33.tgz", - "integrity": "sha512-LTDP2uSrsc7XCb5lO7A8BI1qYxRe/8EqlRvMeEl6rsnYAqDOl8xHR+8lSAIVfrNaSAlTPTNOCgNjWcoUL3AZsw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", + "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==", "dev": true }, "pump": { @@ -4494,9 +4405,9 @@ "integrity": "sha512-FXTaCkwvpIlkdKeGDNgcq07SXWS383noQUuZjvdE1QcTt+eLuqof6/BDiEPqB59FWLie/l91+HtlJSw7iCViSA==" }, "react-is": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", - "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz", + "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", "dev": true }, "read": { @@ -4530,18 +4441,23 @@ } }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.4", - "isarray": "1.0.0", - "process-nextick-args": "2.0.1", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "isarray": "0.0.1", + "string_decoder": "0.10.31" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } } }, "realpath-native": { @@ -4569,6 +4485,15 @@ "safe-regex": "1.1.0" } }, + "regexp.prototype.flags": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", + "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", + "dev": true, + "requires": { + "define-properties": "1.1.3" + } + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -4612,7 +4537,7 @@ "safe-buffer": "5.1.2", "tough-cookie": "2.4.3", "tunnel-agent": "0.6.0", - "uuid": "3.3.2" + "uuid": "3.3.3" }, "dependencies": { "punycode": { @@ -4627,7 +4552,7 @@ "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "dev": true, "requires": { - "psl": "1.1.33", + "psl": "1.3.0", "punycode": "1.4.1" } } @@ -4672,9 +4597,9 @@ "dev": true }, "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { "path-parse": "1.0.6" @@ -4714,9 +4639,9 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { "glob": "7.1.4" @@ -4773,9 +4698,9 @@ "dev": true }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "set-blocking": { @@ -4840,9 +4765,9 @@ "integrity": "sha1-1ZzDoZPBpdAyD4Tucy9uRxPlEd0=" }, "sisteransi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.0.tgz", - "integrity": "sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.3.tgz", + "integrity": "sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg==", "dev": true }, "slash": { @@ -4894,6 +4819,12 @@ "is-extendable": "0.1.1" } }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -4974,9 +4905,9 @@ } }, "sonic-boom": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-0.7.4.tgz", - "integrity": "sha512-8JRAJg0RxZtFLQMxolwETvWd2JSlH3ZGo/Z4xPxMbpqF14xCgVYPVeFCFOR3zyr3pcfG82QDVj6537Sx5ZWdNw==", + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-0.7.5.tgz", + "integrity": "sha512-1pKrnAV6RfvntPnarY71tpthFTM3pWZWWQdghZY8ARjtDPGzG/inxqSuRwQY/7V1woUjfyxPb437zn4p5phgnQ==", "requires": { "flatstr": "1.0.12" } @@ -5001,9 +4932,9 @@ } }, "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { "buffer-from": "1.1.1", @@ -5023,7 +4954,7 @@ "dev": true, "requires": { "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.4" + "spdx-license-ids": "3.0.5" } }, "spdx-exceptions": { @@ -5039,13 +4970,13 @@ "dev": true, "requires": { "spdx-exceptions": "2.2.0", - "spdx-license-ids": "3.0.4" + "spdx-license-ids": "3.0.5" } }, "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "split-string": { @@ -5155,40 +5086,21 @@ } }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { + "emoji-regex": "7.0.3", "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } + "strip-ansi": "5.2.0" } }, "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true }, "strip-ansi": { "version": "5.2.0", @@ -5322,7 +5234,7 @@ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { - "psl": "1.1.33", + "psl": "1.3.0", "punycode": "2.1.1" } }, @@ -5478,17 +5390,17 @@ "dev": true, "requires": { "async": "0.2.10", - "deep-equal": "1.0.1", + "deep-equal": "1.1.0", "i": "0.3.6", "mkdirp": "0.5.1", "ncp": "0.4.2", - "rimraf": "2.6.3" + "rimraf": "2.7.1" } }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", "dev": true }, "validate-npm-package-license": { @@ -5513,9 +5425,9 @@ } }, "vow": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.19.tgz", - "integrity": "sha512-S+0+CiQlbUhTNWMlJdqo/ARuXOttXdvw5ACGyh1W97NFHUdwt3Fzyaus03Kvdmo733dwnYS9AGJSDg0Zu8mNfA==", + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.20.tgz", + "integrity": "sha512-YYoSYXUYABqY08D/WrjcWJxJSErcILRRTQpcPyUc0SFfgIPKSUFzVt7u1HC3TXGJZM/qhsSjCLNQstxqf7asgQ==", "dev": true }, "vow-fs": { @@ -5526,7 +5438,7 @@ "requires": { "glob": "7.1.4", "uuid": "2.0.3", - "vow": "0.4.19", + "vow": "0.4.20", "vow-queue": "0.4.3" }, "dependencies": { @@ -5544,7 +5456,7 @@ "integrity": "sha512-/poAKDTFL3zYbeQg7cl4BGcfP4sGgXKrHnRFSKj97dteUFu8oyXMwIcdwu8NSx/RmPGIuYx1Bik/y5vU4H/VKw==", "dev": true, "requires": { - "vow": "0.4.19" + "vow": "0.4.20" } }, "w3c-hr-time": { @@ -5648,50 +5560,14 @@ "dev": true }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - } + "ansi-styles": "3.2.1", + "string-width": "3.1.0", + "strip-ansi": "5.2.0" } }, "wrappy": { @@ -5706,7 +5582,7 @@ "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", "dev": true, "requires": { - "graceful-fs": "4.2.0", + "graceful-fs": "4.2.2", "imurmurhash": "0.1.4", "signal-exit": "3.0.2" } @@ -5725,7 +5601,7 @@ "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", "dev": true, "requires": { - "async-limiter": "1.0.0" + "async-limiter": "1.0.1" } }, "xml-name-validator": { @@ -5758,37 +5634,27 @@ "dev": true }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", "dev": true, "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", + "cliui": "5.0.0", "find-up": "3.0.0", - "get-caller-file": "1.0.3", - "os-locale": "3.1.0", + "get-caller-file": "2.0.5", "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.1.1", + "string-width": "3.1.0", "which-module": "2.0.0", "y18n": "4.0.0", - "yargs-parser": "11.1.1" - }, - "dependencies": { - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - } + "yargs-parser": "13.1.1" } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { "camelcase": "5.3.1", diff --git a/package.json b/package.json index bb4e044..3d9c136 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,6 @@ "dependencies": { "debug": "^4.1.1", "no-kafka": "^3.4.3", - "percentile": "^1.2.2", "pino": "^5.12.6", "stats-lite": "^2.2.0" }, From 98c66eb6a485d5326f4992f8dc2622b5469073d9 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Fri, 30 Aug 2019 14:24:02 -0700 Subject: [PATCH 06/29] fix path --- src/aggregator/kafkaConsumer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/aggregator/kafkaConsumer.js b/src/aggregator/kafkaConsumer.js index 2323f77..4f289cf 100644 --- a/src/aggregator/kafkaConsumer.js +++ b/src/aggregator/kafkaConsumer.js @@ -12,8 +12,8 @@ */ const Kafka = require('no-kafka'); const debug = require('debug')('refocus-aggregation'); -const config = require('./config').getConfig(); -const aggregationHandler = require('./handlerUtil').aggregationHandler; +const config = require('../config').getConfig(); +const aggregationHandler = require('./aggregatorHandler').aggregationHandler; const clientId = 'consumer-' + process.pid; /** From 41a2995aa5fe42f04b4a15e1c13d796ff56fc17a Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Tue, 3 Sep 2019 10:31:21 -0700 Subject: [PATCH 07/29] add test --- .../unit/aggregator/aggregatorHandler.js | 78 ++++++++++++++++++- src/aggregator/aggregatorHandler.js | 3 +- 2 files changed, 78 insertions(+), 3 deletions(-) diff --git a/__tests__/unit/aggregator/aggregatorHandler.js b/__tests__/unit/aggregator/aggregatorHandler.js index 2f3658d..4a69d43 100644 --- a/__tests__/unit/aggregator/aggregatorHandler.js +++ b/__tests__/unit/aggregator/aggregatorHandler.js @@ -14,7 +14,11 @@ jest.mock('../../../src/aggregator/persist'); jest.useFakeTimers(); describe('test/unit/aggregator/aggregatorHandler.js', () => { - it('end-to-end', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it('end-to-end OK', () => { const key = Buffer.from(JSON.stringify({ updatedAt: new Date().toISOString(), name: 'testSample', @@ -80,4 +84,76 @@ describe('test/unit/aggregator/aggregatorHandler.js', () => { jest.advanceTimersByTime(timeout); expect(persistMock).toHaveBeenCalledWith(JSON.parse(key.toString()), result); }); + + it('Does not include messages received after timeout', () => { + const key = Buffer.from(JSON.stringify({ + updatedAt: new Date().toISOString(), + name: 'testSample', + })); + + const reqStartTime = Date.now(); + const jobStartTime = reqStartTime + 2; + const publishCompletedAt = jobStartTime + 4; + const emittedAt1 = publishCompletedAt + 4; + const emittedAt2 = publishCompletedAt + 6; + const emittedAt3 = publishCompletedAt + 8; + const numClientsEmittedTo = 2; + const acknowledgedAt1 = emittedAt3 + 6; + const acknowledgedAt2 = emittedAt2 + 4; + + const value1 = Buffer.from(JSON.stringify({ message: + { type: 'requestStarted', reqStartTime, jobStartTime }, })); + + const value2 = Buffer.from(JSON.stringify({ message: + { type: 'published', publishCompletedAt }, })); + + const value3 = Buffer.from(JSON.stringify({ message: + { type: 'emitted', emittedAt: emittedAt1 }, })); + + const value4 = Buffer.from(JSON.stringify({ message: + { type: 'emitted', emittedAt: emittedAt2 }, })); + + const value5 = Buffer.from(JSON.stringify({ message: + { type: 'emitted', emittedAt: emittedAt3 }, })); + + const value6 = Buffer.from(JSON.stringify({ message: + { type: 'acknowledged', acknowledgedAt: acknowledgedAt1 }, })); + + const value7 = Buffer.from(JSON.stringify({ message: + { type: 'acknowledged', acknowledgedAt: acknowledgedAt2 }, })); + + const messageSet = []; + + messageSet.push({ message: { value: value1, key } }); + messageSet.push({ message: { value: value2, key } }); + messageSet.push({ message: { value: value3, key } }); + messageSet.push({ message: { value: value4, key } }); + + const result = { + jobStartTime, + queueTime: 2, + publishLatency: 4, + avgSubscribeLatency: 5, + numSubsMissed: 1, + avgEndToEndLatency: NaN, + medianEndToEndLatency: NaN, + ninetyFifthPercentileEndToEndLatency: NaN, + isPublished: true, + isSuccessfullyEmitted: false, + numClientsAcknowledged: 0, + }; + const persistMock = jest.spyOn(persist, 'persist'); + aggregationHandler(messageSet, 'foo', 0); + jest.advanceTimersByTime(timeout); + + const messageSet2 = []; + + messageSet2.push({ message: { value: value5, key } }); + messageSet2.push({ message: { value: value6, key } }); + messageSet2.push({ message: { value: value7, key } }); + aggregationHandler(messageSet2, 'foo', 0); + jest.advanceTimersByTime(timeout); + expect(persistMock).toHaveBeenCalledWith(JSON.parse(key.toString()), result); + expect(persistMock).toHaveBeenCalledTimes(1); + }); }); diff --git a/src/aggregator/aggregatorHandler.js b/src/aggregator/aggregatorHandler.js index 35f5cbf..846ace9 100644 --- a/src/aggregator/aggregatorHandler.js +++ b/src/aggregator/aggregatorHandler.js @@ -69,9 +69,8 @@ const flush = async (key) => { isSuccessfullyEmitted, numClientsAcknowledged, }; - const parsedKey = JSON.parse(key); - + aggregateMap.delete(key); persist(parsedKey, aggregatedVal); }; From 53e623031c5595e31868fc35f75ad4a4ea7f0524 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Tue, 3 Sep 2019 13:31:50 -0700 Subject: [PATCH 08/29] Modify readme --- README.md | 7 +++++++ package.json | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 640f76d..c1c947d 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,12 @@ defaults to 1MB. - `KAFKA_CONSUMER_IDLE_TIMEOUT`: Timeout between fetch calls, defaults to 1000ms. +To enable aggregation supply the application with the following environment variables: + +- `AGGREGATION_TOPIC`: Topic where pub-sub tracking messages are being produced +- `FLUSH_TO_PERSISTENCE_AFTER`: Timeout period for aggregated value for each sample +- `NUM_REALTIME_PROCESSES`: Number of real-time processes being run (this is to calculate if and how many subscribe events did we miss) + Note: If you are using one of Heroku's multi-tenant Apache Kafka plans, you must also define the "logger-group" consumer group with the following command: `heroku kafka:consumer-groups:create logger-group -a YOUR_REFOCUS_LOGGING_APPLICATION` @@ -62,5 +68,6 @@ See https://github.com/salesforce/refocus-logging-client#configuration. ## Version History +- 1.2.0 Add option for aggregating pub sub aggregation logs - 1.1.0 Add option for consolidated Refocus logging using Kafka, group consumer - 1.0.0 diff --git a/package.json b/package.json index 3d9c136..fd63a9f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "refocus-logging", - "version": "1.1.0", + "version": "1.2.0", "description": "Common logging service for Refocus and its associated services.", "main": "src/index.js", "scripts": { From 4a1ec4fd222a7071e69e54e4718c6492bd2e7754 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Tue, 3 Sep 2019 15:20:23 -0700 Subject: [PATCH 09/29] add toggle --- README.md | 1 + package-lock.json | 7 ++++++- package.json | 1 + src/aggregator/persist.js | 8 ++++++-- src/config.js | 26 ++++++++++++++++++++++++++ 5 files changed, 40 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c1c947d..40c991f 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ To enable aggregation supply the application with the following environment vari - `AGGREGATION_TOPIC`: Topic where pub-sub tracking messages are being produced - `FLUSH_TO_PERSISTENCE_AFTER`: Timeout period for aggregated value for each sample - `NUM_REALTIME_PROCESSES`: Number of real-time processes being run (this is to calculate if and how many subscribe events did we miss) +- `LOG_PUBSUB_STATS`: Set to true if you want to log the aggregated statistics Note: If you are using one of Heroku's multi-tenant Apache Kafka plans, you must also define the "logger-group" consumer group with the following command: diff --git a/package-lock.json b/package-lock.json index 2976210..f6b58f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "refocus-logging", - "version": "1.1.0", + "version": "1.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1725,6 +1725,11 @@ "bser": "2.1.0" } }, + "feature-toggles": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/feature-toggles/-/feature-toggles-1.4.0.tgz", + "integrity": "sha1-gTTnbqw0g/GgNLhXwVyFB2K+rGM=" + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", diff --git a/package.json b/package.json index fd63a9f..89a05db 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "homepage": "https://github.com/salesforce/refocus-logging#readme", "dependencies": { "debug": "^4.1.1", + "feature-toggles": "^1.4.0", "no-kafka": "^3.4.3", "pino": "^5.12.6", "stats-lite": "^2.2.0" diff --git a/src/aggregator/persist.js b/src/aggregator/persist.js index 0a655e7..20a9176 100644 --- a/src/aggregator/persist.js +++ b/src/aggregator/persist.js @@ -1,6 +1,10 @@ +const featureToggles = require('feature-toggles'); + const persist = (parsedKey, val) => { - logger.info(parsedKey); - logger.info(val); + if (featureToggles.isFeatureEnabled('logPubSubStats')) { + logger.info(parsedKey); + logger.info(val); + } }; module.exports = { diff --git a/src/config.js b/src/config.js index f6a45d7..c95db22 100644 --- a/src/config.js +++ b/src/config.js @@ -10,6 +10,25 @@ * define config variables */ +const featureToggles = require('feature-toggles'); + +/** + * Return boolean true if the named environment variable is boolean true or + * case-insensitive string 'true'. + * + * @param {Object} processEnv - The node process environment. (Passing it into + * this function instead of just getting a reference to it *inside* this + * function makes the function easier to test.) + * @param {String} environmentVariableName - The name of the environment var. + * @returns {Boolean} true if the named environment variable is boolean true or + * case-insensitive string 'true'. + */ +const environmentVariableTrue = (processEnv, environmentVariableName) => { + const x = processEnv[environmentVariableName]; + return typeof x !== 'undefined' && x !== null && + x.toString().toLowerCase() === 'true'; +}; + const getMaxWaitTime = (input) => { const maxWait = +input; if (isNaN(maxWait) || maxWait <= 0) { @@ -88,6 +107,13 @@ const config = { staging: herokuConfig, }; +const toggles = { + // Log the pub-sub stats + logPubSubStats: environmentVariableTrue(process.env, 'LOG_PUBSUB_STATS'), +}; // toggles + +featureToggles.load(toggles); + module.exports = { getConfig: (environmentName) => { if (!environmentName) environmentName = process.env.NODE_ENV; From 1df29e64bbd2a5bfdccc503e7783758df4a240fc Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Tue, 3 Sep 2019 15:29:20 -0700 Subject: [PATCH 10/29] fix --- README.md | 4 ++++ src/aggregator/kafkaConsumer.js | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 40c991f..a722fcc 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,10 @@ To enable aggregation supply the application with the following environment vari Note: If you are using one of Heroku's multi-tenant Apache Kafka plans, you must also define the "logger-group" consumer group with the following command: `heroku kafka:consumer-groups:create logger-group -a YOUR_REFOCUS_LOGGING_APPLICATION` + +you must also define the "aggregator-group" consumer group with the following command if you want aggregation enabled: + +`heroku kafka:consumer-groups:create aggregator-group -a YOUR_REFOCUS_LOGGING_APPLICATION` For more information on this feature, please see https://devcenter.heroku.com/articles/multi-tenant-kafka-on-heroku#consumer-groups. diff --git a/src/aggregator/kafkaConsumer.js b/src/aggregator/kafkaConsumer.js index 4f289cf..d84b554 100644 --- a/src/aggregator/kafkaConsumer.js +++ b/src/aggregator/kafkaConsumer.js @@ -39,7 +39,7 @@ const initConsumer = async (errorCallback) => { }); const strategies = [{ - subscriptions: config.topics, + subscriptions: config.aggregationTopic, handler: aggregationHandler, }, ]; From 77398bcf14f48c1e38b3826bc97e881c8f0fdd4e Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Wed, 4 Sep 2019 14:14:53 -0700 Subject: [PATCH 11/29] init postgres --- package-lock.json | 604 ++++++++++++++++++++++++++++++++++++-- package.json | 6 +- src/aggregator/db.js | 71 +++++ src/aggregator/index.js | 5 +- src/aggregator/persist.js | 25 ++ src/config.js | 40 ++- 6 files changed, 706 insertions(+), 45 deletions(-) create mode 100644 src/aggregator/db.js diff --git a/package-lock.json b/package-lock.json index f6b58f0..3c9467a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -457,6 +457,11 @@ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.138.tgz", "integrity": "sha512-A4uJgHz4hakwNBdHNPdxOTkYmXNgmUAKLbXZ7PKGslgeV0Mb8P3BlbYfPovExek1qnod4pDfRbxuzcVs3dlFLg==" }, + "@types/node": { + "version": "12.7.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.4.tgz", + "integrity": "sha512-W0+n1Y+gK/8G2P/piTkBBN38Qc5Q1ZSO6B5H3QmPCUewaiXOo2GCAWZ4ElZCcNhjJuBSUSLGFUJnmlCn5+nxOQ==" + }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", @@ -553,6 +558,11 @@ "color-convert": "1.9.3" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -894,6 +904,11 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, + "buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -998,12 +1013,26 @@ "wrap-ansi": "5.1.0" } }, + "cls-bluebird": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz", + "integrity": "sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4=", + "requires": { + "is-bluebird": "1.0.2", + "shimmer": "1.2.1" + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -1236,8 +1265,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { "version": "0.2.0", @@ -1391,6 +1419,11 @@ "domelementtype": "1.3.1" } }, + "dottie": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.1.tgz", + "integrity": "sha512-ch5OQgvGDK2u8pSZeSYAQaV/lczImd7pMJ7BcEPXmnFVjy4yJIzP6CsODJUTH8mg1tyH1Z2abOiuJO3DjZ/GBw==" + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -1426,7 +1459,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "requires": { "is-arrayish": "0.2.1" } @@ -2340,6 +2372,11 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "generic-pool": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-2.4.3.tgz", + "integrity": "sha1-eAw29p360FpaBF3Te+etyhGk9v8=" + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -2393,8 +2430,7 @@ "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", - "dev": true + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" }, "graceful-readlink": { "version": "1.0.1", @@ -2524,8 +2560,7 @@ "hosted-git-info": { "version": "2.8.4", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", - "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", - "dev": true + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==" }, "html-encoding-sniffer": { "version": "1.0.2", @@ -2591,6 +2626,11 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "inflection": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2622,6 +2662,11 @@ "loose-envify": "1.4.0" } }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -2651,8 +2696,12 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-bluebird": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz", + "integrity": "sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=" }, "is-buffer": { "version": "1.1.6", @@ -2800,8 +2849,7 @@ "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, "is-windows": { "version": "1.0.2", @@ -3343,6 +3391,11 @@ } } }, + "js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3633,6 +3686,14 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "1.0.0" + } + }, "left-pad": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", @@ -3682,6 +3743,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -3839,6 +3905,19 @@ } } }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "moment-timezone": { + "version": "0.5.26", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.26.tgz", + "integrity": "sha512-sFP4cgEKTCymBBKgoxZjYzlSovC20Y6J7y3nanDc5RoBIXKlZhoYwBoZGe3flwU6A372AcRwScH8KiwV6zjy1g==", + "requires": { + "moment": "2.24.0" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -3994,7 +4073,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, "requires": { "hosted-git-info": "2.8.4", "resolve": "1.12.0", @@ -4020,6 +4098,11 @@ "path-key": "2.0.1" } }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, "nwsapi": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", @@ -4032,6 +4115,11 @@ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=" + }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -4152,6 +4240,14 @@ } } }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "1.0.0" + } + }, "p-each-series": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", @@ -4197,6 +4293,11 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -4240,8 +4341,7 @@ "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-type": { "version": "3.0.0", @@ -4264,12 +4364,334 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, + "pg": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-7.12.1.tgz", + "integrity": "sha512-l1UuyfEvoswYfcUe6k+JaxiN+5vkOgYcVSbSuw3FvdLqDbaoa2RJo1zfJKfPsSYPFVERd4GHvX3s2PjG1asSDA==", + "requires": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "0.1.3", + "pg-pool": "2.0.7", + "pg-types": "2.2.0", + "pgpass": "1.0.2", + "semver": "4.3.2" + }, + "dependencies": { + "semver": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz", + "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=" + } + } + }, + "pg-connection-string": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz", + "integrity": "sha1-2hhHsglA5C7hSSvq9l1J2RskXfc=" + }, + "pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" + }, + "pg-pool": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.7.tgz", + "integrity": "sha512-UiJyO5B9zZpu32GSlP0tXy8J2NsJ9EFGFfz5v6PSbdz/1hBLX1rNiiy5+mAm5iJJYwfCv4A0EBcQLGWwjbpzZw==" + }, + "pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "requires": { + "pg-int8": "1.0.1", + "postgres-array": "2.0.0", + "postgres-bytea": "1.0.0", + "postgres-date": "1.0.4", + "postgres-interval": "1.2.0" + } + }, + "pgpass": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz", + "integrity": "sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=", + "requires": { + "split": "1.0.1" + } + }, + "pgtools": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/pgtools/-/pgtools-0.3.0.tgz", + "integrity": "sha512-8NxDCJ8xJ6hOp9hVNZqxi+TZl7hM1Jc8pQyj8DlAbyaWnk5OsGwf3gB/UyDODdOguiim9QzbzPsslp//apO+Uw==", + "requires": { + "bluebird": "3.5.5", + "pg": "6.4.2", + "pg-connection-string": "0.1.3", + "yargs": "5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "buffer-writer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.1.tgz", + "integrity": "sha1-Iqk2kB4wKa/NdUfrRIfOtpejvwg=" + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "4.2.2", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "packet-reader": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-0.3.1.tgz", + "integrity": "sha1-zWLmCvjX/qinBexP+ZCHHEaHHyc=" + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "1.3.2" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "4.2.2", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pg": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/pg/-/pg-6.4.2.tgz", + "integrity": "sha1-w2QBEGDqx6UHoq4GPrhX7OkQ4n8=", + "requires": { + "buffer-writer": "1.0.1", + "js-string-escape": "1.0.1", + "packet-reader": "0.3.1", + "pg-connection-string": "0.1.3", + "pg-pool": "1.8.0", + "pg-types": "1.13.0", + "pgpass": "1.0.2", + "semver": "4.3.2" + } + }, + "pg-pool": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-1.8.0.tgz", + "integrity": "sha1-9+xzgkw3oD8Hb1G/33DjQBR8Tzc=", + "requires": { + "generic-pool": "2.4.3", + "object-assign": "4.1.0" + } + }, + "pg-types": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-1.13.0.tgz", + "integrity": "sha512-lfKli0Gkl/+za/+b6lzENajczwZHc7D5kiUCZfgm914jipD2kIOIvEkAhZ8GrW3/TUoP9w8FHjwpPObBye5KQQ==", + "requires": { + "pg-int8": "1.0.1", + "postgres-array": "1.0.3", + "postgres-bytea": "1.0.0", + "postgres-date": "1.0.4", + "postgres-interval": "1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "postgres-array": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-1.0.3.tgz", + "integrity": "sha512-5wClXrAP0+78mcsNX3/ithQ5exKvCyK5lr5NEEEeGwwM6NJdQgzIJBVxLvRW+huFpX92F2QnZ5CcokH0VhK2qQ==" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.5.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "semver": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz", + "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "0.2.1" + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yargs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-5.0.0.tgz", + "integrity": "sha1-M1UUSXfQV1fbuG1uOOwFYSOzpm4=", + "requires": { + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.3", + "lodash.assign": "4.2.0", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "window-size": "0.2.0", + "y18n": "3.2.1", + "yargs-parser": "3.2.0" + } + }, + "yargs-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-3.2.0.tgz", + "integrity": "sha1-UIE1XRnZ0MjF2BrakIy05tGGZk8=", + "requires": { + "camelcase": "3.0.0", + "lodash.assign": "4.2.0" + } + } + } + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "2.0.4" + } + }, "pino": { "version": "5.13.2", "resolved": "https://registry.npmjs.org/pino/-/pino-5.13.2.tgz", @@ -4324,6 +4746,29 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, + "postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" + }, + "postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" + }, + "postgres-date": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.4.tgz", + "integrity": "sha512-bESRvKVuTrjoBluEcpv2346+6kgB7UlnqWZsnbnCccTNq/pqfj1j6oBaN5+b/NrDXepYUT/HKadqv3iS9lJuVA==" + }, + "postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "requires": { + "xtend": "4.0.2" + } + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -4404,6 +4849,11 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, "quick-format-unescaped": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-3.0.2.tgz", @@ -4586,8 +5036,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-main-filename": { "version": "2.0.0", @@ -4605,7 +5054,6 @@ "version": "1.12.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", - "dev": true, "requires": { "path-parse": "1.0.6" } @@ -4637,6 +5085,14 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, + "retry-as-promised": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", + "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", + "requires": { + "any-promise": "1.3.0" + } + }, "revalidator": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", @@ -4705,14 +5161,46 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "sequelize": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-5.18.1.tgz", + "integrity": "sha512-jngo7pqilyOycMv6ZEwHLVn2wuHi/xkSQZfwK4jhjG8ta1HWYJK3XyQDFdhVEOH1GEq9pnqaf+7Kwqm+eqXD9Q==", + "requires": { + "bluebird": "3.5.5", + "cls-bluebird": "2.1.0", + "debug": "4.1.1", + "dottie": "2.0.1", + "inflection": "1.12.0", + "lodash": "4.17.11", + "moment": "2.24.0", + "moment-timezone": "0.5.26", + "retry-as-promised": "3.2.0", + "semver": "6.3.0", + "sequelize-pool": "2.3.0", + "toposort-class": "1.0.1", + "uuid": "3.3.3", + "validator": "10.11.0", + "wkx": "0.4.8" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "sequelize-pool": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-2.3.0.tgz", + "integrity": "sha512-Ibz08vnXvkZ8LJTiUOxRcj1Ckdn7qafNZ2t59jYHMX1VIebTAOYefWdRYFt6z6+hy52WGthAHAoLc9hvk3onqA==" }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-value": { "version": "2.0.1", @@ -4758,6 +5246,11 @@ "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true }, + "shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -4956,7 +5449,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, "requires": { "spdx-expression-parse": "3.0.0", "spdx-license-ids": "3.0.5" @@ -4965,14 +5457,12 @@ "spdx-exceptions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, "requires": { "spdx-exceptions": "2.2.0", "spdx-license-ids": "3.0.5" @@ -4981,8 +5471,15 @@ "spdx-license-ids": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "requires": { + "through": "2.3.8" + } }, "split-string": { "version": "3.1.0", @@ -5167,6 +5664,11 @@ "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", "dev": true }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, "tmpl": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", @@ -5233,6 +5735,11 @@ "integrity": "sha1-fMKRUfD18sQZRvEZ9ZMv5VQXASU=", "dev": true }, + "toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -5366,6 +5873,22 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -5405,19 +5928,22 @@ "uuid": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", - "dev": true + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, "requires": { "spdx-correct": "3.1.0", "spdx-expression-parse": "3.0.0" } }, + "validator": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -5529,6 +6055,11 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=" + }, "winston": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", @@ -5558,6 +6089,14 @@ } } }, + "wkx": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.8.tgz", + "integrity": "sha512-ikPXMM9IR/gy/LwiOSqWlSL3X/J5uk9EO2hHNRXS41eTLXaUFEVw9fn/593jW/tE5tedNg8YjT5HkCa4FqQZyQ==", + "requires": { + "@types/node": "12.7.4" + } + }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", @@ -5632,6 +6171,11 @@ } } }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", diff --git a/package.json b/package.json index 89a05db..d07f0f0 100644 --- a/package.json +++ b/package.json @@ -24,8 +24,12 @@ "debug": "^4.1.1", "feature-toggles": "^1.4.0", "no-kafka": "^3.4.3", + "pg": "^7.12.1", + "pgtools": "^0.3.0", "pino": "^5.12.6", - "stats-lite": "^2.2.0" + "sequelize": "^5.18.1", + "stats-lite": "^2.2.0", + "url": "^0.11.0" }, "devDependencies": { "jest": "^24.8.0", diff --git a/src/aggregator/db.js b/src/aggregator/db.js new file mode 100644 index 0000000..bfbffce --- /dev/null +++ b/src/aggregator/db.js @@ -0,0 +1,71 @@ +const Sequelize = require('sequelize'); +const { dbUrl, aggregateTableName } = require('../config').getConfig(); +const pgtools = require('pgtools'); +const url = require('url'); + +const db = new Sequelize(dbUrl); + +/** + * Create a dbconfig object from the DB URL. + * + * @param {String} dbUrl - The DB URL. Leave empty to use the one from env. + * @returns {Object} - dbconfig + */ +const dbConfigObjectFromDbURL = (dbUrl) => { + const u = url.parse(dbUrl); + const auth = u.auth.split(':'); + return { + name: u.pathname.slice(1), // strip off leading slash + user: auth[0], + password: auth[1], + host: u.hostname, + port: u.port, + }; +}; + +/** + * Create a dbconfig object from the DB URL. + * @returns {Promise} - Promise resolved when the function finishes execution + */ +const initDb = async () => { + const dbConfig = dbConfigObjectFromDbURL(dbUrl); + let alreadyInitialized = false; + try { + await pgtools.createdb(dbConfig, dbConfig.name); + } catch (e) { + if (e.message.startsWith('Attempted to create a duplicate database')) { + alreadyInitialized = true; + return; + }; + } + + if (!alreadyInitialized) { + const createTable = `CREATE TABLE ${aggregateTableName} + ( + updated_at int, + sample_name text, + job_start_time int, + publish_latency int, + avg_subscribe_latency real, + num_subs_missed smallint, + avg_end_to_end_latency real, + median_end_to_end_latency real, + ninety_fifth_percentile_end_to_end_latency real, + is_published bool, + is_successfully_emitted bool, + num_clients_acknowledged smallint + );`; + + await db.query(createTable); + + await db.query(`CREATE UNIQUE INDEX range_query_index + on ${aggregateTableName} (updated_at, sample_name);`); + } +}; + +initDb(); + +module.exports = { + db, + initDb, +}; diff --git a/src/aggregator/index.js b/src/aggregator/index.js index b9d9249..b9e259c 100644 --- a/src/aggregator/index.js +++ b/src/aggregator/index.js @@ -13,6 +13,7 @@ const debug = require('debug')('refocus-logging'); const consumer = require('./kafkaConsumer'); const logger = require('pino')(); +const initDb = require('./db').initDb; debug(`Starting client consumer-${process.pid}`); @@ -20,5 +21,7 @@ const errorHandler = (message) => { logger.error(message); }; -consumer.initConsumer(errorHandler); +initDb().then(() => { + consumer.initConsumer(errorHandler); +}); diff --git a/src/aggregator/persist.js b/src/aggregator/persist.js index 20a9176..215418f 100644 --- a/src/aggregator/persist.js +++ b/src/aggregator/persist.js @@ -1,10 +1,35 @@ const featureToggles = require('feature-toggles'); +const { db } = require('./db'); +/** + * Key = { + * updatedAt, + * name); + * Value = { + * jobStartTime, + * queueTime, + * publishLatency, + * avgSubscribeLatency, + * numSubsMissed, + * avgEndToEndLatency, + * medianEndToEndLatency, + * ninetyFifthPercentileEndToEndLatency, + * isPublished, + * isSuccessfullyEmitted, + * numClientsAcknowledged, + * } + */ const persist = (parsedKey, val) => { if (featureToggles.isFeatureEnabled('logPubSubStats')) { logger.info(parsedKey); logger.info(val); } + + const epochTime = Date.parse(parsedKey.updatedAt); + const sampleName = parsedKey.name; + + db.query(`INSERT INTO films (code, title, did, date_prod, kind) + VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');`); }; module.exports = { diff --git a/src/config.js b/src/config.js index c95db22..ae6ebc3 100644 --- a/src/config.js +++ b/src/config.js @@ -11,6 +11,7 @@ */ const featureToggles = require('feature-toggles'); +const pe = process.env; /** * Return boolean true if the named environment variable is boolean true or @@ -72,18 +73,28 @@ const toTopicArray = (topics, prefix = '') => { .map(s => prefix + s.trim()); }; +const pgdatabase = pe.PGDATABASE || 'aggregatedb'; +const pguser = pe.PGUSER || 'postgres'; +const pgpass = pe.PGPASS || 'postgres'; +const pghost = pe.PGHOST || 'localhost'; +const pgport = pe.PGPORT || 5432; +const defaultDbUrl = 'postgres://' + pguser + ':' + pgpass + '@' + pghost + + ':' + pgport + '/' + pgdatabase; + const herokuConfig = { - prefix: process.env.KAFKA_PREFIX || '', - aggregationTopic: toTopicArray(process.env.AGGREGATION_TOPIC, process.env.KAFKA_PREFIX), - topics: toTopicArray(process.env.TOPICS, process.env.KAFKA_PREFIX), - sslCert: process.env.KAFKA_CLIENT_CERT || '.ssl/client.crt', - sslKey: process.env.KAFKA_CLIENT_CERT_KEY || '.ssl/client.key', - connectionString: process.env.KAFKA_URL ? process.env.KAFKA_URL.replace(/\+ssl/g, '') : '', - maxWaitTime: getMaxWaitTime(process.env.KAFKA_CONSUMER_MAX_WAIT_TIME_MS), - maxBytes: getMaxBytes(process.env.KAFKA_CONSUMER_MAX_BYTES), - idleTimeout: getIdleTimeout(process.env.KAFKA_CONSUMER_IDLE_TIMEOUT), - aggregatorTimeout: getAggregatorTimeout(process.env.FLUSH_TO_PERSISTENCE_AFTER), - expectedEmits: process.env.NUM_REALTIME_PROCESSES || 3, + prefix: pe.KAFKA_PREFIX || '', + aggregationTopic: toTopicArray(pe.AGGREGATION_TOPIC, pe.KAFKA_PREFIX), + topics: toTopicArray(pe.TOPICS, pe.KAFKA_PREFIX), + sslCert: pe.KAFKA_CLIENT_CERT || '.ssl/client.crt', + sslKey: pe.KAFKA_CLIENT_CERT_KEY || '.ssl/client.key', + connectionString: pe.KAFKA_URL ? pe.KAFKA_URL.replace(/\+ssl/g, '') : '', + maxWaitTime: getMaxWaitTime(pe.KAFKA_CONSUMER_MAX_WAIT_TIME_MS), + maxBytes: getMaxBytes(pe.KAFKA_CONSUMER_MAX_BYTES), + idleTimeout: getIdleTimeout(pe.KAFKA_CONSUMER_IDLE_TIMEOUT), + aggregatorTimeout: getAggregatorTimeout(pe.FLUSH_TO_PERSISTENCE_AFTER), + expectedEmits: pe.NUM_REALTIME_PROCESSES || 3, + dbUrl: pe.DATABASE_URL, + aggregateTableName: pe.AGGREGATE_TABLE_NAME, }; const devConfig = { @@ -98,6 +109,9 @@ const devConfig = { idleTimeout: 1000, aggregatorTimeout: 30000, expectedEmits: 3, + dbUrl: defaultDbUrl, + aggregateTableName: 'aggregates', + }; const config = { @@ -109,14 +123,14 @@ const config = { const toggles = { // Log the pub-sub stats - logPubSubStats: environmentVariableTrue(process.env, 'LOG_PUBSUB_STATS'), + logPubSubStats: environmentVariableTrue(pe, 'LOG_PUBSUB_STATS'), }; // toggles featureToggles.load(toggles); module.exports = { getConfig: (environmentName) => { - if (!environmentName) environmentName = process.env.NODE_ENV; + if (!environmentName) environmentName = pe.NODE_ENV; return config[environmentName] ? config[environmentName] : config.development; }, From cfdaa0690458f6bf57791114c2b0d401bc579c5e Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Wed, 4 Sep 2019 14:29:17 -0700 Subject: [PATCH 12/29] enable postgress --- src/aggregator/db.js | 2 ++ src/aggregator/persist.js | 17 ++++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/aggregator/db.js b/src/aggregator/db.js index bfbffce..aaf1429 100644 --- a/src/aggregator/db.js +++ b/src/aggregator/db.js @@ -45,6 +45,7 @@ const initDb = async () => { updated_at int, sample_name text, job_start_time int, + queue_time smallint, publish_latency int, avg_subscribe_latency real, num_subs_missed smallint, @@ -68,4 +69,5 @@ initDb(); module.exports = { db, initDb, + aggregateTableName, }; diff --git a/src/aggregator/persist.js b/src/aggregator/persist.js index 215418f..210fc07 100644 --- a/src/aggregator/persist.js +++ b/src/aggregator/persist.js @@ -1,5 +1,5 @@ const featureToggles = require('feature-toggles'); -const { db } = require('./db'); +const { db, aggregateTableName } = require('./db'); /** * Key = { @@ -19,17 +19,24 @@ const { db } = require('./db'); * numClientsAcknowledged, * } */ -const persist = (parsedKey, val) => { +const persist = async (parsedKey, val) => { if (featureToggles.isFeatureEnabled('logPubSubStats')) { logger.info(parsedKey); logger.info(val); } - const epochTime = Date.parse(parsedKey.updatedAt); + const epochSampleTime = Date.parse(parsedKey.updatedAt); const sampleName = parsedKey.name; - db.query(`INSERT INTO films (code, title, did, date_prod, kind) - VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');`); + const dbLine = `${epochSampleTime} ${sampleName} ${jobStartTime} ${queueTime} ${publishLatency} + ${avgSubscribeLatency} ${numSubsMissed} ${avgEndToEndLatency} ${medianEndToEndLatency} + ${ninetyFifthPercentileEndToEndLatency} ${isPublished} ${isSuccessfullyEmitted} ${numClientsAcknowledged}`; + + db.query(`INSERT INTO ${aggregateTableName} (updated_at, sample_name, job_start_time, queue_time, + publish_latency, avg_subscribe_latency, num_subs_missed, avg_end_to_end_latency, + median_end_to_end_latency, ninety_fifth_percentile_end_to_end_latency, + is_published, is_successfully_emitted, num_clients_acknowledged) + VALUES (${dbLine});`); }; module.exports = { From c382d342253a6eeeab19632cd69378e69e99c0d3 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Wed, 4 Sep 2019 16:27:06 -0700 Subject: [PATCH 13/29] fin --- __tests__/unit/aggregator/persist.js | 54 ++++++++++++++++++++++++++++ src/aggregator/db.js | 10 +++--- src/aggregator/index.js | 2 +- src/aggregator/persist.js | 46 ++++++++++++------------ 4 files changed, 81 insertions(+), 31 deletions(-) create mode 100644 __tests__/unit/aggregator/persist.js diff --git a/__tests__/unit/aggregator/persist.js b/__tests__/unit/aggregator/persist.js new file mode 100644 index 0000000..812061e --- /dev/null +++ b/__tests__/unit/aggregator/persist.js @@ -0,0 +1,54 @@ +const { persist } = require('../../../src/aggregator/persist'); +const { initDb, db, aggregateTableName } = require('../../../src/aggregator/db'); + +describe('test/unit/aggregator/persist.js', () => { + beforeAll(async (done) => { + await initDb(); + done(); + }); + + it('persist OK', async () => { + const updatedAt = new Date().toISOString(); + const key = { + updatedAt, + name: 'testSample', + }; + + const jobStartTime = Date.now(); + const result = { + jobStartTime, + queueTime: 2, + publishLatency: 4, + avgSubscribeLatency: 6, + numSubsMissed: 0, + avgEndToEndLatency: 16, + medianEndToEndLatency: 16, + ninetyFifthPercentileEndToEndLatency: 18, + isPublished: true, + isSuccessfullyEmitted: true, + numClientsAcknowledged: 2, + }; + await persist(key, result); + + dbUpdatedAt = Date.parse(updatedAt); + const res = await db.query(`select * from ${aggregateTableName} where + updated_at = ${dbUpdatedAt}`); + + const expectedRes = { + avg_end_to_end_latency: 16, + avg_subscribe_latency: 6, + is_published: true, + is_successfully_emitted: true, + job_start_time: '' + jobStartTime, + median_end_to_end_latency: 16, + ninety_fifth_percentile_end_to_end_latency: 18, + num_clients_acknowledged: 2, + num_subs_missed: 0, + publish_latency: 4, + queue_time: 2, + sample_name: 'testSample', + updated_at: '' + dbUpdatedAt, + }; + expect(res[0][0]).toEqual(expectedRes); + }); +}); diff --git a/src/aggregator/db.js b/src/aggregator/db.js index aaf1429..61c8b87 100644 --- a/src/aggregator/db.js +++ b/src/aggregator/db.js @@ -23,28 +23,28 @@ const dbConfigObjectFromDbURL = (dbUrl) => { }; }; +let alreadyInitialized = false; + /** * Create a dbconfig object from the DB URL. * @returns {Promise} - Promise resolved when the function finishes execution */ const initDb = async () => { const dbConfig = dbConfigObjectFromDbURL(dbUrl); - let alreadyInitialized = false; try { await pgtools.createdb(dbConfig, dbConfig.name); } catch (e) { if (e.message.startsWith('Attempted to create a duplicate database')) { alreadyInitialized = true; - return; }; } if (!alreadyInitialized) { const createTable = `CREATE TABLE ${aggregateTableName} ( - updated_at int, + updated_at bigint, sample_name text, - job_start_time int, + job_start_time bigint, queue_time smallint, publish_latency int, avg_subscribe_latency real, @@ -64,8 +64,6 @@ const initDb = async () => { } }; -initDb(); - module.exports = { db, initDb, diff --git a/src/aggregator/index.js b/src/aggregator/index.js index b9e259c..a7070bb 100644 --- a/src/aggregator/index.js +++ b/src/aggregator/index.js @@ -13,7 +13,7 @@ const debug = require('debug')('refocus-logging'); const consumer = require('./kafkaConsumer'); const logger = require('pino')(); -const initDb = require('./db').initDb; +const { initDb } = require('./db'); debug(`Starting client consumer-${process.pid}`); diff --git a/src/aggregator/persist.js b/src/aggregator/persist.js index 210fc07..f1b1335 100644 --- a/src/aggregator/persist.js +++ b/src/aggregator/persist.js @@ -1,24 +1,6 @@ const featureToggles = require('feature-toggles'); const { db, aggregateTableName } = require('./db'); -/** - * Key = { - * updatedAt, - * name); - * Value = { - * jobStartTime, - * queueTime, - * publishLatency, - * avgSubscribeLatency, - * numSubsMissed, - * avgEndToEndLatency, - * medianEndToEndLatency, - * ninetyFifthPercentileEndToEndLatency, - * isPublished, - * isSuccessfullyEmitted, - * numClientsAcknowledged, - * } - */ const persist = async (parsedKey, val) => { if (featureToggles.isFeatureEnabled('logPubSubStats')) { logger.info(parsedKey); @@ -28,15 +10,31 @@ const persist = async (parsedKey, val) => { const epochSampleTime = Date.parse(parsedKey.updatedAt); const sampleName = parsedKey.name; - const dbLine = `${epochSampleTime} ${sampleName} ${jobStartTime} ${queueTime} ${publishLatency} - ${avgSubscribeLatency} ${numSubsMissed} ${avgEndToEndLatency} ${medianEndToEndLatency} - ${ninetyFifthPercentileEndToEndLatency} ${isPublished} ${isSuccessfullyEmitted} ${numClientsAcknowledged}`; + const { + jobStartTime, + queueTime, + publishLatency, + avgSubscribeLatency, + numSubsMissed, + avgEndToEndLatency, + medianEndToEndLatency, + ninetyFifthPercentileEndToEndLatency, + isPublished, + isSuccessfullyEmitted, + numClientsAcknowledged, + } = val; - db.query(`INSERT INTO ${aggregateTableName} (updated_at, sample_name, job_start_time, queue_time, - publish_latency, avg_subscribe_latency, num_subs_missed, avg_end_to_end_latency, - median_end_to_end_latency, ninety_fifth_percentile_end_to_end_latency, + const dbLine = `${epochSampleTime}, '${sampleName}', ${jobStartTime}, ${queueTime}, + ${publishLatency}, ${avgSubscribeLatency}, ${numSubsMissed}, ${avgEndToEndLatency}, + ${medianEndToEndLatency}, ${ninetyFifthPercentileEndToEndLatency}, ${isPublished}, + ${isSuccessfullyEmitted}, ${numClientsAcknowledged}`; + + const res = await db.query(`INSERT INTO ${aggregateTableName} (updated_at, sample_name, + job_start_time, queue_time, publish_latency, avg_subscribe_latency, num_subs_missed, + avg_end_to_end_latency, median_end_to_end_latency, ninety_fifth_percentile_end_to_end_latency, is_published, is_successfully_emitted, num_clients_acknowledged) VALUES (${dbLine});`); + return res; }; module.exports = { From c8ea57617608a46bf02983a9fd5497ce1fb023e4 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Wed, 4 Sep 2019 16:32:21 -0700 Subject: [PATCH 14/29] fin --- app.json | 1 + 1 file changed, 1 insertion(+) diff --git a/app.json b/app.json index e4d2d09..b7572e0 100644 --- a/app.json +++ b/app.json @@ -1,4 +1,5 @@ { + "addons": ["heroku-postgresql:hobby-dev"], "environments": { "test": { "formation": { From 677c5d1e8c877121d817d3f13aa220b701abaf57 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Thu, 5 Sep 2019 09:19:14 -0700 Subject: [PATCH 15/29] fin --- src/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.js b/src/config.js index ae6ebc3..6b508e5 100644 --- a/src/config.js +++ b/src/config.js @@ -109,7 +109,7 @@ const devConfig = { idleTimeout: 1000, aggregatorTimeout: 30000, expectedEmits: 3, - dbUrl: defaultDbUrl, + dbUrl: pe.DATABASE_URL || defaultDbUrl, aggregateTableName: 'aggregates', }; From a0f8c1136e42f9dd8e873c8f1d466d2cc856a0b9 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Thu, 5 Sep 2019 09:19:27 -0700 Subject: [PATCH 16/29] fin --- src/config.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config.js b/src/config.js index 6b508e5..94d6706 100644 --- a/src/config.js +++ b/src/config.js @@ -111,7 +111,6 @@ const devConfig = { expectedEmits: 3, dbUrl: pe.DATABASE_URL || defaultDbUrl, aggregateTableName: 'aggregates', - }; const config = { From ae98b1abbcedb46309986044532bd1510a7e597b Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Thu, 5 Sep 2019 10:06:35 -0700 Subject: [PATCH 17/29] fin --- __tests__/unit/aggregator/aggregatorHandler.js | 6 +++--- src/aggregator/aggregatorHandler.js | 9 +++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/__tests__/unit/aggregator/aggregatorHandler.js b/__tests__/unit/aggregator/aggregatorHandler.js index 4a69d43..e6ff8d6 100644 --- a/__tests__/unit/aggregator/aggregatorHandler.js +++ b/__tests__/unit/aggregator/aggregatorHandler.js @@ -135,9 +135,9 @@ describe('test/unit/aggregator/aggregatorHandler.js', () => { publishLatency: 4, avgSubscribeLatency: 5, numSubsMissed: 1, - avgEndToEndLatency: NaN, - medianEndToEndLatency: NaN, - ninetyFifthPercentileEndToEndLatency: NaN, + avgEndToEndLatency: null, + medianEndToEndLatency: null, + ninetyFifthPercentileEndToEndLatency: null, isPublished: true, isSuccessfullyEmitted: false, numClientsAcknowledged: 0, diff --git a/src/aggregator/aggregatorHandler.js b/src/aggregator/aggregatorHandler.js index 846ace9..77b9c74 100644 --- a/src/aggregator/aggregatorHandler.js +++ b/src/aggregator/aggregatorHandler.js @@ -37,7 +37,7 @@ const flush = async (key) => { const isPublished = publishCompletedAt ? true : false; - const publishLatency = publishCompletedAt - jobStartTime; + const publishLatency = isPublished ? publishCompletedAt - jobStartTime : null; const avgSubscribeLatency = Array.isArray(emittedAt) ? stats.mean(emittedAt.map(emitTime => emitTime - publishCompletedAt)) : null; @@ -52,9 +52,10 @@ const flush = async (key) => { const endToEndLatency = Array.isArray(acknowledgedAt) ? acknowledgedAt.map(acknowledgeTime => acknowledgeTime - jobStartTime) : []; - const avgEndToEndLatency = stats.mean(endToEndLatency); - const ninetyFifthPercentileEndToEndLatency = stats.percentile(endToEndLatency, 0.95); - const medianEndToEndLatency = stats.median(endToEndLatency); + const avgEndToEndLatency = endToEndLatency.length > 0 ? stats.mean(endToEndLatency) : null; + const ninetyFifthPercentileEndToEndLatency = endToEndLatency.length > 0 ? + stats.percentile(endToEndLatency, 0.95) : null; + const medianEndToEndLatency = endToEndLatency.length > 0 ? stats.median(endToEndLatency) : null; const aggregatedVal = { jobStartTime, From b2e50e32f9c611439ffe3694bb11a77fcf6f8418 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Thu, 5 Sep 2019 11:19:04 -0700 Subject: [PATCH 18/29] fix --- __tests__/unit/aggregator/aggregatorHandler.js | 14 ++++++++------ __tests__/unit/aggregator/persist.js | 2 ++ src/aggregator/aggregatorHandler.js | 6 +++++- src/aggregator/db.js | 1 + src/aggregator/persist.js | 5 +++-- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/__tests__/unit/aggregator/aggregatorHandler.js b/__tests__/unit/aggregator/aggregatorHandler.js index e6ff8d6..ae1d10b 100644 --- a/__tests__/unit/aggregator/aggregatorHandler.js +++ b/__tests__/unit/aggregator/aggregatorHandler.js @@ -41,13 +41,13 @@ describe('test/unit/aggregator/aggregatorHandler.js', () => { { type: 'published', publishCompletedAt }, })); const value3 = Buffer.from(JSON.stringify({ message: - { type: 'emitted', emittedAt: emittedAt1 }, })); + { type: 'emitted', emittedAt: emittedAt1, numClientsEmittedTo: 2 }, })); const value4 = Buffer.from(JSON.stringify({ message: - { type: 'emitted', emittedAt: emittedAt2 }, })); + { type: 'emitted', emittedAt: emittedAt2, numClientsEmittedTo: 3 }, })); const value5 = Buffer.from(JSON.stringify({ message: - { type: 'emitted', emittedAt: emittedAt3 }, })); + { type: 'emitted', emittedAt: emittedAt3, numClientsEmittedTo: 1 }, })); const value6 = Buffer.from(JSON.stringify({ message: { type: 'acknowledged', acknowledgedAt: acknowledgedAt1 }, })); @@ -77,6 +77,7 @@ describe('test/unit/aggregator/aggregatorHandler.js', () => { isPublished: true, isSuccessfullyEmitted: true, numClientsAcknowledged: 2, + numClientsEmittedTo: 6, }; const persistMock = jest.spyOn(persist, 'persist'); @@ -108,13 +109,13 @@ describe('test/unit/aggregator/aggregatorHandler.js', () => { { type: 'published', publishCompletedAt }, })); const value3 = Buffer.from(JSON.stringify({ message: - { type: 'emitted', emittedAt: emittedAt1 }, })); + { type: 'emitted', emittedAt: emittedAt1, numClientsEmittedTo: 2 }, })); const value4 = Buffer.from(JSON.stringify({ message: - { type: 'emitted', emittedAt: emittedAt2 }, })); + { type: 'emitted', emittedAt: emittedAt2, numClientsEmittedTo: 3 }, })); const value5 = Buffer.from(JSON.stringify({ message: - { type: 'emitted', emittedAt: emittedAt3 }, })); + { type: 'emitted', emittedAt: emittedAt3, numClientsEmittedTo: 1 }, })); const value6 = Buffer.from(JSON.stringify({ message: { type: 'acknowledged', acknowledgedAt: acknowledgedAt1 }, })); @@ -141,6 +142,7 @@ describe('test/unit/aggregator/aggregatorHandler.js', () => { isPublished: true, isSuccessfullyEmitted: false, numClientsAcknowledged: 0, + numClientsEmittedTo: 5, }; const persistMock = jest.spyOn(persist, 'persist'); aggregationHandler(messageSet, 'foo', 0); diff --git a/__tests__/unit/aggregator/persist.js b/__tests__/unit/aggregator/persist.js index 812061e..36327bf 100644 --- a/__tests__/unit/aggregator/persist.js +++ b/__tests__/unit/aggregator/persist.js @@ -27,6 +27,7 @@ describe('test/unit/aggregator/persist.js', () => { isPublished: true, isSuccessfullyEmitted: true, numClientsAcknowledged: 2, + numClientsEmittedTo: 4, }; await persist(key, result); @@ -48,6 +49,7 @@ describe('test/unit/aggregator/persist.js', () => { queue_time: 2, sample_name: 'testSample', updated_at: '' + dbUpdatedAt, + num_clients_emitted_to: 4, }; expect(res[0][0]).toEqual(expectedRes); }); diff --git a/src/aggregator/aggregatorHandler.js b/src/aggregator/aggregatorHandler.js index 77b9c74..3f13821 100644 --- a/src/aggregator/aggregatorHandler.js +++ b/src/aggregator/aggregatorHandler.js @@ -57,6 +57,8 @@ const flush = async (key) => { stats.percentile(endToEndLatency, 0.95) : null; const medianEndToEndLatency = endToEndLatency.length > 0 ? stats.median(endToEndLatency) : null; + console.log(numClientsEmittedTo); + const aggregatedVal = { jobStartTime, queueTime, @@ -68,6 +70,7 @@ const flush = async (key) => { ninetyFifthPercentileEndToEndLatency, isPublished, isSuccessfullyEmitted, + numClientsEmittedTo: numClientsEmittedTo || 0, numClientsAcknowledged, }; const parsedKey = JSON.parse(key); @@ -122,7 +125,8 @@ const emittedHandler = (message, key) => { aggregateMapVal.emittedAt = [emittedAt]; }; - aggregateMapVal.numClientsEmittedTo = aggregateMapVal.numClientsEmittedTo + numClientsEmittedTo; + aggregateMapVal.numClientsEmittedTo = (aggregateMapVal.numClientsEmittedTo || 0) + + numClientsEmittedTo; } }; diff --git a/src/aggregator/db.js b/src/aggregator/db.js index 61c8b87..666c8c7 100644 --- a/src/aggregator/db.js +++ b/src/aggregator/db.js @@ -54,6 +54,7 @@ const initDb = async () => { ninety_fifth_percentile_end_to_end_latency real, is_published bool, is_successfully_emitted bool, + num_clients_emitted_to smallint, num_clients_acknowledged smallint );`; diff --git a/src/aggregator/persist.js b/src/aggregator/persist.js index f1b1335..c70d3cb 100644 --- a/src/aggregator/persist.js +++ b/src/aggregator/persist.js @@ -22,17 +22,18 @@ const persist = async (parsedKey, val) => { isPublished, isSuccessfullyEmitted, numClientsAcknowledged, + numClientsEmittedTo, } = val; const dbLine = `${epochSampleTime}, '${sampleName}', ${jobStartTime}, ${queueTime}, ${publishLatency}, ${avgSubscribeLatency}, ${numSubsMissed}, ${avgEndToEndLatency}, ${medianEndToEndLatency}, ${ninetyFifthPercentileEndToEndLatency}, ${isPublished}, - ${isSuccessfullyEmitted}, ${numClientsAcknowledged}`; + ${isSuccessfullyEmitted}, ${numClientsEmittedTo}, ${numClientsAcknowledged}`; const res = await db.query(`INSERT INTO ${aggregateTableName} (updated_at, sample_name, job_start_time, queue_time, publish_latency, avg_subscribe_latency, num_subs_missed, avg_end_to_end_latency, median_end_to_end_latency, ninety_fifth_percentile_end_to_end_latency, - is_published, is_successfully_emitted, num_clients_acknowledged) + is_published, is_successfully_emitted, num_clients_emitted_to, num_clients_acknowledged) VALUES (${dbLine});`); return res; }; From 706b251ef94c004c6229bafbdc583f018a627758 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Thu, 5 Sep 2019 15:36:01 -0700 Subject: [PATCH 19/29] remove postgres logging --- src/aggregator/aggregatorHandler.js | 2 -- src/aggregator/db.js | 4 +++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/aggregator/aggregatorHandler.js b/src/aggregator/aggregatorHandler.js index 3f13821..b4e786e 100644 --- a/src/aggregator/aggregatorHandler.js +++ b/src/aggregator/aggregatorHandler.js @@ -57,8 +57,6 @@ const flush = async (key) => { stats.percentile(endToEndLatency, 0.95) : null; const medianEndToEndLatency = endToEndLatency.length > 0 ? stats.median(endToEndLatency) : null; - console.log(numClientsEmittedTo); - const aggregatedVal = { jobStartTime, queueTime, diff --git a/src/aggregator/db.js b/src/aggregator/db.js index 666c8c7..75f9fd0 100644 --- a/src/aggregator/db.js +++ b/src/aggregator/db.js @@ -3,7 +3,9 @@ const { dbUrl, aggregateTableName } = require('../config').getConfig(); const pgtools = require('pgtools'); const url = require('url'); -const db = new Sequelize(dbUrl); +const db = new Sequelize(dbUrl, { + logging: false, +}); /** * Create a dbconfig object from the DB URL. From 38376401f7085e12bdb849d376ca95c4360d1b2a Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Fri, 6 Sep 2019 11:25:55 -0700 Subject: [PATCH 20/29] add debug stuff --- src/aggregator/index.js | 3 +++ src/aggregator/persist.js | 17 +++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/aggregator/index.js b/src/aggregator/index.js index a7070bb..8e4a686 100644 --- a/src/aggregator/index.js +++ b/src/aggregator/index.js @@ -22,6 +22,9 @@ const errorHandler = (message) => { }; initDb().then(() => { + logger.info('DB has been initialized'); consumer.initConsumer(errorHandler); +}).catch(() => { + logger.info('DB intialize failed'); }); diff --git a/src/aggregator/persist.js b/src/aggregator/persist.js index c70d3cb..1da29f5 100644 --- a/src/aggregator/persist.js +++ b/src/aggregator/persist.js @@ -1,5 +1,6 @@ const featureToggles = require('feature-toggles'); const { db, aggregateTableName } = require('./db'); +const logger = require('pino')(); const persist = async (parsedKey, val) => { if (featureToggles.isFeatureEnabled('logPubSubStats')) { @@ -30,12 +31,16 @@ const persist = async (parsedKey, val) => { ${medianEndToEndLatency}, ${ninetyFifthPercentileEndToEndLatency}, ${isPublished}, ${isSuccessfullyEmitted}, ${numClientsEmittedTo}, ${numClientsAcknowledged}`; - const res = await db.query(`INSERT INTO ${aggregateTableName} (updated_at, sample_name, - job_start_time, queue_time, publish_latency, avg_subscribe_latency, num_subs_missed, - avg_end_to_end_latency, median_end_to_end_latency, ninety_fifth_percentile_end_to_end_latency, - is_published, is_successfully_emitted, num_clients_emitted_to, num_clients_acknowledged) - VALUES (${dbLine});`); - return res; + try { + const res = await db.query(`INSERT INTO ${aggregateTableName} (updated_at, sample_name, + job_start_time, queue_time, publish_latency, avg_subscribe_latency, num_subs_missed, + avg_end_to_end_latency, median_end_to_end_latency, ninety_fifth_percentile_end_to_end_latency, + is_published, is_successfully_emitted, num_clients_emitted_to, num_clients_acknowledged) + VALUES (${dbLine});`); + return res; + } catch (e) { + logger.info(`Insert failed ${e.message}`); + } }; module.exports = { From 3578a6b2df855bd3f4eb5c60f1482d81ef58b441 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Fri, 6 Sep 2019 11:31:55 -0700 Subject: [PATCH 21/29] add debug stuff --- src/aggregator/persist.js | 63 +++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/src/aggregator/persist.js b/src/aggregator/persist.js index 1da29f5..6cae974 100644 --- a/src/aggregator/persist.js +++ b/src/aggregator/persist.js @@ -6,40 +6,39 @@ const persist = async (parsedKey, val) => { if (featureToggles.isFeatureEnabled('logPubSubStats')) { logger.info(parsedKey); logger.info(val); - } - - const epochSampleTime = Date.parse(parsedKey.updatedAt); - const sampleName = parsedKey.name; - - const { - jobStartTime, - queueTime, - publishLatency, - avgSubscribeLatency, - numSubsMissed, - avgEndToEndLatency, - medianEndToEndLatency, - ninetyFifthPercentileEndToEndLatency, - isPublished, - isSuccessfullyEmitted, - numClientsAcknowledged, - numClientsEmittedTo, - } = val; + } else { + const epochSampleTime = Date.parse(parsedKey.updatedAt); + const sampleName = parsedKey.name; + const { + jobStartTime, + queueTime, + publishLatency, + avgSubscribeLatency, + numSubsMissed, + avgEndToEndLatency, + medianEndToEndLatency, + ninetyFifthPercentileEndToEndLatency, + isPublished, + isSuccessfullyEmitted, + numClientsAcknowledged, + numClientsEmittedTo, + } = val; - const dbLine = `${epochSampleTime}, '${sampleName}', ${jobStartTime}, ${queueTime}, - ${publishLatency}, ${avgSubscribeLatency}, ${numSubsMissed}, ${avgEndToEndLatency}, - ${medianEndToEndLatency}, ${ninetyFifthPercentileEndToEndLatency}, ${isPublished}, - ${isSuccessfullyEmitted}, ${numClientsEmittedTo}, ${numClientsAcknowledged}`; + const dbLine = `${epochSampleTime}, '${sampleName}', ${jobStartTime}, ${queueTime}, + ${publishLatency}, ${avgSubscribeLatency}, ${numSubsMissed}, ${avgEndToEndLatency}, + ${medianEndToEndLatency}, ${ninetyFifthPercentileEndToEndLatency}, ${isPublished}, + ${isSuccessfullyEmitted}, ${numClientsEmittedTo}, ${numClientsAcknowledged}`; - try { - const res = await db.query(`INSERT INTO ${aggregateTableName} (updated_at, sample_name, - job_start_time, queue_time, publish_latency, avg_subscribe_latency, num_subs_missed, - avg_end_to_end_latency, median_end_to_end_latency, ninety_fifth_percentile_end_to_end_latency, - is_published, is_successfully_emitted, num_clients_emitted_to, num_clients_acknowledged) - VALUES (${dbLine});`); - return res; - } catch (e) { - logger.info(`Insert failed ${e.message}`); + try { + const res = await db.query(`INSERT INTO ${aggregateTableName} (updated_at, sample_name, + job_start_time, queue_time, publish_latency, avg_subscribe_latency, num_subs_missed, + avg_end_to_end_latency, median_end_to_end_latency, ninety_fifth_percentile_end_to_end_latency, + is_published, is_successfully_emitted, num_clients_emitted_to, num_clients_acknowledged) + VALUES (${dbLine});`); + return res; + } catch (e) { + logger.info(`Insert failed ${e.message}`); + } } }; From 41976a4d6e74381950da59a9bbbf09a34c8feaff Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Fri, 6 Sep 2019 11:33:24 -0700 Subject: [PATCH 22/29] add debug stuff --- src/aggregator/persist.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/aggregator/persist.js b/src/aggregator/persist.js index 6cae974..4e1f169 100644 --- a/src/aggregator/persist.js +++ b/src/aggregator/persist.js @@ -32,8 +32,9 @@ const persist = async (parsedKey, val) => { try { const res = await db.query(`INSERT INTO ${aggregateTableName} (updated_at, sample_name, job_start_time, queue_time, publish_latency, avg_subscribe_latency, num_subs_missed, - avg_end_to_end_latency, median_end_to_end_latency, ninety_fifth_percentile_end_to_end_latency, - is_published, is_successfully_emitted, num_clients_emitted_to, num_clients_acknowledged) + avg_end_to_end_latency, median_end_to_end_latency, + ninety_fifth_percentile_end_to_end_latency, is_published, is_successfully_emitted, + num_clients_emitted_to, num_clients_acknowledged) VALUES (${dbLine});`); return res; } catch (e) { From d92cccbb4ac96fa0d8bfb2f08599d96f48c8f0fb Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Fri, 6 Sep 2019 13:18:51 -0700 Subject: [PATCH 23/29] fix --- src/aggregator/db.js | 2 ++ src/aggregator/persist.js | 64 +++++++++++++++++++-------------------- src/config.js | 2 +- 3 files changed, 35 insertions(+), 33 deletions(-) diff --git a/src/aggregator/db.js b/src/aggregator/db.js index 75f9fd0..99bbccf 100644 --- a/src/aggregator/db.js +++ b/src/aggregator/db.js @@ -2,6 +2,7 @@ const Sequelize = require('sequelize'); const { dbUrl, aggregateTableName } = require('../config').getConfig(); const pgtools = require('pgtools'); const url = require('url'); +const logger = require('pino')(); const db = new Sequelize(dbUrl, { logging: false, @@ -36,6 +37,7 @@ const initDb = async () => { try { await pgtools.createdb(dbConfig, dbConfig.name); } catch (e) { + logger.error(); if (e.message.startsWith('Attempted to create a duplicate database')) { alreadyInitialized = true; }; diff --git a/src/aggregator/persist.js b/src/aggregator/persist.js index 4e1f169..673c8f4 100644 --- a/src/aggregator/persist.js +++ b/src/aggregator/persist.js @@ -6,40 +6,40 @@ const persist = async (parsedKey, val) => { if (featureToggles.isFeatureEnabled('logPubSubStats')) { logger.info(parsedKey); logger.info(val); - } else { - const epochSampleTime = Date.parse(parsedKey.updatedAt); - const sampleName = parsedKey.name; - const { - jobStartTime, - queueTime, - publishLatency, - avgSubscribeLatency, - numSubsMissed, - avgEndToEndLatency, - medianEndToEndLatency, - ninetyFifthPercentileEndToEndLatency, - isPublished, - isSuccessfullyEmitted, - numClientsAcknowledged, - numClientsEmittedTo, - } = val; + } + + const epochSampleTime = Date.parse(parsedKey.updatedAt); + const sampleName = parsedKey.name; + const { + jobStartTime, + queueTime, + publishLatency, + avgSubscribeLatency, + numSubsMissed, + avgEndToEndLatency, + medianEndToEndLatency, + ninetyFifthPercentileEndToEndLatency, + isPublished, + isSuccessfullyEmitted, + numClientsAcknowledged, + numClientsEmittedTo, + } = val; - const dbLine = `${epochSampleTime}, '${sampleName}', ${jobStartTime}, ${queueTime}, - ${publishLatency}, ${avgSubscribeLatency}, ${numSubsMissed}, ${avgEndToEndLatency}, - ${medianEndToEndLatency}, ${ninetyFifthPercentileEndToEndLatency}, ${isPublished}, - ${isSuccessfullyEmitted}, ${numClientsEmittedTo}, ${numClientsAcknowledged}`; + const dbLine = `${epochSampleTime}, '${sampleName}', ${jobStartTime}, ${queueTime}, + ${publishLatency}, ${avgSubscribeLatency}, ${numSubsMissed}, ${avgEndToEndLatency}, + ${medianEndToEndLatency}, ${ninetyFifthPercentileEndToEndLatency}, ${isPublished}, + ${isSuccessfullyEmitted}, ${numClientsEmittedTo}, ${numClientsAcknowledged}`; - try { - const res = await db.query(`INSERT INTO ${aggregateTableName} (updated_at, sample_name, - job_start_time, queue_time, publish_latency, avg_subscribe_latency, num_subs_missed, - avg_end_to_end_latency, median_end_to_end_latency, - ninety_fifth_percentile_end_to_end_latency, is_published, is_successfully_emitted, - num_clients_emitted_to, num_clients_acknowledged) - VALUES (${dbLine});`); - return res; - } catch (e) { - logger.info(`Insert failed ${e.message}`); - } + try { + const res = await db.query(`INSERT INTO ${aggregateTableName} (updated_at, sample_name, + job_start_time, queue_time, publish_latency, avg_subscribe_latency, num_subs_missed, + avg_end_to_end_latency, median_end_to_end_latency, + ninety_fifth_percentile_end_to_end_latency, is_published, is_successfully_emitted, + num_clients_emitted_to, num_clients_acknowledged) + VALUES (${dbLine});`); + return res; + } catch (e) { + logger.info(`Insert failed ${e.message}`); } }; diff --git a/src/config.js b/src/config.js index 94d6706..a0e90e4 100644 --- a/src/config.js +++ b/src/config.js @@ -94,7 +94,7 @@ const herokuConfig = { aggregatorTimeout: getAggregatorTimeout(pe.FLUSH_TO_PERSISTENCE_AFTER), expectedEmits: pe.NUM_REALTIME_PROCESSES || 3, dbUrl: pe.DATABASE_URL, - aggregateTableName: pe.AGGREGATE_TABLE_NAME, + aggregateTableName: pe.AGGREGATE_TABLE_NAME || 'aggregates', }; const devConfig = { From 8d8f971ceb61168551ac480d8ded255f3078dcb7 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Fri, 6 Sep 2019 13:24:00 -0700 Subject: [PATCH 24/29] fix --- src/aggregator/persist.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aggregator/persist.js b/src/aggregator/persist.js index 673c8f4..413c1d2 100644 --- a/src/aggregator/persist.js +++ b/src/aggregator/persist.js @@ -39,7 +39,7 @@ const persist = async (parsedKey, val) => { VALUES (${dbLine});`); return res; } catch (e) { - logger.info(`Insert failed ${e.message}`); + logger.info(`Insert failed ${e}`); } }; From 1ffd25bea5cc5186d631efecc9834efc79efa898 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Fri, 6 Sep 2019 13:25:54 -0700 Subject: [PATCH 25/29] fix --- src/aggregator/db.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aggregator/db.js b/src/aggregator/db.js index 99bbccf..93cac1a 100644 --- a/src/aggregator/db.js +++ b/src/aggregator/db.js @@ -37,7 +37,7 @@ const initDb = async () => { try { await pgtools.createdb(dbConfig, dbConfig.name); } catch (e) { - logger.error(); + logger.error(`Error in init db: ${e}`); if (e.message.startsWith('Attempted to create a duplicate database')) { alreadyInitialized = true; }; From 46497aa4b0a44c999cd550a94bf64da57b8bf0f4 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Fri, 6 Sep 2019 13:32:01 -0700 Subject: [PATCH 26/29] fix --- src/aggregator/db.js | 47 +++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/src/aggregator/db.js b/src/aggregator/db.js index 93cac1a..6736919 100644 --- a/src/aggregator/db.js +++ b/src/aggregator/db.js @@ -38,35 +38,32 @@ const initDb = async () => { await pgtools.createdb(dbConfig, dbConfig.name); } catch (e) { logger.error(`Error in init db: ${e}`); - if (e.message.startsWith('Attempted to create a duplicate database')) { - alreadyInitialized = true; - }; + return; } - if (!alreadyInitialized) { - const createTable = `CREATE TABLE ${aggregateTableName} - ( - updated_at bigint, - sample_name text, - job_start_time bigint, - queue_time smallint, - publish_latency int, - avg_subscribe_latency real, - num_subs_missed smallint, - avg_end_to_end_latency real, - median_end_to_end_latency real, - ninety_fifth_percentile_end_to_end_latency real, - is_published bool, - is_successfully_emitted bool, - num_clients_emitted_to smallint, - num_clients_acknowledged smallint - );`; + const createTable = `CREATE TABLE ${aggregateTableName} + ( + updated_at bigint, + sample_name text, + job_start_time bigint, + queue_time smallint, + publish_latency int, + avg_subscribe_latency real, + num_subs_missed smallint, + avg_end_to_end_latency real, + median_end_to_end_latency real, + ninety_fifth_percentile_end_to_end_latency real, + is_published bool, + is_successfully_emitted bool, + num_clients_emitted_to smallint, + num_clients_acknowledged smallint + );`; - await db.query(createTable); + await db.query(createTable); - await db.query(`CREATE UNIQUE INDEX range_query_index - on ${aggregateTableName} (updated_at, sample_name);`); - } + await db.query(`CREATE UNIQUE INDEX range_query_index + on ${aggregateTableName} (updated_at, sample_name);`); + }; module.exports = { From 1adcea7678e58b1e5dc576ed64ddae8c12ebc4d3 Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Fri, 6 Sep 2019 13:38:02 -0700 Subject: [PATCH 27/29] fix --- src/aggregator/db.js | 1 - src/aggregator/persist.js | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/aggregator/db.js b/src/aggregator/db.js index 6736919..dd923c8 100644 --- a/src/aggregator/db.js +++ b/src/aggregator/db.js @@ -63,7 +63,6 @@ const initDb = async () => { await db.query(`CREATE UNIQUE INDEX range_query_index on ${aggregateTableName} (updated_at, sample_name);`); - }; module.exports = { diff --git a/src/aggregator/persist.js b/src/aggregator/persist.js index 413c1d2..38070d9 100644 --- a/src/aggregator/persist.js +++ b/src/aggregator/persist.js @@ -30,6 +30,8 @@ const persist = async (parsedKey, val) => { ${medianEndToEndLatency}, ${ninetyFifthPercentileEndToEndLatency}, ${isPublished}, ${isSuccessfullyEmitted}, ${numClientsEmittedTo}, ${numClientsAcknowledged}`; + logger.info('The key updated_at, sampleName is:' + epochSampleTime + ', ' + sampleName); + try { const res = await db.query(`INSERT INTO ${aggregateTableName} (updated_at, sample_name, job_start_time, queue_time, publish_latency, avg_subscribe_latency, num_subs_missed, From bb23d1aa7cadc8cabd0f0f64eddc4033b45f13ed Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Fri, 6 Sep 2019 13:42:34 -0700 Subject: [PATCH 28/29] fix --- src/aggregator/persist.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aggregator/persist.js b/src/aggregator/persist.js index 38070d9..e7451fd 100644 --- a/src/aggregator/persist.js +++ b/src/aggregator/persist.js @@ -9,7 +9,7 @@ const persist = async (parsedKey, val) => { } const epochSampleTime = Date.parse(parsedKey.updatedAt); - const sampleName = parsedKey.name; + const sampleName = parsedKey.sampleName; const { jobStartTime, queueTime, From f00c0edfdd5c0b540e8c166a87e63e5d00bf3c7a Mon Sep 17 00:00:00 2001 From: Deepanshu Gupta Date: Fri, 6 Sep 2019 13:48:15 -0700 Subject: [PATCH 29/29] fix --- __tests__/unit/aggregator/aggregatorHandler.js | 4 ++-- __tests__/unit/aggregator/persist.js | 2 +- src/aggregator/aggregatorHandler.js | 2 +- src/aggregator/persist.js | 2 -- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/__tests__/unit/aggregator/aggregatorHandler.js b/__tests__/unit/aggregator/aggregatorHandler.js index ae1d10b..3d66e02 100644 --- a/__tests__/unit/aggregator/aggregatorHandler.js +++ b/__tests__/unit/aggregator/aggregatorHandler.js @@ -21,7 +21,7 @@ describe('test/unit/aggregator/aggregatorHandler.js', () => { it('end-to-end OK', () => { const key = Buffer.from(JSON.stringify({ updatedAt: new Date().toISOString(), - name: 'testSample', + sampleName: 'testSample', })); const reqStartTime = Date.now(); @@ -89,7 +89,7 @@ describe('test/unit/aggregator/aggregatorHandler.js', () => { it('Does not include messages received after timeout', () => { const key = Buffer.from(JSON.stringify({ updatedAt: new Date().toISOString(), - name: 'testSample', + sampleName: 'testSample', })); const reqStartTime = Date.now(); diff --git a/__tests__/unit/aggregator/persist.js b/__tests__/unit/aggregator/persist.js index 36327bf..9e5bc24 100644 --- a/__tests__/unit/aggregator/persist.js +++ b/__tests__/unit/aggregator/persist.js @@ -11,7 +11,7 @@ describe('test/unit/aggregator/persist.js', () => { const updatedAt = new Date().toISOString(); const key = { updatedAt, - name: 'testSample', + sampleName: 'testSample', }; const jobStartTime = Date.now(); diff --git a/src/aggregator/aggregatorHandler.js b/src/aggregator/aggregatorHandler.js index b4e786e..1165c33 100644 --- a/src/aggregator/aggregatorHandler.js +++ b/src/aggregator/aggregatorHandler.js @@ -18,7 +18,7 @@ const { aggregatorTimeout, expectedEmits } = require('../config').getConfig(); /** * Key = JSON.stringify({ * updatedAt, - * name, + * sampleName, * }); */ const aggregateMap = new Map(); diff --git a/src/aggregator/persist.js b/src/aggregator/persist.js index e7451fd..d1e9be3 100644 --- a/src/aggregator/persist.js +++ b/src/aggregator/persist.js @@ -30,8 +30,6 @@ const persist = async (parsedKey, val) => { ${medianEndToEndLatency}, ${ninetyFifthPercentileEndToEndLatency}, ${isPublished}, ${isSuccessfullyEmitted}, ${numClientsEmittedTo}, ${numClientsAcknowledged}`; - logger.info('The key updated_at, sampleName is:' + epochSampleTime + ', ' + sampleName); - try { const res = await db.query(`INSERT INTO ${aggregateTableName} (updated_at, sample_name, job_start_time, queue_time, publish_latency, avg_subscribe_latency, num_subs_missed,