diff --git a/.travis.yml b/.travis.yml
index 3e07322..f6d6bea 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,7 +3,6 @@ node_js:
- 11
- 10
- 8
-- 6
before_install:
- sudo apt-get -qq update
- sudo apt-get install -y gawk jq
diff --git a/package.json b/package.json
index dfcc268..69f8241 100644
--- a/package.json
+++ b/package.json
@@ -12,6 +12,9 @@
"gh-pages": "^1.1.0",
"ink-docstrap": "^1.3.2",
"jsdoc": "^3.5.5",
+ "koa": "^2.13.0",
+ "koa-bodyparser": "^4.3.0",
+ "koa-router": "^9.1.0",
"lerna": "^2.11.0",
"mocha": "^5.1.1",
"mocha-lcov-reporter": "^1.3.0",
diff --git a/packages/measured-node-metrics/lib/index.js b/packages/measured-node-metrics/lib/index.js
index f85a226..b93d82e 100644
--- a/packages/measured-node-metrics/lib/index.js
+++ b/packages/measured-node-metrics/lib/index.js
@@ -1,6 +1,6 @@
const { nodeProcessMetrics, createProcessMetrics } = require('./nodeProcessMetrics');
const { nodeOsMetrics, createOSMetrics } = require('./nodeOsMetrics');
-const { createExpressMiddleware, onRequestStart, onRequestEnd } = require('./nodeHttpRequestMetrics');
+const { createExpressMiddleware, createKoaMiddleware, onRequestStart, onRequestEnd } = require('./nodeHttpRequestMetrics');
/**
* The main module for the measured-node-metrics lib.
@@ -69,6 +69,18 @@ module.exports = {
*/
createExpressMiddleware,
+ /**
+ * Creates a Koa middleware that reports a timer on request data.
+ * With this middleware you will get requests counts and latency percentiles all filterable by status codes, http method, and uri paths.
+ *
+ * @function
+ * @name createExpressMiddleware
+ * @param {SelfReportingMetricsRegistry} metricsRegistry
+ * @param {number} [reportingIntervalInSeconds]
+ * @return {Function}
+ */
+ createKoaMiddleware,
+
/**
* At the start of the request, create a stopwatch, that starts tracking how long the request is taking.
* @function
diff --git a/packages/measured-node-metrics/lib/nodeHttpRequestMetrics.js b/packages/measured-node-metrics/lib/nodeHttpRequestMetrics.js
index dae7c20..c5b5a0e 100644
--- a/packages/measured-node-metrics/lib/nodeHttpRequestMetrics.js
+++ b/packages/measured-node-metrics/lib/nodeHttpRequestMetrics.js
@@ -7,7 +7,7 @@ const { Stopwatch } = require('measured-core');
const DEFAULT_REQUEST_METRICS_REPORTING_INTERVAL_IN_SECONDS = 10;
/**
- * This module has functions needed to create middlewares for frameworks such as express.
+ * This module has functions needed to create middlewares for frameworks such as express and koa.
* It also exports the 2 functions needed to implement your own middleware.
* If you implement a middleware for a framework not implemented here, please contribute it back.
*
@@ -37,6 +37,28 @@ module.exports = {
};
},
+ /**
+ * Creates a Koa middleware that reports a timer on request data.
+ * With this middleware you will get requests counts and latency percentiles all filterable by status codes, http method, and uri paths.
+ *
+ * @param {SelfReportingMetricsRegistry} metricsRegistry
+ * @param {number} [reportingIntervalInSeconds]
+ * @return {Function}
+ */
+ createKoaMiddleware: (metricsRegistry, reportingIntervalInSeconds) => async (ctx, next) => {
+ const stopwatch = module.exports.onRequestStart();
+ const { req, res } = ctx;
+
+ res.once('finish', () => {
+ const { method } = req;
+ const { statusCode } = res;
+ const uri = ctx._matchedRoute || '_unknown';
+ module.exports.onRequestEnd(metricsRegistry, stopwatch, method, statusCode, uri, reportingIntervalInSeconds);
+ });
+
+ await next();
+ },
+
/**
* At the start of the request, create a stopwatch, that starts tracking how long the request is taking.
* @return {Stopwatch}
diff --git a/packages/measured-node-metrics/test/integration/test-express-middleware.js b/packages/measured-node-metrics/test/integration/test-express-middleware.js
index f279531..76a44c9 100644
--- a/packages/measured-node-metrics/test/integration/test-express-middleware.js
+++ b/packages/measured-node-metrics/test/integration/test-express-middleware.js
@@ -50,22 +50,20 @@ describe('express-middleware', () => {
assert(registeredKeys.length === 1);
assert.equal(registeredKeys[0], 'requests-GET-200-/hello');
const metricWrapper = registry._registry.getMetricWrapperByKey('requests-GET-200-/hello');
- const name = metricWrapper.name;
- const dimensions = metricWrapper.dimensions;
+ const { name, dimensions } = metricWrapper;
assert.equal(name, 'requests');
assert.deepEqual(dimensions, { statusCode: '200', method: 'GET', uri: '/hello' });
});
});
it('creates a single timer that has 1 count for requests, when an http POST call is made once', () => {
- const options = {method: 'POST', headers: {'Content-Type': 'application/json'}};
+ const options = { method: 'POST', headers: { 'Content-Type': 'application/json' } };
return callLocalHost(port, 'world', options).then(() => {
const registeredKeys = registry._registry.allKeys();
assert(registeredKeys.length === 1);
assert.equal(registeredKeys[0], 'requests-POST-201-/world');
const metricWrapper = registry._registry.getMetricWrapperByKey('requests-POST-201-/world');
- const name = metricWrapper.name;
- const dimensions = metricWrapper.dimensions;
+ const { name, dimensions } = metricWrapper;
assert.equal(name, 'requests');
assert.deepEqual(dimensions, { statusCode: '201', method: 'POST', uri: '/world' });
});
@@ -84,12 +82,12 @@ describe('express-middleware', () => {
const callLocalHost = (port, endpoint, options) => {
return new Promise((resolve, reject) => {
- const req = Object.assign({protocol: `http:`,
- host: `127.0.0.1`,
- port: `${port}`,
- path: `/${endpoint}`,
- method: 'GET'},
- options || {});
+ const req = Object.assign({ protocol: 'http:',
+ host: '127.0.0.1',
+ port: `${port}`,
+ path: `/${endpoint}`,
+ method: 'GET' },
+ options || {});
http
.request(req, resp => {
let data = '';
@@ -106,6 +104,6 @@ const callLocalHost = (port, endpoint, options) => {
console.log('Error: ', JSON.stringify(err));
reject();
})
- .end();
+ .end();
});
};
diff --git a/packages/measured-node-metrics/test/integration/test-koa-middleware.js b/packages/measured-node-metrics/test/integration/test-koa-middleware.js
new file mode 100644
index 0000000..06f8152
--- /dev/null
+++ b/packages/measured-node-metrics/test/integration/test-koa-middleware.js
@@ -0,0 +1,124 @@
+const Koa = require('koa');
+const KoaBodyParser = require('koa-bodyparser');
+const Router = require('koa-router');
+const Registry = require('measured-reporting').SelfReportingMetricsRegistry;
+const TestReporter = require('../unit/TestReporter');
+const { createKoaMiddleware } = require('../../lib');
+const findFreePort = require('find-free-port');
+const assert = require('assert');
+const http = require('http');
+
+describe('koa-middleware', () => {
+ let port;
+ let reporter;
+ let registry;
+ let middleware;
+ let app;
+ let httpServer;
+ let router;
+ beforeEach(() => {
+ return new Promise(resolve => {
+ reporter = new TestReporter();
+ registry = new Registry(reporter);
+ middleware = createKoaMiddleware(registry, 1);
+ app = new Koa();
+ router = new Router();
+
+ router.get('/hello', ({ response }) => {
+ response.body = 'Hello World!';
+ return response;
+ });
+ router.post('/world', ({ response }) => {
+ response.body = 'Hello World!';
+ response.status = 201;
+ return response;
+ });
+ router.get('/users/:userId', ({ params, response }) => {
+ response.body = `id: ${params.userId}`;
+ return response;
+ });
+
+ app.use(middleware);
+ app.use(KoaBodyParser());
+ app.use(router.routes());
+ app.use(router.allowedMethods());
+
+ app.on('error', (err) => console.error(err));
+
+ findFreePort(3000).then(portArr => {
+ port = portArr.shift();
+
+ httpServer = app.listen(port);
+ resolve();
+ });
+ });
+ });
+
+ afterEach(() => {
+ httpServer.close();
+ registry.shutdown();
+ });
+
+ it('creates a single timer that has 1 count for requests, when an http call is made once', () => {
+ return callLocalHost(port, 'hello').then(() => {
+ const registeredKeys = registry._registry.allKeys();
+ assert(registeredKeys.length === 1);
+ assert.equal(registeredKeys[0], 'requests-GET-200-/hello');
+ const metricWrapper = registry._registry.getMetricWrapperByKey('requests-GET-200-/hello');
+ const { name, dimensions } = metricWrapper;
+ assert.equal(name, 'requests');
+ assert.deepEqual(dimensions, { statusCode: '200', method: 'GET', uri: '/hello' });
+ });
+ });
+
+ it('creates a single timer that has 1 count for requests, when an http POST call is made once', () => {
+ const options = { method: 'POST', headers: { 'Content-Type': 'application/json' } };
+ return callLocalHost(port, 'world', options).then(() => {
+ const registeredKeys = registry._registry.allKeys();
+ assert(registeredKeys.length === 1);
+ assert.equal(registeredKeys[0], 'requests-POST-201-/world');
+ const metricWrapper = registry._registry.getMetricWrapperByKey('requests-POST-201-/world');
+ const { name, dimensions } = metricWrapper;
+ assert.equal(name, 'requests');
+ assert.deepEqual(dimensions, { statusCode: '201', method: 'POST', uri: '/world' });
+ });
+ });
+
+ it('does not create runaway n metrics in the registry for n ids in the path', () => {
+ return Promise.all([
+ callLocalHost(port, 'users/foo'),
+ callLocalHost(port, 'users/bar'),
+ callLocalHost(port, 'users/bop')
+ ]).then(() => {
+ assert.equal(registry._registry.allKeys().length, 1, 'There should only be one metric for /users and GET');
+ });
+ });
+});
+
+const callLocalHost = (port, endpoint, options) => {
+ return new Promise((resolve, reject) => {
+ const req = Object.assign({ protocol: 'http:',
+ host: '127.0.0.1',
+ port: `${port}`,
+ path: `/${endpoint}`,
+ method: 'GET' },
+ options || {});
+ http
+ .request(req, resp => {
+ let data = '';
+ resp.on('data', chunk => {
+ data += chunk;
+ });
+
+ resp.on('end', () => {
+ console.log(JSON.stringify(data));
+ resolve();
+ });
+ })
+ .on('error', err => {
+ console.log('Error: ', JSON.stringify(err));
+ reject();
+ })
+ .end();
+ });
+};
diff --git a/packages/measured-node-metrics/test/unit/test-nodeHttpRequestMetrics.js b/packages/measured-node-metrics/test/unit/test-nodeHttpRequestMetrics.js
index d82db95..238d256 100644
--- a/packages/measured-node-metrics/test/unit/test-nodeHttpRequestMetrics.js
+++ b/packages/measured-node-metrics/test/unit/test-nodeHttpRequestMetrics.js
@@ -2,7 +2,7 @@
const assert = require('assert');
const EventEmitter = require('events');
const { Stopwatch } = require('measured-core');
-const { createExpressMiddleware, onRequestStart, onRequestEnd } = require('../../lib');
+const { createExpressMiddleware, createKoaMiddleware, onRequestStart, onRequestEnd } = require('../../lib');
const TestReporter = require('./TestReporter');
const Registry = require('measured-reporting').SelfReportingMetricsRegistry;
@@ -55,7 +55,7 @@ describe('createExpressMiddleware', () => {
middleware(
{
method: 'GET',
- routine: {path: '/v1/rest/some-end-point'}
+ routine: { path: '/v1/rest/some-end-point' }
},
res,
() => {}
@@ -68,3 +68,30 @@ describe('createExpressMiddleware', () => {
registry.shutdown();
});
});
+
+describe('createKoaMiddleware', () => {
+ it('creates and registers a metric called request that is a timer', async () => {
+ const reporter = new TestReporter();
+ const registry = new Registry(reporter);
+
+ const middleware = createKoaMiddleware(registry);
+
+ const res = new MockResponse();
+ middleware(
+ {
+ req: {
+ method: 'GET',
+ url: '/v1/rest/some-end-point',
+ },
+ res,
+ },
+ () => Promise.resolve()
+ ).then(() => {
+ const registeredKeys = registry._registry.allKeys();
+ assert(registeredKeys.length === 1);
+ assert(registeredKeys[0].includes('requests-GET'));
+ registry.shutdown();
+ });
+ res.finish();
+ });
+});
diff --git a/tutorials/SignalFx Koa Full End to End Example.md b/tutorials/SignalFx Koa Full End to End Example.md
new file mode 100644
index 0000000..4225a6f
--- /dev/null
+++ b/tutorials/SignalFx Koa Full End to End Example.md
@@ -0,0 +1,91 @@
+### Using Measured to instrument OS, Process and Koa Metrics.
+
+This tutorial shows how to use the measured libraries to fully instrument OS and Node Process metrics as well as create a Koa middleware.
+
+The middleware will measure request count, latency distributions (req/res time histogram) and add dimensions to make it filterable by request method, response status code, request uri path.
+
+**NOTE:** You must add `app.use(createKoaMiddleware(...))` **before** the use of any Koa bodyParsers like `app.use(KoaBodyParser())` because requests that are first handled by a bodyParser will not get measured.
+
+```javascript
+const os = require('os');
+const signalfx = require('signalfx');
+const Koa = require('koa');
+const KoaBodyParser = require('koa-bodyparser');
+const Router = require('koa-router');
+const { SignalFxMetricsReporter, SignalFxSelfReportingMetricsRegistry } = require('measured-signalfx-reporter');
+const { createProcessMetrics, createOSMetrics, createKoaMiddleware } = require('measured-node-metrics');
+const libraryMetadata = require('./package'); // get metadata from package.json
+
+const library = libraryMetadata.name;
+const version = libraryMetadata.version;
+
+// Report process and os stats 1x per minute
+const PROCESS_AND_SYSTEM_METRICS_REPORTING_INTERVAL_IN_SECONDS = 60;
+// Report the request count and histogram stats every 10 seconds
+const REQUEST_METRICS_REPORTING_INTERVAL_IN_SECONDS = 10;
+
+const defaultDimensions = {
+ app: library,
+ app_version: version,
+ env: 'test'
+};
+
+/**
+ * Get your api key from a secrets provider of some kind.
+ *
+ * Good examples:
+ *
+ *
S3 with KMS
+ * Cerberus
+ * AWS Secrets Manager
+ * Vault
+ * Confidant
+ *
+ * Bad examples:
+ *
+ * Checked into SCM in plaintext as a property
+ * Set as a plaintext environment variable
+ *
+ * @return {string} Returns the resolved Signal Fx Api Key
+ */
+const apiKeyResolver = () => {
+ // https://diogomonica.com/2017/03/27/why-you-shouldnt-use-env-variables-for-secret-data/
+ return process.env.SIGNALFX_API_KEY;
+};
+
+// Create the signal fx client
+const signalFxClient = new signalfx.Ingest(apiKeyResolver(), {
+ userAgents: library
+});
+
+// Create the signal fx reporter with the client
+const signalFxReporter = new SignalFxMetricsReporter(signalFxClient, {
+ defaultDimensions: defaultDimensions,
+ defaultReportingIntervalInSeconds: 10,
+ logLevel: 'debug'
+});
+
+// Create the self reporting metrics registry with the signal fx reporter
+const metricsRegistry = new SignalFxSelfReportingMetricsRegistry(signalFxReporter, { logLevel: 'debug' });
+
+createOSMetrics(metricsRegistry, {}, PROCESS_AND_SYSTEM_METRICS_REPORTING_INTERVAL_IN_SECONDS);
+createProcessMetrics(metricsRegistry, {}, PROCESS_AND_SYSTEM_METRICS_REPORTING_INTERVAL_IN_SECONDS);
+
+const app = new Koa();
+router = new Router();
+
+router.get('/hello', (req, res) => {
+ res.send('hello world');
+});
+
+router.get('/path2', (req, res) => {
+ res.send('path2');
+});
+
+// wire up the metrics middleware
+app.use(createKoaMiddleware(metricsRegistry, REQUEST_METRICS_REPORTING_INTERVAL_IN_SECONDS));
+app.use(KoaBodyParser());
+app.use(router.routes());
+
+app.listen(8080, () => log.info('Example app listening on port 8080!'));
+```
diff --git a/yarn.lock b/yarn.lock
index ca27d2c..91221cd 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -19,6 +19,14 @@ abbrev@1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+accepts@^1.3.5:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
+ integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
+ dependencies:
+ mime-types "~2.1.24"
+ negotiator "0.6.2"
+
accepts@~1.3.5:
version "1.3.5"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
@@ -104,6 +112,11 @@ ansi_up@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/ansi_up/-/ansi_up-1.3.0.tgz#c9c946bfc0b9bb5eaa060684bf2abaafe68bbd44"
+any-promise@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
+ integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
+
anymatch@^1.3.0:
version "1.3.2"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
@@ -728,6 +741,11 @@ bytes@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+bytes@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
+ integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+
cache-base@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
@@ -742,6 +760,14 @@ cache-base@^1.0.1:
union-value "^1.0.0"
unset-value "^1.0.0"
+cache-content-type@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c"
+ integrity sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==
+ dependencies:
+ mime-types "^2.1.18"
+ ylru "^1.2.0"
+
cached-path-relative@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.1.tgz#d09c4b52800aa4c078e2dd81a869aac90d2e54e7"
@@ -903,6 +929,16 @@ cmd-shim@^2.0.2:
graceful-fs "^4.1.2"
mkdirp "~0.5.0"
+co-body@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/co-body/-/co-body-6.0.0.tgz#965b9337d7f5655480787471f4237664820827e3"
+ integrity sha512-9ZIcixguuuKIptnY8yemEOuhb71L/lLf+Rl5JfJEUiDNJk0e02MBt7BPxR2GEh5mw8dPthQYR4jPI/BnS1MQgw==
+ dependencies:
+ inflation "^2.0.0"
+ qs "^6.5.2"
+ raw-body "^2.3.3"
+ type-is "^1.6.16"
+
co@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -1056,9 +1092,17 @@ content-disposition@0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
-content-type@~1.0.4:
+content-disposition@~0.5.2:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
+ integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
+ dependencies:
+ safe-buffer "5.1.2"
+
+content-type@^1.0.4, content-type@~1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
conventional-changelog-angular@^1.6.6:
version "1.6.6"
@@ -1226,10 +1270,23 @@ cookie@0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+cookies@~0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90"
+ integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==
+ dependencies:
+ depd "~2.0.0"
+ keygrip "~1.1.0"
+
copy-descriptor@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+copy-to@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5"
+ integrity sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=
+
core-js@^1.0.0:
version "1.2.7"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
@@ -1380,12 +1437,19 @@ debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.
dependencies:
ms "2.0.0"
-debug@3.1.0, debug@^3.1.0:
+debug@3.1.0, debug@^3.1.0, debug@~3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
dependencies:
ms "2.0.0"
+debug@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
+ integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
+ dependencies:
+ ms "^2.1.1"
+
decamelize-keys@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
@@ -1405,6 +1469,11 @@ dedent@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
+deep-equal@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
+ integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=
+
deep-extend@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f"
@@ -1479,9 +1548,15 @@ depd@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
-depd@~1.1.1, depd@~1.1.2:
+depd@^1.1.2, depd@~1.1.1, depd@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+depd@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
deps-sort@^2.0.0:
version "2.0.0"
@@ -1499,9 +1574,10 @@ des.js@^1.0.0:
inherits "^2.0.1"
minimalistic-assert "^1.0.0"
-destroy@~1.0.4:
+destroy@^1.0.4, destroy@~1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+ integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
detect-indent@^4.0.0:
version "4.0.0"
@@ -1636,9 +1712,10 @@ emoji-regex@^6.1.0:
version "6.5.1"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2"
-encodeurl@~1.0.2:
+encodeurl@^1.0.2, encodeurl@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
encoding@^0.1.11:
version "0.1.12"
@@ -1684,9 +1761,10 @@ es6-promisify@^5.0.0:
dependencies:
es6-promise "^4.0.3"
-escape-html@~1.0.3:
+escape-html@^1.0.3, escape-html@~1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5, escape-string-regexp@~1.0.5:
version "1.0.5"
@@ -2191,9 +2269,10 @@ fragment-cache@^0.2.1:
dependencies:
map-cache "^0.2.2"
-fresh@0.5.2:
+fresh@0.5.2, fresh@~0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
fs-extra@^4.0.1, fs-extra@^4.0.2:
version "4.0.3"
@@ -2552,6 +2631,14 @@ htmlparser2@^3.9.0:
inherits "^2.0.1"
readable-stream "^2.0.2"
+http-assert@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.4.1.tgz#c5f725d677aa7e873ef736199b89686cceb37878"
+ integrity sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==
+ dependencies:
+ deep-equal "~1.0.1"
+ http-errors "~1.7.2"
+
http-errors@1.6.2:
version "1.6.2"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
@@ -2561,6 +2648,28 @@ http-errors@1.6.2:
setprototypeof "1.0.3"
statuses ">= 1.3.1 < 2"
+http-errors@1.7.3, http-errors@~1.7.2:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+ integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.4"
+ setprototypeof "1.1.1"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
+http-errors@^1.6.3, http-errors@^1.7.3:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.0.tgz#75d1bbe497e1044f51e4ee9e704a62f28d336507"
+ integrity sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses ">= 1.5.0 < 2"
+ toidentifier "1.0.0"
+
http-errors@~1.6.2:
version "1.6.3"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
@@ -2593,6 +2702,13 @@ iconv-lite@0.4.19:
version "0.4.19"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
version "0.4.23"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
@@ -2631,6 +2747,11 @@ indexof@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+inflation@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f"
+ integrity sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=
+
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
@@ -2646,6 +2767,11 @@ inherits@2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+inherits@2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
ini@^1.3.2, ini@~1.3.0:
version "1.3.5"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
@@ -2828,6 +2954,11 @@ is-fullwidth-code-point@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+is-generator-function@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522"
+ integrity sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==
+
is-glob@^2.0.0, is-glob@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
@@ -3141,6 +3272,13 @@ just-extend@^1.1.27:
version "1.1.27"
resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.27.tgz#ec6e79410ff914e472652abfa0e603c03d60e905"
+keygrip@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226"
+ integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==
+ dependencies:
+ tsscmp "1.0.6"
+
kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
version "3.2.2"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
@@ -3167,6 +3305,74 @@ klaw@~2.0.0:
dependencies:
graceful-fs "^4.1.9"
+koa-bodyparser@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz#274c778555ff48fa221ee7f36a9fbdbace22759a"
+ integrity sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==
+ dependencies:
+ co-body "^6.0.0"
+ copy-to "^2.0.1"
+
+koa-compose@^3.0.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7"
+ integrity sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=
+ dependencies:
+ any-promise "^1.1.0"
+
+koa-compose@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877"
+ integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==
+
+koa-convert@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0"
+ integrity sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=
+ dependencies:
+ co "^4.6.0"
+ koa-compose "^3.0.0"
+
+koa-router@^9.1.0:
+ version "9.1.0"
+ resolved "https://registry.yarnpkg.com/koa-router/-/koa-router-9.1.0.tgz#47d1ce2109fd62b1d76eb42df90b635ff93b6831"
+ integrity sha512-5xakU0Ip2oFXPaA5882NTLopb5iaNfipBmTU5AoGbgDHOsHqRQDnaMnazj8DmDCt2rSxNB2TBBVLO9OiM0TvdA==
+ dependencies:
+ debug "^4.1.1"
+ http-errors "^1.7.3"
+ koa-compose "^4.1.0"
+ methods "^1.1.2"
+ path-to-regexp "^6.1.0"
+
+koa@^2.13.0:
+ version "2.13.0"
+ resolved "https://registry.yarnpkg.com/koa/-/koa-2.13.0.tgz#25217e05efd3358a7e5ddec00f0a380c9b71b501"
+ integrity sha512-i/XJVOfPw7npbMv67+bOeXr3gPqOAw6uh5wFyNs3QvJ47tUx3M3V9rIE0//WytY42MKz4l/MXKyGkQ2LQTfLUQ==
+ dependencies:
+ accepts "^1.3.5"
+ cache-content-type "^1.0.0"
+ content-disposition "~0.5.2"
+ content-type "^1.0.4"
+ cookies "~0.8.0"
+ debug "~3.1.0"
+ delegates "^1.0.0"
+ depd "^1.1.2"
+ destroy "^1.0.4"
+ encodeurl "^1.0.2"
+ escape-html "^1.0.3"
+ fresh "~0.5.2"
+ http-assert "^1.3.0"
+ http-errors "^1.6.3"
+ is-generator-function "^1.0.7"
+ koa-compose "^4.1.0"
+ koa-convert "^1.2.0"
+ on-finished "^2.3.0"
+ only "~0.0.2"
+ parseurl "^1.3.2"
+ statuses "^1.5.0"
+ type-is "^1.6.16"
+ vary "^1.1.2"
+
labeled-stream-splicer@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz#9cffa32fd99e1612fd1d86a8db962416d5292926"
@@ -3473,9 +3679,10 @@ merge-source-map@^1.1.0:
dependencies:
source-map "^0.6.1"
-methods@~1.1.2:
+methods@^1.1.2, methods@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
micromatch@^2.1.5:
version "2.3.11"
@@ -3520,6 +3727,11 @@ miller-rabin@^4.0.0:
bn.js "^4.0.0"
brorand "^1.0.1"
+mime-db@1.44.0:
+ version "1.44.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
+ integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==
+
mime-db@~1.33.0:
version "1.33.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db"
@@ -3530,6 +3742,13 @@ mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18:
dependencies:
mime-db "~1.33.0"
+mime-types@^2.1.18, mime-types@~2.1.24:
+ version "2.1.27"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
+ integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==
+ dependencies:
+ mime-db "1.44.0"
+
mime@1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
@@ -3740,6 +3959,11 @@ ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ms@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
mute-stream@0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
@@ -3781,6 +4005,11 @@ negotiator@0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+negotiator@0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
+ integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
+
neo-async@^2.6.0:
version "2.6.1"
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
@@ -3941,9 +4170,10 @@ object.pick@^1.3.0:
dependencies:
isobject "^3.0.1"
-on-finished@~2.3.0:
+on-finished@^2.3.0, on-finished@~2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
dependencies:
ee-first "1.1.1"
@@ -3959,6 +4189,11 @@ onetime@^2.0.0:
dependencies:
mimic-fn "^1.0.0"
+only@~0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4"
+ integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=
+
optimist@^0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
@@ -4104,6 +4339,11 @@ parse-json@^4.0.0:
error-ex "^1.3.1"
json-parse-better-errors "^1.0.1"
+parseurl@^1.3.2:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
parseurl@~1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
@@ -4160,6 +4400,11 @@ path-to-regexp@^1.7.0:
dependencies:
isarray "0.0.1"
+path-to-regexp@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.1.0.tgz#0b18f88b7a0ce0bfae6a25990c909ab86f512427"
+ integrity sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==
+
path-type@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
@@ -4351,6 +4596,11 @@ qs@6.5.1:
version "6.5.1"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
+qs@^6.5.2:
+ version "6.9.4"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687"
+ integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==
+
qs@~6.5.1:
version "6.5.2"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
@@ -4401,6 +4651,16 @@ raw-body@2.3.2:
iconv-lite "0.4.19"
unpipe "1.0.0"
+raw-body@^2.3.3:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c"
+ integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==
+ dependencies:
+ bytes "3.1.0"
+ http-errors "1.7.3"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
rc@^1.0.1, rc@^1.1.6, rc@^1.1.7:
version "1.2.7"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.7.tgz#8a10ca30d588d00464360372b890d06dacd02297"
@@ -4712,7 +4972,7 @@ safe-buffer@5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
-safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
@@ -4824,6 +5084,16 @@ setprototypeof@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+setprototypeof@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+ integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4:
version "2.4.11"
resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
@@ -5081,9 +5351,10 @@ static-extend@^0.1.1:
define-property "^0.2.5"
object-copy "^0.1.0"
-"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2":
+"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
statuses@~1.4.0:
version "1.4.0"
@@ -5370,6 +5641,11 @@ to-regex@^3.0.1, to-regex@^3.0.2:
regex-not "^1.0.2"
safe-regex "^1.1.0"
+toidentifier@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+ integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+
tough-cookie@~2.3.3:
version "2.3.4"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
@@ -5392,6 +5668,11 @@ trim-right@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+tsscmp@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb"
+ integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==
+
tty-browserify@0.0.1, tty-browserify@~0.0.0:
version "0.0.1"
resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811"
@@ -5416,6 +5697,14 @@ type-detect@^4.0.5:
version "4.0.8"
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+type-is@^1.6.16:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
type-is@~1.6.15, type-is@~1.6.16:
version "1.6.16"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
@@ -5545,9 +5834,10 @@ validate-npm-package-license@^3.0.1:
spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0"
-vary@~1.1.2:
+vary@^1.1.2, vary@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
verror@1.10.0:
version "1.10.0"
@@ -5814,3 +6104,8 @@ yauzl@2.4.1:
resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005"
dependencies:
fd-slicer "~1.0.1"
+
+ylru@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f"
+ integrity sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==