From c55253254d25e3d33338bab288e972ea24f692c2 Mon Sep 17 00:00:00 2001 From: stijnvdvegt Date: Wed, 24 Jun 2020 17:14:01 +0200 Subject: [PATCH 1/9] setup test setup image server --- app.js | 91 + db/clients.js | 3 +- lib/imageServer.js | 30 + lib/multer.js | 23 + package-lock.json | 5013 ++++++++++++++++++++++++++++++------- package.json | 7 +- server.js | 132 +- test/image/test-image.jpg | Bin 0 -> 111231 bytes test/server.test.js | 59 + 9 files changed, 4357 insertions(+), 1001 deletions(-) create mode 100644 app.js create mode 100644 lib/imageServer.js create mode 100644 lib/multer.js create mode 100644 test/image/test-image.jpg create mode 100644 test/server.test.js diff --git a/app.js b/app.js new file mode 100644 index 0000000..ff7daa5 --- /dev/null +++ b/app.js @@ -0,0 +1,91 @@ +require('dotenv').config(); +const express = require('express'); +const app = express(); +const passport = require('passport'); +const Strategy = require('passport-http-bearer').Strategy; +const db = require('./db'); +const upload = require('./lib/multer'); +const ImageServer = require('./lib/imageServer').getImageServer(); + +passport.use(new Strategy( + function (token, done) { + db.clients.findByToken(token, function (err, client) { + if (err) { + return done(err); + } + if (!client) { + return done(null, false); + } + return done(null, client, {scope: 'all'}); + }); + } +)); + +/** + * Instantiate the Image steam server, and proxy it with + */ +const imageHandler = ImageServer.getHandler(); + +/** + * Most errors is not found + * @TODO: requires debugging if other errors are handled by server + */ +ImageServer.on('error', (err) => { + // Don't log 404 errors, so we do nothing here. +}); + +app.get('/image/*', + function (req, res, next) { + req.url = req.url.replace('/image', ''); + + /** + * Pass request en response to the imageserver + */ + imageHandler(req, res); + }); + +/** + * The url for creating one Image + */ +app.post('/image', + passport.authenticate('bearer', {session: false}), + upload.single('image'), (req, res, next) => { + // req.file is the `image` file + // req.body will hold the text fields, if there were any + // + if (!res.headerSent) { + res.setHeader('Content-Type', 'application/json'); + } + res.send(JSON.stringify({ + url: process.env.APP_URL + '/image/' + req.file.filename + })); + }); + +app.post('/images', + passport.authenticate('bearer', {session: false}), + upload.array('images', 30), (req, res, next) => { + // req.files is array of `photos` files + // req.body will contain the text fields, if there were any + if (!res.headerSent) { + res.setHeader('Content-Type', 'application/json'); + } + + res.send(JSON.stringify(req.files.map((file) => { + return { + url: process.env.APP_URL + '/image/' + req.file.filename + } + }))); + }); + +app.use(function (err, req, res, next) { + const status = err.status ? err.status : 500; + //console.log('err', err); + if (!res.headerSent) { + res.setHeader('Content-Type', 'application/json'); + } + res.status(status).send(JSON.stringify({ + error: err.message + })); +}) + +module.exports = app; diff --git a/db/clients.js b/db/clients.js index 5192e67..5ad836c 100755 --- a/db/clients.js +++ b/db/clients.js @@ -1,5 +1,6 @@ const knex = require('../knex/knex.js'); const bookshelf = require('bookshelf')(knex); + const clients = bookshelf.Model.extend({ tableName: 'clients', hasTimestamps: true, @@ -14,7 +15,7 @@ exports.findByToken = function(token, cb) { .fetchAll() .then(function (records) { records = records.serialize(); - + for (var i = 0, len = records.length; i < len; i++) { var record = records[i]; if (record.token === token) { diff --git a/lib/imageServer.js b/lib/imageServer.js new file mode 100644 index 0000000..4216f2a --- /dev/null +++ b/lib/imageServer.js @@ -0,0 +1,30 @@ +require('dotenv').config(); +module.exports.getImageServer = () => { + console.log('getImageServer method'); + const imgSteam = require('image-steam'); + + const imageSteamConfig = { + "storage": { + "defaults": { + "driver": "fs", + "path": "./images", + }, + "cacheTTS": process.env.CACHE_TTS || 86400 * 14, /* 24 * 14 hrs */ + "cacheOptimizedTTS": process.env.CACHE_OPTIMIZED_TTS || 86400 * 14, /* 24 * 14 hrs */ + "cacheArtifacts": process.env.CACHE_ARTIFACTS || true + }, + "throttle": { + "ccProcessors": process.env.THROTTLE_CC_PROCESSORS || 4, + "ccPrefetchers": process.env.THROTTLE_CC_PREFETCHER || 20, + "ccRequests": process.env.THROTTLE_CC_REQUESTS || 100 + }, + log: { + errors: false + } + }; + + /** + * Instantiate the Image steam server, and proxy it with + */ + return new imgSteam.http.Connect(imageSteamConfig); +}; diff --git a/lib/multer.js b/lib/multer.js new file mode 100644 index 0000000..9140ebd --- /dev/null +++ b/lib/multer.js @@ -0,0 +1,23 @@ +const multer = require('multer'); + +module.exports = multer({ + dest: 'images/', + onError: function (err, next) { + next(err); + }, + fileFilter: function (req, file, cb) { + const allowedTypes = [ + 'image/gif', + 'image/jpeg', + 'image/png', + 'image/svg+xml' + ]; + + if (allowedTypes.indexOf(file.mimetype) === -1) { + req.fileValidationError = 'goes wrong on the mimetype'; + return cb(null, false, new Error('goes wrong on the mimetype')); + } + + cb(null, true); + } +}); diff --git a/package-lock.json b/package-lock.json index 566b21d..cdce3a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,27 +4,91 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz", + "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz", + "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz", + "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.3", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + } + } + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, "@types/node": { - "version": "10.9.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.9.4.tgz", - "integrity": "sha512-fCHV45gS+m3hH17zgkgADUSi2RR1Vht6wOZ0jyHP8rjiQra9f+mIcgwPQHllmDocYOstIEbKlxbFDYlgrTPYqw==", + "version": "14.0.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.14.tgz", + "integrity": "sha512-syUgf67ZQpaJj01/tRTknkMNoBBLWJOBODF0Zm4NrXmiSuxjymFrxnTu1QVYRubhVkRcZLYZG8STTwJRdVm/WQ==", "optional": true }, + "abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", + "dev": true + }, "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, "acorn": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.2.tgz", - "integrity": "sha512-cJrKCNcr2kv8dlDnbw+JPUGjHZzo4myaxOLmpOX8a+rgX94YeTcTMv/LFJUSByRpc+i4GgVnnhLxvMu/2Y+rqw==", + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", "dev": true }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + } + } + }, "acorn-jsx": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", @@ -42,6 +106,12 @@ } } }, + "acorn-walk": { + "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": "4.11.8", "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", @@ -70,15 +140,36 @@ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } }, "append-field": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-0.1.0.tgz", - "integrity": "sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY=" + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "^1.0.0" + } }, "aproba": { "version": "1.2.0", @@ -123,11 +214,28 @@ "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, "array-parallel": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/array-parallel/-/array-parallel-0.1.3.tgz", @@ -143,45 +251,67 @@ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, + "array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "requires": { - "lodash": "^4.17.10" + "lodash": "^4.17.14" } }, + "async-limiter": { + "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": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -192,6 +322,18 @@ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", + "dev": true + }, "babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -201,6 +343,173 @@ "chalk": "^1.1.3", "esutils": "^2.0.2", "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "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" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-jest": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz", + "integrity": "sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "^4.1.6", + "babel-preset-jest": "^23.2.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + } + } + }, + "babel-plugin-jest-hoist": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", + "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-preset-jest": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", + "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^23.2.0", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" } }, "babel-runtime": { @@ -212,6 +521,54 @@ "regenerator-runtime": "^0.11.0" } }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -268,15 +625,34 @@ } } }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, "bezier-easing": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/bezier-easing/-/bezier-easing-2.1.0.tgz", "integrity": "sha1-wE3+i5JtbsrKGBPWn/F5t8ICXYY=" }, "bignumber.js": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz", - "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==" + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } }, "bl": { "version": "1.2.2", @@ -288,40 +664,25 @@ } }, "bluebird": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", - "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==" + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "requires": { - "bytes": "3.0.0", + "bytes": "3.1.0", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.1", - "http-errors": "~1.6.2", - "iconv-lite": "0.4.19", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "~1.6.15" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - } + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" } }, "bookshelf": { @@ -336,34 +697,6 @@ "inflection": "^1.5.1", "inherits": "~2.0.1", "lodash": "^4.13.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } } }, "brace-expansion": { @@ -403,6 +736,38 @@ } } }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, "buffer-alloc": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", @@ -427,11 +792,6 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" - }, "busboy": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", @@ -465,9 +825,9 @@ } }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, "cache-base": { "version": "1.0.1", @@ -500,27 +860,50 @@ "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, - "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + }, + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", "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" + "rsvp": "^3.3.3" } }, - "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", "dev": true }, @@ -555,9 +938,9 @@ } }, "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", "dev": true }, "cliui": { @@ -591,9 +974,9 @@ } }, "color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", "requires": { "color-convert": "^1.9.1", "color-string": "^1.5.2" @@ -622,17 +1005,17 @@ } }, "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { "delayed-stream": "~1.0.0" } }, "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "complex.js": { "version": "2.0.10", @@ -641,9 +1024,9 @@ "optional": true }, "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, "concat-map": { "version": "0.0.1", @@ -674,19 +1057,31 @@ "dev": true }, "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, "cookie-signature": { "version": "1.0.6", @@ -704,9 +1099,9 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" }, "core-util-is": { "version": "1.0.2", @@ -718,19 +1113,81 @@ "resolved": "https://registry.npmjs.org/create-error/-/create-error-0.3.1.tgz", "integrity": "sha1-aYECRaYp5lRDK/BDdzYAA6U1GiM=" }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "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" + } + }, + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "cssstyle": { + "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.x" + } + }, "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", "dev": true, "requires": { - "es5-ext": "^0.10.9" + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } } }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { "ms": "2.0.0" } @@ -770,6 +1227,24 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -807,21 +1282,6 @@ } } }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -847,11 +1307,26 @@ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, "dicer": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", @@ -884,6 +1359,12 @@ } } }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -893,10 +1374,29 @@ "esutils": "^2.0.2" } }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, "dotenv": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.0.0.tgz", - "integrity": "sha512-FlWbnhgjtwD+uNLUGHbMykMOYQaTivdHEmYwAKFjn6GKe/CqY0fNae93ZHTd20snh9ZLr8mTzIL9m0APQ1pjQg==" + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } }, "ee-first": { "version": "1.1.1", @@ -909,9 +1409,9 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { "once": "^1.4.0" } @@ -931,15 +1431,45 @@ } } }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "es5-ext": { - "version": "0.10.46", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz", - "integrity": "sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw==", + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", "dev": true, "requires": { "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "1" + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" } }, "es6-iterator": { @@ -978,27 +1508,39 @@ "es6-iterator": "~2.0.1", "es6-symbol": "3.1.1", "event-emitter": "~0.3.5" + }, + "dependencies": { + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + } } }, "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "^1.0.1", + "ext": "^1.1.2" } }, "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", "dev": true, "requires": { "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.1" } }, @@ -1018,6 +1560,28 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, "escope": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", @@ -1073,13 +1637,23 @@ "user-home": "^2.0.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ms": "2.0.0" + "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" } }, "strip-bom": { @@ -1087,6 +1661,12 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true } } }, @@ -1097,74 +1677,46 @@ "dev": true }, "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", "dev": true, "requires": { "debug": "^2.6.9", - "resolve": "^1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } + "resolve": "^1.13.1" } }, "eslint-module-utils": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz", - "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", "dev": true, "requires": { - "debug": "^2.6.8", - "pkg-dir": "^1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" } }, "eslint-plugin-import": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", - "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==", + "version": "2.21.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.21.2.tgz", + "integrity": "sha512-FEmxeGI6yaz+SnEB6YgNHlQK1Bs2DKLM+YF+vuTk5H8J9CLbJLtlPvRFgZZ2+sXiKAlN5dpdlrWOjK8ZoZJpQA==", "dev": true, "requires": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", "contains-path": "^0.1.0", - "debug": "^2.6.8", + "debug": "^2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.1", - "eslint-module-utils": "^2.2.0", - "has": "^1.0.1", - "lodash": "^4.17.4", - "minimatch": "^3.0.3", + "eslint-import-resolver-node": "^0.3.3", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", "read-pkg-up": "^2.0.0", - "resolve": "^1.6.0" + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "doctrine": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", @@ -1283,12 +1835,20 @@ "dev": true }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } } }, "esrecurse": { @@ -1301,15 +1861,15 @@ } }, "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 }, "etag": { @@ -1328,9 +1888,39 @@ } }, "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "requires": { + "merge": "^1.2.0" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "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" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true }, "exit-hook": { "version": "1.1.1", @@ -1352,14 +1942,6 @@ "to-regex": "^3.0.1" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -1378,6 +1960,57 @@ } } }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "expand-template": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.1.tgz", @@ -1391,78 +2024,65 @@ "homedir-polyfill": "^1.0.1" } }, + "expect": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", + "integrity": "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "jest-diff": "^23.6.0", + "jest-get-type": "^22.1.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0" + } + }, "express": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", - "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "requires": { - "accepts": "~1.3.5", + "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", "content-type": "~1.0.4", - "cookie": "0.3.1", + "cookie": "0.4.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.1.1", + "finalhandler": "~1.1.2", "fresh": "0.5.2", "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", + "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.3", - "qs": "6.5.1", - "range-parser": "~1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - } } }, "express-json-error-handler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/express-json-error-handler/-/express-json-error-handler-2.0.0.tgz", - "integrity": "sha512-8h3nnl+jwI7bBtQUOMRStSRDE3iiiCHuILVYbPgZK3gyQ6aUzFAYDKSd08/fFl73n+GqQxzK3y+y/KSLh9Nmag==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/express-json-error-handler/-/express-json-error-handler-2.0.1.tgz", + "integrity": "sha512-fzLAVMF9muPTrmuzuNN+ZbHqaCYurIq0xNtx20ENHAoyb9XL1/1EzFnwabKSkr4m8AbcabTHdFe3gNa8uSgqiQ==", "requires": { - "http-status": "^1.1.0", - "lodash": "^4.17.10", + "http-status": "^1.3.1", + "lodash": "^4.17.11", "statuses": "^1.5.0" - }, - "dependencies": { - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - } } }, "express-json-errors": { @@ -1472,11 +2092,39 @@ "requires": { "lodash": "^4.17.4", "supertest": "^3.0.0" + }, + "dependencies": { + "supertest": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.4.2.tgz", + "integrity": "sha512-WZWbwceHUo2P36RoEIdXvmqfs47idNNZjCuJOqDz6rvtkk8ym56aU5oglORCpPeXGxT7l9rkJ41+O1lffQXYSA==", + "requires": { + "methods": "^1.1.2", + "superagent": "^3.8.3" + } + } } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { @@ -1557,12 +2205,39 @@ } } }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, "figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", @@ -1583,6 +2258,29 @@ "object-assign": "^4.0.1" } }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -1605,27 +2303,17 @@ } }, "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - } } }, "find-up": { @@ -1659,9 +2347,9 @@ } }, "fined": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", - "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", "requires": { "expand-tilde": "^2.0.2", "is-plain-object": "^2.0.3", @@ -1671,29 +2359,26 @@ } }, "flagged-respawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", - "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" }, "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", "dev": true, "requires": { "circular-json": "^0.3.1", - "del": "^2.0.2", "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", "write": "^0.2.1" } }, "follow-redirects": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.7.tgz", - "integrity": "sha512-NONJVIFiX7Z8k2WxfqBjtwqMifx7X42ORLFrOZ2LTKGj71G3C0kfdyTqGqr8fx5zSX6Foo/D95dgGWbPUiwnew==", - "requires": { - "debug": "^3.1.0" - } + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.12.1.tgz", + "integrity": "sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==" }, "for-in": { "version": "1.0.2", @@ -1708,20 +2393,26 @@ "for-in": "^1.0.1" } }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "formidable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" }, "forwarded": { "version": "0.1.2", @@ -1758,9 +2449,9 @@ "integrity": "sha512-2QY5eeqVv4m2PfyMiEuy9adxNP+ajf+8AR05cEi+OAzPcOj90hvFImeZhTmKLBgSd9EvG33jsD7ZRxsx9dThkQ==" }, "fs-extra": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", - "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -1768,11 +2459,11 @@ } }, "fs-minipass": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "requires": { - "minipass": "^2.2.1" + "minipass": "^2.6.0" } }, "fs.realpath": { @@ -1781,6 +2472,17 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -1825,20 +2527,50 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -1849,6 +2581,59 @@ "path-is-absolute": "^1.0.0" } }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", @@ -1877,20 +2662,6 @@ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", "dev": true }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, "gm": { "version": "1.21.1", "resolved": "https://registry.npmjs.org/gm/-/gm-1.21.1.tgz", @@ -1917,9 +2688,78 @@ } }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + } + } }, "has": { "version": "1.0.3", @@ -1944,6 +2784,12 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -1983,23 +2829,42 @@ "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz", "integrity": "sha1-uwFKnmSzeIrtgAWRdBPU/z1QLYo=" }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "requires": { "parse-passwd": "^1.0.0" } }, "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.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" }, "hsluv": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/hsluv/-/hsluv-0.0.1.tgz", - "integrity": "sha1-Hbz+RkLsIHRDuXbebCr3A7MMylw=" + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/hsluv/-/hsluv-0.0.3.tgz", + "integrity": "sha1-gpEH2vtKn4tSoYCe0C4JHq3mdUw=" + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } }, "http": { "version": "0.0.0", @@ -2007,46 +2872,68 @@ "integrity": "sha1-huYybSnF0Dnen6xYSkVon5KfT3I=" }, "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "requires": { "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } } }, "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "requires": { - "eventemitter3": "^3.0.0", + "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" } }, "http-proxy-middleware": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.0.tgz", - "integrity": "sha512-Ab/zKDy2B0404mz83bgki0HHv/xqpYKAyFXhopAiJaVAUSJfLYrpBYynTl4ZSUJ7TqrAgjarTsxdX5yBb4unRQ==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.2.tgz", + "integrity": "sha512-aYk1rTKqLTus23X3L96LGNCGNgWpG4cG0XoZIT1GUPhhulEHX/QalnO6Vbo+WmKWi4AL2IidjuC0wZtbpg0yhQ==", "requires": { - "http-proxy": "^1.17.0", + "http-proxy": "^1.18.1", "is-glob": "^4.0.0", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "micromatch": "^3.1.10" } }, - "http-status": { + "http-signature": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-status/-/http-status-1.2.0.tgz", - "integrity": "sha512-cSX+i/g4Kj5lkfOqS9w0SrxQF4hX7gsfikBtSDm5PFrAy+8fjRKk9+JRCG5cEZ40b6q6GOJk3P0QyDB5JpE0Ig==" + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "http-status": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/http-status/-/http-status-1.4.2.tgz", + "integrity": "sha512-mBnIohUwRw9NyXMEMMv8/GANnzEYUj0Y8d3uL01zDWFkxUjYyZ6rgCaAI2zZ1Wb34Oqtbx/nFZolPRDc8Xlm5A==" }, "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } }, "ignore": { "version": "3.3.10", @@ -2055,11 +2942,11 @@ "dev": true }, "image-pal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/image-pal/-/image-pal-1.2.1.tgz", - "integrity": "sha512-7JuOjs2Z9UM4Oau6rljrPLLufvLnW0Pf1NjqXzhsRLekdkTD4igJFZ+F/PvK4NoN5bLXsMtyZ7OVfqn52HpUaQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/image-pal/-/image-pal-1.2.2.tgz", + "integrity": "sha512-mCHp8MrkpEtK3THaOfvQfMIKIeZwuDTmFD6kKJ/0aVq5lTwWhWQ3D3XtOrziQE64Vr5YC0eHzlpfhsMGhcuenw==", "requires": { - "hsluv": "0.0.1" + "hsluv": "0.0.3" } }, "image-pal-sharp": { @@ -2071,9 +2958,9 @@ } }, "image-steam": { - "version": "0.46.4", - "resolved": "https://registry.npmjs.org/image-steam/-/image-steam-0.46.4.tgz", - "integrity": "sha512-5ynAyyvR4brgw+wevYr06RobfNzJkzoB65yVMOBS73rTJh4Puv7ADdWV1VFaXpEGandTXSVSv7RR1We2osF1Bg==", + "version": "0.46.6", + "resolved": "https://registry.npmjs.org/image-steam/-/image-steam-0.46.6.tgz", + "integrity": "sha512-WRjqnsgLXaP6yo96OEpvosAKTGkDvuSFCzvjMJvlIvCmmW0T4MAbbMnaj6GQM27x+mB83EzeQZFQ2E2UZk1oHg==", "requires": { "async": "^2.6.1", "fs-extra": "^7.0.0", @@ -2087,6 +2974,23 @@ "semaphore": "^1.1.0", "sharp": "^0.20.5", "xxhash": "0.2.4" + }, + "dependencies": { + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" + } + } + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" } }, "imurmurhash": { @@ -2111,9 +3015,9 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.5", @@ -2139,12 +3043,48 @@ "string-width": "^1.0.1", "strip-ansi": "^3.0.0", "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "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" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } } }, "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } }, "invert-kv": { "version": "1.0.0", @@ -2152,9 +3092,9 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, "is-absolute": { "version": "1.0.0", @@ -2193,12 +3133,19 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, "requires": { - "builtin-modules": "^1.0.0" + "ci-info": "^1.5.0" } }, "is-data-descriptor": { @@ -2219,6 +3166,12 @@ } } }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -2236,6 +3189,21 @@ } } }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -2246,6 +3214,12 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "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", @@ -2254,10 +3228,16 @@ "number-is-nan": "^1.0.0" } }, + "is-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "dev": true + }, "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "requires": { "is-extglob": "^2.1.1" } @@ -2269,9 +3249,9 @@ "dev": true }, "is-my-json-valid": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.19.0.tgz", - "integrity": "sha512-mG0f/unGX1HZ5ep4uhRaPOS8EkAY8/j6mDRMJrutq4CqhoJWYp7qAlonIPy3TV7p3ju4TK9fo/PbnoksWmsp5Q==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz", + "integrity": "sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA==", "dev": true, "requires": { "generate-function": "^2.0.0", @@ -2299,97 +3279,1360 @@ } } }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "dev": true - }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "requires": { - "is-path-inside": "^1.0.0" + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-api": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", + "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", + "dev": true, + "requires": { + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.1", + "istanbul-lib-hook": "^1.2.2", + "istanbul-lib-instrument": "^1.10.2", + "istanbul-lib-report": "^1.1.5", + "istanbul-lib-source-maps": "^1.2.6", + "istanbul-reports": "^1.5.1", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", + "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", + "dev": true, + "requires": { + "append-transform": "^0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", + "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "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": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", + "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", + "dev": true, + "requires": { + "handlebars": "^4.0.3" + } + }, + "javascript-natural-sort": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k=", + "optional": true + }, + "jest": { + "version": "23.1.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-23.1.0.tgz", + "integrity": "sha1-u7f4kxAKEadC3YvQ0EelSwlorRo=", + "dev": true, + "requires": { + "import-local": "^1.0.0", + "jest-cli": "^23.1.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "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" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.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-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "jest-cli": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz", + "integrity": "sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.3.1", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-source-maps": "^1.2.4", + "jest-changed-files": "^23.4.2", + "jest-config": "^23.6.0", + "jest-environment-jsdom": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve-dependencies": "^23.6.0", + "jest-runner": "^23.6.0", + "jest-runtime": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "jest-watcher": "^23.4.0", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "prompts": "^0.1.9", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^11.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "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" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "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.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "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" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "yargs": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", + "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "jest-changed-files": { + "version": "23.4.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz", + "integrity": "sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==", + "dev": true, + "requires": { + "throat": "^4.0.0" + } + }, + "jest-config": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.6.0.tgz", + "integrity": "sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-jest": "^23.6.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^23.4.0", + "jest-environment-node": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-jasmine2": "^23.6.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "pretty-format": "^23.6.0" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + } + } + }, + "jest-diff": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", + "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-docblock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", + "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-each": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.6.0.tgz", + "integrity": "sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "pretty-format": "^23.6.0" + } + }, + "jest-environment-jsdom": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", + "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", + "dev": true, + "requires": { + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz", + "integrity": "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=", + "dev": true, + "requires": { + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0" + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "jest-haste-map": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.6.0.tgz", + "integrity": "sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==", + "dev": true, + "requires": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "invariant": "^2.2.4", + "jest-docblock": "^23.2.0", + "jest-serializer": "^23.0.1", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "sane": "^2.0.0" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + } + } + }, + "jest-jasmine2": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz", + "integrity": "sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==", + "dev": true, + "requires": { + "babel-traverse": "^6.0.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^23.6.0", + "is-generator-fn": "^1.0.0", + "jest-diff": "^23.6.0", + "jest-each": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "pretty-format": "^23.6.0" + } + }, + "jest-leak-detector": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz", + "integrity": "sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==", + "dev": true, + "requires": { + "pretty-format": "^23.6.0" + } + }, + "jest-matcher-utils": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", + "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-message-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", + "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + } + } + }, + "jest-mock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", + "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", + "dev": true + }, + "jest-regex-util": { + "version": "23.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", + "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=", + "dev": true + }, + "jest-resolve": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.6.0.tgz", + "integrity": "sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==", + "dev": true, + "requires": { + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "realpath-native": "^1.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz", + "integrity": "sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==", + "dev": true, + "requires": { + "jest-regex-util": "^23.3.0", + "jest-snapshot": "^23.6.0" + } + }, + "jest-runner": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.6.0.tgz", + "integrity": "sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==", + "dev": true, + "requires": { + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^23.6.0", + "jest-docblock": "^23.2.0", + "jest-haste-map": "^23.6.0", + "jest-jasmine2": "^23.6.0", + "jest-leak-detector": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-runtime": "^23.6.0", + "jest-util": "^23.4.0", + "jest-worker": "^23.2.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "jest-runtime": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.6.0.tgz", + "integrity": "sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-plugin-istanbul": "^4.1.6", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-config": "^23.6.0", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^11.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 + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "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" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.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-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "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" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "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.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "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-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "yargs": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", + "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "jest-serializer": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", + "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", + "dev": true + }, + "jest-snapshot": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz", + "integrity": "sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==", + "dev": true, + "requires": { + "babel-types": "^6.0.0", + "chalk": "^2.0.1", + "jest-diff": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-resolve": "^23.6.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^23.6.0", + "semver": "^5.5.0" + } + }, + "jest-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", + "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", + "dev": true, + "requires": { + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^23.4.0", + "mkdirp": "^0.5.1", + "slash": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "jest-validate": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", + "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", "dev": true, "requires": { - "path-is-inside": "^1.0.1" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^23.6.0" } }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "jest-watcher": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz", + "integrity": "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=", + "dev": true, "requires": { - "is-unc-path": "^1.0.0" + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "string-length": "^2.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + } } }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "jest-worker": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", + "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", + "dev": true, "requires": { - "unc-path-regex": "^0.1.2" + "merge-stream": "^1.0.1" } }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "javascript-natural-sort": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", - "integrity": "sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k=", - "optional": true - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -2397,15 +4640,73 @@ "dev": true }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "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", + "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" + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, "json-stable-stringify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", @@ -2415,6 +4716,29 @@ "jsonify": "~0.0.0" } }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -2435,10 +4759,28 @@ "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", "dev": true }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "kleur": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", + "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", + "dev": true }, "knex": { "version": "0.15.2", @@ -2463,17 +4805,9 @@ "v8flags": "^3.1.1" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, "chalk": { "version": "2.3.2", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "requires": { "ansi-styles": "^3.2.1", @@ -2481,18 +4815,18 @@ "supports-color": "^5.3.0" } }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -2504,6 +4838,18 @@ "invert-kv": "^1.0.0" } }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -2560,22 +4906,28 @@ } }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, "lodash.assign": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" }, - "macro-inferno": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/macro-inferno/-/macro-inferno-0.2.1.tgz", - "integrity": "sha512-5fnnX5OJSJq4PFMKiiv+lKJqbxHHQXfvTLbRjV3fHIr86ELpljOzVEjEmsY2VI3R2RwWLUM0NHrygpexdH4S4g==", - "optional": true, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, "requires": { - "nan": "^2.7.0" + "js-tokens": "^3.0.0 || ^4.0.0" } }, "make-iterator": { @@ -2586,6 +4938,24 @@ "kind-of": "^6.0.2" } }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "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", @@ -2599,6 +4969,12 @@ "object-visit": "^1.0.0" } }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, "mathjs": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-4.4.2.tgz", @@ -2620,11 +4996,37 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, + "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.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "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.0.1" + } + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -2651,23 +5053,29 @@ } }, "mime": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", - "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==" + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" }, "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "requires": { - "mime-db": "~1.36.0" + "mime-db": "1.44.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 + }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -2684,30 +5092,30 @@ }, "minimist": { "version": "0.0.10", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" }, "minipass": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.4.tgz", - "integrity": "sha512-mlouk1OHlaUE8Odt1drMtG1bAJA4ZA6B/ehysgV0LUIrDHdKgo1KorZq3pK0b/7Z7LJIQ12MNM6aC+Tn6lUZ5w==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "minizlib": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", - "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "requires": { - "minipass": "^2.2.1" + "minipass": "^2.9.0" } }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -2724,45 +5132,49 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" }, "dependencies": { "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" } } }, + "mock-knex": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/mock-knex/-/mock-knex-0.4.9.tgz", + "integrity": "sha512-w8BZXdKeNtPxcXu/cnJVCv+/e+Nxs8sfDulxfV/MK2+NErxbv/NYkQA7Kr15TNYA8Q51WyFTwD4bNQB9/YWotw==", + "dev": true, + "requires": { + "bluebird": "^3.4.1", + "lodash": "^4.14.2", + "semver": "^5.3.0" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "multer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.3.1.tgz", - "integrity": "sha512-JHdEoxkA/5NgZRo91RNn4UT+HdcJV9XUo01DTkKC7vo1erNIngtuaw9Y0WI8RdTlyi+wMIbunflhghzVLuGJyw==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz", + "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==", "requires": { - "append-field": "^0.1.0", + "append-field": "^1.0.0", "busboy": "^0.2.11", "concat-stream": "^1.5.2", "mkdirp": "^0.5.1", - "object-assign": "^3.0.0", + "object-assign": "^4.1.1", "on-finished": "^2.3.0", "type-is": "^1.6.4", "xtend": "^4.0.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" - } } }, "mute-stream": { @@ -2772,20 +5184,20 @@ "dev": true }, "mysql": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.16.0.tgz", - "integrity": "sha512-dPbN2LHonQp7D5ja5DJXNbCLe/HRdu+f3v61aguzNRQIrmZLOeRoymBYyeThrR6ug+FqzDL95Gc9maqZUJS+Gw==", + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", "requires": { - "bignumber.js": "4.1.0", - "readable-stream": "2.3.6", + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", "safe-buffer": "5.1.2", "sqlstring": "2.3.1" } }, "nan": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.0.tgz", - "integrity": "sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw==" + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==" }, "nanomatch": { "version": "1.2.13", @@ -2806,12 +5218,12 @@ } }, "native-node-utils": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/native-node-utils/-/native-node-utils-0.1.2.tgz", - "integrity": "sha512-eEsxT0In5UY7GhHIxIHviRA45VT0X5NNsjMWr70bYSQZma/059d0G68JwdY7+8ZWG6/z5zDhJK3JfuoOtYjMzg==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/native-node-utils/-/native-node-utils-0.1.7.tgz", + "integrity": "sha512-Jl8WwXWpc+CQfuTgThW5xUyLn0+hNQg+JQ3w1KTnWskJqX0WA7b6jO9fbcmldTZJpimygOW6I6HtkpYdCnnwTQ==", "optional": true, "requires": { - "nan": "^2.8.0" + "nan": "^2.13.2" } }, "natural-compare": { @@ -2821,9 +5233,15 @@ "dev": true }, "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true }, "next-tick": { "version": "1.0.0", @@ -2831,30 +5249,73 @@ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, "node-abi": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.4.3.tgz", - "integrity": "sha512-b656V5C0628gOOA2kwcpNA/bxdlqYF9FvxJ+qqVX0ctdXNVZpS8J6xEUYir3WAKc7U0BH/NRlSpNbGsy+azjeg==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.18.0.tgz", + "integrity": "sha512-yi05ZoiuNNEbyT/xXfSySZE+yVnQW6fxPZuFbLyS1s6b5Kw3HzV2PHOM4XR+nsjzkHxByK+2Wg+yCQbe35l8dw==", "requires": { "semver": "^5.4.1" } }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-notifier": { + "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.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, "noop-logger": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" }, "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "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==", "requires": { "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", + "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -2871,6 +5332,18 @@ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2904,6 +5377,18 @@ } } }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -2912,6 +5397,18 @@ "isobject": "^3.0.0" } }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, "object.defaults": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", @@ -2923,6 +5420,16 @@ "isobject": "^3.0.0" } }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, "object.map": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", @@ -2932,6 +5439,27 @@ "make-iterator": "^1.0.0" } }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + } + } + }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -2940,6 +5468,18 @@ "isobject": "^3.0.1" } }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -2958,30 +5498,29 @@ }, "onetime": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, "opencv-build": { - "version": "0.0.14", - "resolved": "https://registry.npmjs.org/opencv-build/-/opencv-build-0.0.14.tgz", - "integrity": "sha512-pt2P4qESggXujChzYhmNRS7ppAzglVFKNKQiQf8FN+ZQ+fLBBC4SbMEvuL4Mm7W5hFAWt8s97Ml7FO68JqrOUw==", + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/opencv-build/-/opencv-build-0.1.9.tgz", + "integrity": "sha512-tgT/bnJAcYROen9yaPynfK98IMl62mPSgMLmTx41911m5bczlq21xtE5r+UWLB/xEo/0hKk6tl5zHyxV/JS5Rg==", "optional": true, "requires": { "npmlog": "^4.1.2" } }, "opencv4nodejs": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/opencv4nodejs/-/opencv4nodejs-4.7.4.tgz", - "integrity": "sha512-d30sQK4GZrg7UcbiLk4s5xLr1ZGEUJexGVEFKq6tYelDNS3ksXiDfFD4qzEQsfJ1N17gHwl0OZQu14Vqt7y+Xg==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/opencv4nodejs/-/opencv4nodejs-4.17.0.tgz", + "integrity": "sha512-p5iKEX0N/VxpveGDeHNMJJwjWd5ggzSVgIqUKCCE8aUDgGIXdZWfZGHA37cS9y2hLVjkI3pvHMVwnm0W1me5Vw==", "optional": true, "requires": { "@types/node": ">6", - "macro-inferno": "^0.2.1", - "nan": "^2.10.0", - "native-node-utils": "0.1.2", - "opencv-build": "0.0.14" + "nan": "^2.13.2", + "native-node-utils": "^0.1.7", + "opencv-build": "^0.1.3" } }, "optimist": { @@ -2994,25 +5533,17 @@ } }, "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", + "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": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } + "word-wrap": "~1.2.3" } }, "os-homedir": { @@ -3020,13 +5551,37 @@ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, - "os-locale": { - "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.0.0" - } + "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" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "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-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "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": "1.3.0", @@ -3062,6 +5617,35 @@ "path-root": "^0.1.1" } }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", @@ -3075,10 +5659,16 @@ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "pascalcase": { "version": "0.1.1", @@ -3086,9 +5676,9 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, "passport": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.0.tgz", - "integrity": "sha1-xQlWkTR71a07XhgCOMORTRbwWBE=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", + "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", "requires": { "passport-strategy": "1.x.x", "pause": "0.0.1" @@ -3127,6 +5717,12 @@ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", "dev": true }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", @@ -3165,6 +5761,12 @@ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, "pg-connection-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.0.0.tgz", @@ -3189,12 +5791,23 @@ } }, "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "^1.0.0" + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + } } }, "pluralize": { @@ -3203,6 +5816,12 @@ "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", "dev": true }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -3231,9 +5850,9 @@ }, "dependencies": { "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" } } }, @@ -3243,10 +5862,40 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.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 + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "progress": { "version": "1.1.8", @@ -3254,15 +5903,31 @@ "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", "dev": true }, + "prompts": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.14.tgz", + "integrity": "sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==", + "dev": true, + "requires": { + "kleur": "^2.0.1", + "sisteransi": "^0.1.1" + } + }, "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.8.0" + "ipaddr.js": "1.9.1" } }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, "pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", @@ -3272,48 +5937,50 @@ "once": "^1.3.1" } }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } }, "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "unpipe": "1.0.0" - }, - "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": ">= 1.3.1 < 2" - } - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" - } } }, "rc": { @@ -3328,9 +5995,9 @@ }, "dependencies": { "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" } } }, @@ -3354,9 +6021,9 @@ } }, "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": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -3378,6 +6045,15 @@ "mute-stream": "0.0.5" } }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", @@ -3391,6 +6067,15 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -3400,6 +6085,12 @@ "safe-regex": "^1.1.0" } }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", @@ -3410,6 +6101,82 @@ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "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.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + } + } + }, + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "request-promise-native": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "dev": true, + "requires": { + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3436,11 +6203,28 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, "requires": { - "path-parse": "^1.0.5" + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } } }, "resolve-dir": { @@ -3479,14 +6263,20 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + }, "run-async": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", @@ -3515,6 +6305,11 @@ "ret": "~0.1.10" } }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "salient-autofocus": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/salient-autofocus/-/salient-autofocus-0.9.1.tgz", @@ -3533,6 +6328,37 @@ "opencv4nodejs": "^4.4.0" } }, + "sane": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, "seed-random": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz", @@ -3545,14 +6371,14 @@ "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==" }, "semver": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", - "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -3561,38 +6387,30 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "range-parser": "~1.2.1", + "statuses": "~1.5.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" + "parseurl": "~1.3.3", + "send": "0.17.1" } }, "set-blocking": { @@ -3601,9 +6419,9 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -3622,9 +6440,9 @@ } }, "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, "sharp": { "version": "0.20.8", @@ -3643,6 +6461,21 @@ "tunnel-agent": "^0.6.0" } }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, "shelljs": { "version": "0.7.8", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", @@ -3654,10 +6487,16 @@ "rechoir": "^0.6.2" } }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "simple-concat": { "version": "1.0.0", @@ -3682,6 +6521,18 @@ "is-arrayish": "^0.3.1" } }, + "sisteransi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz", + "integrity": "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, "slice-ansi": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", @@ -3703,14 +6554,6 @@ "use": "^3.1.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -3799,49 +6642,58 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "requires": { - "atob": "^2.1.1", + "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": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "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==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" + "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==" }, "split-string": { "version": "3.1.0", @@ -3862,6 +6714,29 @@ "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "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" + } + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -3876,21 +6751,54 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.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" } } } }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -3901,6 +6809,26 @@ "strip-ansi": "^3.0.0" } }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3925,6 +6853,12 @@ "is-utf8": "^0.2.0" } }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -3947,31 +6881,48 @@ "readable-stream": "^2.3.5" }, "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "supertest": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.2.0.tgz", - "integrity": "sha512-f+ANFG17GuXbMAQRveLLtqmodbKBxqfMwAktPRS0w4R7m+OluM0Nl+Ygr/tZ/0u9IbdwqtBoHspam3A17ThTig==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-4.0.2.tgz", + "integrity": "sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==", + "dev": true, "requires": { "methods": "^1.1.2", "superagent": "^3.8.3" } }, "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, "table": { "version": "3.8.3", - "resolved": "http://registry.npmjs.org/table/-/table-3.8.3.tgz", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "dev": true, "requires": { @@ -3989,6 +6940,25 @@ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "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" + } + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -4003,31 +6973,39 @@ "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" + }, + "dependencies": { + "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": { - "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" - } + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true } } }, "tar": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.6.tgz", - "integrity": "sha512-tMkTnh9EdzxyfW+6GK6fCahagXsnYk6kE6S9Gr9pjVdys769+laCTbodXDhPAjzVtEBazRgP0gYqOjnk9dQzLg==", + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "requires": { - "chownr": "^1.0.1", + "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.3.3", - "minizlib": "^1.1.0", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" + "yallist": "^3.0.3" } }, "tar-fs": { @@ -4053,23 +7031,127 @@ } }, "tar-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", - "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", "requires": { "bl": "^1.0.0", - "buffer-alloc": "^1.1.0", + "buffer-alloc": "^1.2.0", "end-of-stream": "^1.0.0", "fs-constants": "^1.0.0", "readable-stream": "^2.3.0", - "to-buffer": "^1.1.0", + "to-buffer": "^1.1.1", "xtend": "^4.0.0" } }, "tarn": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/tarn/-/tarn-1.1.4.tgz", - "integrity": "sha512-j4samMCQCP5+6Il9/cxCqBd3x4vvlLeVdoyGex0KixPKl4F8LpNbDSC6NDhjianZgUngElRr9UI1ryZqJDhwGg==" + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/tarn/-/tarn-1.1.5.tgz", + "integrity": "sha512-PMtJ3HCLAZeedWjJPgGnCvcphbCOMbtZpjKgLq3qM5Qq9aQud+XHrL0WlrlgnTyS8U+jrjGbEXprFcQrxPy52g==" + }, + "test-exclude": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", + "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + } + } }, "text-table": { "version": "0.2.0", @@ -4077,6 +7159,12 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -4097,11 +7185,23 @@ "integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==", "optional": true }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, "to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -4140,6 +7240,62 @@ "repeat-string": "^1.6.1" } }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -4148,6 +7304,18 @@ "safe-buffer": "^5.0.1" } }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -4158,12 +7326,12 @@ } }, "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "~2.1.24" } }, "typed-function": { @@ -4177,41 +7345,27 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "uglify-js": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.0.tgz", + "integrity": "sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA==", + "dev": true, + "optional": true + }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "set-value": "^2.0.1" } }, "universalify": { @@ -4260,6 +7414,15 @@ } } }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -4284,20 +7447,32 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, "v8flags": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.1.tgz", - "integrity": "sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", "requires": { "homedir-polyfill": "^1.0.1" } @@ -4316,6 +7491,85 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "dev": true, + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -4347,6 +7601,12 @@ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=" }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", @@ -4354,7 +7614,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { "string-width": "^1.0.1", @@ -4375,10 +7635,36 @@ "mkdirp": "^0.5.1" } }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "xxhash": { "version": "0.2.4", @@ -4394,13 +7680,13 @@ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "yargs": { "version": "4.8.1", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", "requires": { "cliui": "^3.2.0", @@ -4426,13 +7712,6 @@ "requires": { "camelcase": "^3.0.0", "lodash.assign": "^4.0.6" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - } } } } diff --git a/package.json b/package.json index bf8ef55..3ddce9e 100755 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "description": "Amsterdam Image server, for uploading and resizing images", "main": "server.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "jest" }, "dependencies": { "bookshelf": "^0.13.3", @@ -43,6 +43,9 @@ "eslint-plugin-import": "^2.6.1", "eslint-plugin-node": "^5.1.0", "eslint-plugin-promise": "^3.5.0", - "eslint-plugin-standard": "^3.0.1" + "eslint-plugin-standard": "^3.0.1", + "jest": "^23.1.0", + "mock-knex": "^0.4.9", + "supertest": "^4.0.2" } } diff --git a/server.js b/server.js index 8249313..3fa95f5 100644 --- a/server.js +++ b/server.js @@ -1,53 +1,5 @@ require('dotenv').config(); -const express = require('express'); -const app = express(); -const imgSteam = require('image-steam'); -const multer = require('multer'); -const passport = require('passport'); -const Strategy = require('passport-http-bearer').Strategy; -const db = require('./db'); - -const upload = multer({ - dest: 'images/', - onError: function (err, next) { - next(err); - }, - fileFilter: function (req, file, cb) { - const allowedTypes = [ - 'image/gif', - 'image/jpeg', - 'image/png', - 'image/svg+xml' - ]; - - if (allowedTypes.indexOf(file.mimetype) === -1) { - req.fileValidationError = 'goes wrong on the mimetype'; - return cb(null, false, new Error('goes wrong on the mimetype')); - } - - cb(null, true); - } -}); - -const imageSteamConfig = { - "storage": { - "defaults": { - "driver": "fs", - "path": "./images", - }, - "cacheTTS": process.env.CACHE_TTS || 86400 * 14, /* 24 * 14 hrs */ - "cacheOptimizedTTS": process.env.CACHE_OPTIMIZED_TTS || 86400 * 14, /* 24 * 14 hrs */ - "cacheArtifacts": process.env.CACHE_ARTIFACTS || true - }, - "throttle": { - "ccProcessors": process.env.THROTTLE_CC_PROCESSORS || 4, - "ccPrefetchers": process.env.THROTTLE_CC_PREFETCHER || 20, - "ccRequests": process.env.THROTTLE_CC_REQUESTS || 100 - }, - log: { - errors: false - } -}; +const app = require('./app'); const argv = require('yargs') .usage('Usage: $0 [options] pathToImage') @@ -71,88 +23,6 @@ const argv = require('yargs') .help() .argv; -passport.use(new Strategy( - function (token, done) { - db.clients.findByToken(token, function (err, client) { - if (err) { - return done(err); - } - if (!client) { - return done(null, false); - } - return done(null, client, {scope: 'all'}); - }); - } -)); - -/** - * Instantiate the Image steam server, and proxy it with - */ -const ImageServer = new imgSteam.http.Connect(imageSteamConfig); -const imageHandler = ImageServer.getHandler(); - -/** - * Most errors is not found - * @TODO: requires debugging if other errors are handled by server - */ -ImageServer.on('error', (err) => { - // Don't log 404 errors, so we do nothing here. -}); - -app.get('/image/*', - function (req, res, next) { - req.url = req.url.replace('/image', ''); - - /** - * Pass request en response to the imageserver - */ - imageHandler(req, res); - }); - -/** - * The url for creating one Image - */ -app.post('/image', - passport.authenticate('bearer', {session: false}), - upload.single('image'), (req, res, next) => { - // req.file is the `image` file - // req.body will hold the text fields, if there were any - // - if (!res.headerSent) { - res.setHeader('Content-Type', 'application/json'); - } - res.send(JSON.stringify({ - url: process.env.APP_URL + '/image/' + req.file.filename - })); - }); - -app.post('/images', - passport.authenticate('bearer', {session: false}), - upload.array('images', 30), (req, res, next) => { - // req.files is array of `photos` files - // req.body will contain the text fields, if there were any - if (!res.headerSent) { - res.setHeader('Content-Type', 'application/json'); - } - - res.send(JSON.stringify(req.files.map((file) => { - return { - url: process.env.APP_URL + '/image/' + req.file.filename - } - }))); - }); - -app.use(function (err, req, res, next) { - const status = err.status ? err.status : 500; - //console.log('err', err); - if (!res.headerSent) { - res.setHeader('Content-Type', 'application/json'); - } - res.status(status).send(JSON.stringify({ - error: err.message - })); -}) - app.listen(argv.port, function () { console.log('Application listen on port %d...', argv.port); //console.log('Image server listening on port %d...', argv.portImageSteam); diff --git a/test/image/test-image.jpg b/test/image/test-image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b6bf2e7a883754cc06cd677909443dea2d64e06 GIT binary patch literal 111231 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 TI6iM~<7!=SNIQDD=l`1kUjEIy literal 0 HcmV?d00001 diff --git a/test/server.test.js b/test/server.test.js new file mode 100644 index 0000000..89c631d --- /dev/null +++ b/test/server.test.js @@ -0,0 +1,59 @@ +jest.mock('../lib/imageServer'); + +const spyReturns = returnValue => jest.fn(() => returnValue); + +const mockedFunctions = { + getImageServer: spyReturns({ + getHandler: spyReturns(true), + on: spyReturns(true) + }) +}; + +// Mock imageServer because it's not working with superagent +jest.doMock('../lib/imageServer', () => mockedFunctions); + +const knex = require('../knex/knex.js'); +const mockKnex = require('mock-knex'); +const tracker = require('mock-knex').getTracker(); + +const app = require('../app'); +const request = require('supertest'); +const agent = request.agent(app); + +describe('Test image server', () => { + + beforeEach(() => { + tracker.install(); + }); + + afterEach(() => { + tracker.uninstall(); + }); + + beforeAll(() => { + mockKnex.mock(knex); + }); + + afterAll(() => { + mockKnex.unmock(knex); + }); + + it('Should upload an image', async () => { + + tracker.on('query', (query) => { + query.response({id: '1', clientName: 'test', token: '123'}); + }); + + const testImage = `${__dirname}/image/test-image.jpg`; + + const res = await agent + .post('/image?access_token=123') + .attach('image', testImage) + ; + + expect(res.statusCode).toEqual(200) + }); + +}); + + From 83e378c3fe61414e1ae2b69538a9233a7d9f6359 Mon Sep 17 00:00:00 2001 From: stijnvdvegt Date: Fri, 24 Jul 2020 10:35:53 +0200 Subject: [PATCH 2/9] add upload and read files endpoint --- server.js | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/server.js b/server.js index 8249313..185534a 100644 --- a/server.js +++ b/server.js @@ -6,6 +6,7 @@ const multer = require('multer'); const passport = require('passport'); const Strategy = require('passport-http-bearer').Strategy; const db = require('./db'); +const fs = require('fs'); const upload = multer({ dest: 'images/', @@ -29,6 +30,25 @@ const upload = multer({ } }); +const uploadFile = multer({ + dest: 'files/', + onError: function (err, next) { + next(err); + }, + fileFilter: function (req, file, cb) { + const allowedTypes = [ + 'application/pdf', + ]; + + if (allowedTypes.indexOf(file.mimetype) === -1) { + req.fileValidationError = 'goes wrong on the mimetype'; + return cb(null, false, new Error('goes wrong on the mimetype')); + } + + cb(null, true); + } +}); + const imageSteamConfig = { "storage": { "defaults": { @@ -109,6 +129,33 @@ app.get('/image/*', imageHandler(req, res); }); + +app.get('/files/*', + function (req, res, next) { + console.log(req.url); + + const filePath = req.url.replace(/^\/+/, '');; + + // Check if file specified by the filePath exists + fs.exists(filePath, function(exists){ + if (exists) { + // Content-type is very interesting part that guarantee that + // Web browser will handle response in an appropriate manner. + res.writeHead(200, { + "Content-Type": "application/octet-stream", + "Content-Disposition": "attachment; filename=test" + }); + fs.createReadStream(filePath).pipe(res); + } else { + res.writeHead(400, {"Content-Type": "text/plain"}); + res.end("ERROR File does not exist"); + } + }); + + + + }); + /** * The url for creating one Image */ @@ -142,6 +189,21 @@ app.post('/images', }))); }); +app.post('/file', + passport.authenticate('bearer', {session: false}), + uploadFile.single('file'), (req, res, next) => { + // req.file is the `image` file + // req.body will hold the text fields, if there were any + // + if (!res.headerSent) { + res.setHeader('Content-Type', 'application/json'); + } + console.log(req.file); + res.send(JSON.stringify({ + url: process.env.APP_URL + '/files/' + req.file.filename + })); + }); + app.use(function (err, req, res, next) { const status = err.status ? err.status : 500; //console.log('err', err); From aa24b4a81f02584023e835b9a457495b96f5d26f Mon Sep 17 00:00:00 2001 From: Rudi van Hierden Date: Mon, 3 Aug 2020 15:18:42 +0200 Subject: [PATCH 3/9] Allow excel & doc files --- server.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server.js b/server.js index 185534a..cd6b268 100644 --- a/server.js +++ b/server.js @@ -38,6 +38,10 @@ const uploadFile = multer({ fileFilter: function (req, file, cb) { const allowedTypes = [ 'application/pdf', + 'application/msword', + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'application/vnd.ms-excel', + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ]; if (allowedTypes.indexOf(file.mimetype) === -1) { From bec9bd4e6a8563d610b66cd9087e6143abafcf1e Mon Sep 17 00:00:00 2001 From: Rudi van Hierden Date: Tue, 4 Aug 2020 11:32:19 +0200 Subject: [PATCH 4/9] Set correct file extension and mimetype for download --- package-lock.json | 34 +++++++++++++++++++++++++++------- package.json | 2 ++ server.js | 26 ++++++++++++++++++++++++-- 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 566b21d..d89dfa5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -513,6 +513,11 @@ "supports-color": "^2.0.0" } }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" + }, "chownr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", @@ -718,6 +723,11 @@ "resolved": "https://registry.npmjs.org/create-error/-/create-error-0.3.1.tgz", "integrity": "sha1-aYECRaYp5lRDK/BDdzYAA6U1GiM=" }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" + }, "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", @@ -2615,6 +2625,16 @@ "typed-function": "1.0.3" } }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -2656,16 +2676,16 @@ "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==" }, "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==" + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" }, "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "requires": { - "mime-db": "~1.36.0" + "mime-db": "1.44.0" } }, "mimic-response": { diff --git a/package.json b/package.json index bf8ef55..37bdee5 100755 --- a/package.json +++ b/package.json @@ -29,6 +29,8 @@ "http-proxy-middleware": "^0.19.0", "image-steam": "^0.46.4", "knex": "^0.15.2", + "md5": "^2.3.0", + "mime-types": "^2.1.27", "multer": "^1.3.1", "mysql": "^2.16.0", "passport": "^0.4.0", diff --git a/server.js b/server.js index cd6b268..3b15225 100644 --- a/server.js +++ b/server.js @@ -7,6 +7,8 @@ const passport = require('passport'); const Strategy = require('passport-http-bearer').Strategy; const db = require('./db'); const fs = require('fs'); +const md5 = require('md5'); +const mime = require('mime-types'); const upload = multer({ dest: 'images/', @@ -30,7 +32,18 @@ const upload = multer({ } }); +const storage = multer.diskStorage({ + filename: function (req, file, cb) { + const ext = file.originalname.substring(file.originalname.lastIndexOf('.')); + const filename = md5(Date.now() + '-' + file.originalname); + cb(null, filename + ext) + }, + destination: function (req, file, cb) { + cb(null, 'files/') + }, + }); const uploadFile = multer({ + storage: storage, dest: 'files/', onError: function (err, next) { next(err); @@ -50,6 +63,10 @@ const uploadFile = multer({ } cb(null, true); + }, + limits: { + // 15 mb limit + fileSize: 15*1024*1024 } }); @@ -145,9 +162,14 @@ app.get('/files/*', if (exists) { // Content-type is very interesting part that guarantee that // Web browser will handle response in an appropriate manner. + + // Get filename + const filename = filePath.substring(filePath.lastIndexOf('/') + 1); + const mimeType = mime.lookup(filename); + res.writeHead(200, { - "Content-Type": "application/octet-stream", - "Content-Disposition": "attachment; filename=test" + "Content-Type": mimeType, + "Content-Disposition": "attachment; filename=" + filename }); fs.createReadStream(filePath).pipe(res); } else { From 0419b07c9a5d3a256daaeaec119df6d3c774cf73 Mon Sep 17 00:00:00 2001 From: Rudi van Hierden Date: Fri, 7 Aug 2020 10:57:05 +0200 Subject: [PATCH 5/9] Keep original filename but add small part of md5 for uniqueness --- server.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/server.js b/server.js index 3b15225..5c29e76 100644 --- a/server.js +++ b/server.js @@ -35,8 +35,9 @@ const upload = multer({ const storage = multer.diskStorage({ filename: function (req, file, cb) { const ext = file.originalname.substring(file.originalname.lastIndexOf('.')); - const filename = md5(Date.now() + '-' + file.originalname); - cb(null, filename + ext) + const originalname = file.originalname.substring(0, file.originalname.lastIndexOf('.')) + const filename = originalname + '-' + md5(Date.now() + '-' + file.originalname).substring(0, 5) + ext; + cb(null, filename) }, destination: function (req, file, cb) { cb(null, 'files/') @@ -153,10 +154,9 @@ app.get('/image/*', app.get('/files/*', function (req, res, next) { - console.log(req.url); - - const filePath = req.url.replace(/^\/+/, '');; + const filePath = decodeURI(req.url.replace(/^\/+/, ''));; + // Check if file specified by the filePath exists fs.exists(filePath, function(exists){ if (exists) { From 4e8cd7b6aef78de1007765dd529f0489d5ebe8f1 Mon Sep 17 00:00:00 2001 From: Stijn van der Vegt Date: Wed, 27 Oct 2021 16:45:56 +0200 Subject: [PATCH 6/9] Add file upload and get endpoint - Create file upload endpoint with multer - Create get endpoint to get file from S3 or filesystem - Change file destination te /files - Add test - Add extension to all files and images - Some refactoring --- .gitignore | 1 + app.js | 109 ++++++++++++++++++++++++++++++++------------ lib/imageServer.js | 15 +++++- lib/multer.js | 61 +++++++++++++++++++++++-- lib/passport.js | 19 ++++++++ lib/s3.js | 44 ++++++++++++++++++ test/multer.test.js | 21 +++++++++ test/server.test.js | 16 +++++++ 8 files changed, 251 insertions(+), 35 deletions(-) create mode 100644 lib/passport.js create mode 100644 lib/s3.js create mode 100644 test/multer.test.js diff --git a/.gitignore b/.gitignore index d4f1de2..29df226 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,7 @@ typings/ .node_repl_history images +files # Output of 'npm pack' *.tgz diff --git a/app.js b/app.js index ff7daa5..eaaa731 100644 --- a/app.js +++ b/app.js @@ -1,25 +1,12 @@ require('dotenv').config(); const express = require('express'); const app = express(); -const passport = require('passport'); -const Strategy = require('passport-http-bearer').Strategy; -const db = require('./db'); +const passport = require('./lib/passport'); const upload = require('./lib/multer'); const ImageServer = require('./lib/imageServer').getImageServer(); - -passport.use(new Strategy( - function (token, done) { - db.clients.findByToken(token, function (err, client) { - if (err) { - return done(err); - } - if (!client) { - return done(null, false); - } - return done(null, client, {scope: 'all'}); - }); - } -)); +const s3 = require('./lib/s3'); +const fs = require('fs'); +const mime = require('mime-types'); /** * Instantiate the Image steam server, and proxy it with @@ -34,12 +21,27 @@ ImageServer.on('error', (err) => { // Don't log 404 errors, so we do nothing here. }); +// Global middleware to catch errors +app.use(function (err, req, res, next) { + const status = err.status ? err.status : 500; + if (status > 500) { + console.error(err); + } + + if (!res.headerSent) { + res.setHeader('Content-Type', 'application/json'); + } + res.status(status).send(JSON.stringify({ + error: err.message + })); +}); + app.get('/image/*', function (req, res, next) { req.url = req.url.replace('/image', ''); /** - * Pass request en response to the imageserver + * Pass request en response to the image server */ imageHandler(req, res); }); @@ -56,8 +58,9 @@ app.post('/image', if (!res.headerSent) { res.setHeader('Content-Type', 'application/json'); } + const filename = req.file.key || req.file.filename; res.send(JSON.stringify({ - url: process.env.APP_URL + '/image/' + req.file.filename + url: process.env.APP_URL + '/image/' + filename })); }); @@ -71,21 +74,67 @@ app.post('/images', } res.send(JSON.stringify(req.files.map((file) => { + const filename = file.key || file.filename; return { - url: process.env.APP_URL + '/image/' + req.file.filename + url: process.env.APP_URL + '/image/' + filename } }))); }); -app.use(function (err, req, res, next) { - const status = err.status ? err.status : 500; - //console.log('err', err); - if (!res.headerSent) { - res.setHeader('Content-Type', 'application/json'); - } - res.status(status).send(JSON.stringify({ - error: err.message - })); -}) +app.post('/file', + passport.authenticate('bearer', {session: false}), + upload.single('file'), (req, res, next) => { + // req.file is the `image` file + // req.body will hold the text fields, if there were any + // + if (!res.headerSent) { + res.setHeader('Content-Type', 'application/json'); + } + + const filename = req.file.key || req.file.filename; + res.send(JSON.stringify({ + url: process.env.APP_URL + '/files/' + filename + })); + }); + +function handleFileResponse(filePath, readStream, res) { + // Content-type is very interesting part that guarantee that + // Web browser will handle response in an appropriate manner. + + // Get filename + const filename = filePath.substring(filePath.lastIndexOf('/') + 1); + const mimeType = mime.lookup(filename); + + res.writeHead(200, { + "Content-Type": mimeType, + "Content-Disposition": "attachment; filename=" + filename + }); + + readStream.pipe(res); +} + +app.get('/files/*', + async function (req, res, next) { + + const filePath = decodeURI(req.url.replace(/^\/+/, '').replace('files/', '')); + + if (s3.isEnabled()) { + const readStream = s3.getFile(filePath).createReadStream(); + return handleFileResponse(filePath, readStream, res); + } + + // Check if file specified by the filePath exists + fs.exists(filePath, function(exists) { + if (exists) { + const readStream = fs.createReadStream(filePath) + handleFileResponse(filePath, readStream, res); + } else { + res.writeHead(400, {"Content-Type": "text/plain"}); + res.end("ERROR File does not exist"); + } + }); + }); module.exports = app; + + diff --git a/lib/imageServer.js b/lib/imageServer.js index 4216f2a..8170ee4 100644 --- a/lib/imageServer.js +++ b/lib/imageServer.js @@ -1,13 +1,14 @@ require('dotenv').config(); +const s3 = require('./s3'); + module.exports.getImageServer = () => { - console.log('getImageServer method'); const imgSteam = require('image-steam'); const imageSteamConfig = { "storage": { "defaults": { "driver": "fs", - "path": "./images", + "path": "./files", }, "cacheTTS": process.env.CACHE_TTS || 86400 * 14, /* 24 * 14 hrs */ "cacheOptimizedTTS": process.env.CACHE_OPTIMIZED_TTS || 86400 * 14, /* 24 * 14 hrs */ @@ -23,6 +24,16 @@ module.exports.getImageServer = () => { } }; + if (s3.isEnabled()) { + imageSteamConfig.storage.defaults = { + "driverPath": "image-steam-s3", + "endpoint": process.env.S3_ENDPOINT, + "bucket": process.env.S3_BUCKET, + "accessKey": process.env.S3_KEY, + "secretKey": process.env.S3_SECRET + }; + } + /** * Instantiate the Image steam server, and proxy it with */ diff --git a/lib/multer.js b/lib/multer.js index 9140ebd..09e0649 100644 --- a/lib/multer.js +++ b/lib/multer.js @@ -1,12 +1,29 @@ const multer = require('multer'); +const multerS3 = require('multer-s3'); +const s3 = require('./s3'); +const md5 = require('md5'); -module.exports = multer({ - dest: 'images/', +/** + * + * @param file + * @returns {string} + */ +function generateFileName(file) { + const ext = file.originalname.substring(file.originalname.lastIndexOf('.')); + return Date.now().toString() + ext +} + +const multerConfig = { onError: function (err, next) { next(err); }, fileFilter: function (req, file, cb) { const allowedTypes = [ + 'application/pdf', + 'application/msword', + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'application/vnd.ms-excel', + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'image/gif', 'image/jpeg', 'image/png', @@ -19,5 +36,43 @@ module.exports = multer({ } cb(null, true); + }, + limits: { + // 15 mb limit + fileSize: 15*1024*1024 // Todo: make configurable } -}); +}; + +if (s3.isEnabled()) { + try { + multerConfig.storage = multerS3({ + s3: s3.getClient(), + bucket: process.env.S3_BUCKET, + acl: 'public-read', + metadata: function (req, file, cb) { + cb(null, { + fieldName: file.fieldname + }); + }, + destination: function (req, file, cb) { + cb(null, 'files/') + }, + key: function (req, file, cb) { + cb(null, generateFileName(file)) + } + }); + } catch(error) { + throw new Error(`S3 Multer storage error: ${error.message}`); + } +} else { + multerConfig.storage = multer.diskStorage({ + filename: function (req, file, cb) { + cb(null, generateFileName(file)) + }, + destination: function (req, file, cb) { + cb(null, 'files/') + }, + }); +} + +module.exports = multer(multerConfig); diff --git a/lib/passport.js b/lib/passport.js new file mode 100644 index 0000000..1e38ffc --- /dev/null +++ b/lib/passport.js @@ -0,0 +1,19 @@ +const passport = require('passport'); +const Strategy = require('passport-http-bearer').Strategy; +const db = require('../db'); + +passport.use(new Strategy( + function (token, done) { + db.clients.findByToken(token, function (err, client) { + if (err) { + return done(err); + } + if (!client) { + return done(null, false); + } + return done(null, client, {scope: 'all'}); + }); + } +)); + +module.exports = passport; diff --git a/lib/s3.js b/lib/s3.js new file mode 100644 index 0000000..aed0b0e --- /dev/null +++ b/lib/s3.js @@ -0,0 +1,44 @@ +const AWS = require('aws-sdk'); + +module.exports = { + client: null, + + /** + * @returns {boolean} + */ + isEnabled: () => { + return !!process.env.S3_ENDPOINT + }, + /** + * @returns {S3|null} + */ + getClient: function () { + if (this.isEnabled() === false) { + return null; + } + if (this.client) { + return this.client; + } + const endpoint = new AWS.Endpoint(process.env.S3_ENDPOINT); + this.client = new AWS.S3({ + accessKeyId: process.env.S3_KEY, + secretAccessKey: process.env.S3_SECRET, + endpoint: endpoint + }); + + return this.client; + }, + /** + * + * @param {string} path + * @returns {Request} + */ + getFile: function (path) { + const params = { + Bucket: process.env.S3_BUCKET, + Key: path + } + + return this.getClient().getObject(params); + } +} diff --git a/test/multer.test.js b/test/multer.test.js new file mode 100644 index 0000000..483dc53 --- /dev/null +++ b/test/multer.test.js @@ -0,0 +1,21 @@ +describe('Test multer config', () => { + + it('Should throw exception when bucket is missing', async () => { + process.env = {}; + process.env.S3_ENDPOINT = 'test'; + expect(() => { + require('../lib/multer'); + }).toThrow(); + }); + + it('Should use aws', async () => { + process.env = {}; + process.env.S3_ENDPOINT = 'test'; + process.env.S3_BUCKET = 'bla'; + const multer = require('../lib/multer'); + + console.log(multer.storage); + }); +}); + + diff --git a/test/server.test.js b/test/server.test.js index 89c631d..d32f76a 100644 --- a/test/server.test.js +++ b/test/server.test.js @@ -54,6 +54,22 @@ describe('Test image server', () => { expect(res.statusCode).toEqual(200) }); + it('Should upload a file', async () => { + + tracker.on('query', (query) => { + query.response({id: '1', clientName: 'test', token: '123'}); + }); + + const testFile = `${__dirname}/image/test-image.jpg`; + + const res = await agent + .post('/file?access_token=123') + .attach('file', testFile) + ; + + expect(res.statusCode).toEqual(200) + }); + }); From 585db583aa158cb06b7831d977a603bc9a25005f Mon Sep 17 00:00:00 2001 From: Stijn van der Vegt Date: Wed, 27 Oct 2021 20:38:36 +0200 Subject: [PATCH 7/9] add eslint and prettier --- package-lock.json | 256 ++++++++++++++++----------------------------- package.json | 10 +- prettier.config.js | 6 ++ 3 files changed, 105 insertions(+), 167 deletions(-) create mode 100644 prettier.config.js diff --git a/package-lock.json b/package-lock.json index 38944da..1311bff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2171,6 +2171,12 @@ } } }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true + }, "eslint-config-standard": { "version": "10.2.1", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz", @@ -2205,12 +2211,13 @@ } }, "eslint-module-utils": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", - "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz", + "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==", "dev": true, "requires": { "debug": "^3.2.7", + "find-up": "^2.1.0", "pkg-dir": "^2.0.0" }, "dependencies": { @@ -2223,37 +2230,6 @@ "ms": "^2.1.1" } }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "eslint-plugin-import": { - "version": "2.24.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", - "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", - "dev": true, - "requires": { - "array-includes": "^3.1.3", - "array.prototype.flat": "^1.2.4", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.6.2", - "find-up": "^2.0.0", - "has": "^1.0.3", - "is-core-module": "^2.6.0", - "minimatch": "^3.0.4", - "object.values": "^1.1.4", - "pkg-up": "^2.0.0", - "read-pkg-up": "^3.0.0", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.11.0" - }, - "dependencies": { "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -2263,18 +2239,6 @@ "locate-path": "^2.0.0" } }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "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" - } - }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -2285,6 +2249,12 @@ "path-exists": "^3.0.0" } }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -2309,63 +2279,49 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + } + } + }, + "eslint-plugin-import": { + "version": "2.25.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz", + "integrity": "sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==", + "dev": true, + "requires": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.0", + "has": "^1.0.3", + "is-core-module": "^2.7.0", + "is-glob": "^4.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.5", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, + "dependencies": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "is-extglob": "^2.1.1" } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true } } }, @@ -2389,12 +2345,27 @@ } } }, + "eslint-plugin-prettier": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz", + "integrity": "sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, "eslint-plugin-promise": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz", "integrity": "sha512-JiFL9UFR15NKpHyGii1ZcvmtIqa3UTwiDAGb8atSffe43qJ3+1czVGN6UtkklpcJ2DVnqvTMzEKRaJdBkAL2aQ==", "dev": true }, + "eslint-plugin-sonarjs": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.10.0.tgz", + "integrity": "sha512-FBRIBmWQh2UAfuLSnuYEfmle33jIup9hfkR0X8pkfjeCKNpHUG8qyZI63ahs3aw8CJrv47QJ9ccdK3ZxKH016A==", + "dev": true + }, "eslint-plugin-standard": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz", @@ -2432,9 +2403,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -2449,9 +2420,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -2684,6 +2655,12 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -5030,12 +5007,6 @@ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "dev": true }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -6201,66 +6172,6 @@ } } }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, "pluralize": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", @@ -6325,6 +6236,21 @@ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, + "prettier": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, "pretty-format": { "version": "23.6.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", diff --git a/package.json b/package.json index 9bbc31c..f3f9a45 100755 --- a/package.json +++ b/package.json @@ -15,7 +15,9 @@ "description": "Amsterdam Image server, for uploading and resizing images", "main": "server.js", "scripts": { - "test": "jest" + "test": "jest", + "lint": "npx eslint lib/** server.js app.js db/** --ext .js", + "prettier": "npx prettier --write lib/*.js app.js server.js db/*.js" }, "dependencies": { "aws-sdk": "^2.1003.0", @@ -39,13 +41,17 @@ "license": "MIT", "devDependencies": { "eslint": "^3.19.0", + "eslint-config-prettier": "^8.3.0", "eslint-config-standard": "^10.2.1", - "eslint-plugin-import": "^2.6.1", + "eslint-plugin-import": "^2.25.2", "eslint-plugin-node": "^5.1.0", + "eslint-plugin-prettier": "^3.3.1", "eslint-plugin-promise": "^3.5.0", + "eslint-plugin-sonarjs": "^0.10.0", "eslint-plugin-standard": "^3.0.1", "jest": "^23.1.0", "mock-knex": "^0.4.9", + "prettier": "^2.4.1", "supertest": "^4.0.2" } } diff --git a/prettier.config.js b/prettier.config.js new file mode 100644 index 0000000..0dae7a0 --- /dev/null +++ b/prettier.config.js @@ -0,0 +1,6 @@ +module.exports = { + tabWidth: 2, + semi: true, + singleQuote: true, + trailingComma: 'es5', +} From e1fdb26603efb43d3c38e57a3f741c7bffe0500c Mon Sep 17 00:00:00 2001 From: Stijn van der Vegt Date: Wed, 27 Oct 2021 20:42:14 +0200 Subject: [PATCH 8/9] run prettier --- .eslintrc.json | 24 ++++++++ app.js | 150 ++++++++++++++++++++++++--------------------- db/clients.js | 26 ++++---- lib/imageServer.js | 37 +++++------ lib/multer.js | 22 +++---- lib/passport.js | 10 +-- lib/s3.js | 12 ++-- server.js | 11 ++-- 8 files changed, 163 insertions(+), 129 deletions(-) create mode 100644 .eslintrc.json diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..323b824 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,24 @@ +{ + "env": { + "commonjs": true, + "es6": true, + "node": true + }, + "extends": ["prettier", "plugin:sonarjs/recommended"], + "plugins": ["prettier", "sonarjs"], + "globals": { + "Atomics": "readonly", + "SharedArrayBuffer": "readonly" + }, + "parserOptions": { + "ecmaVersion": 2018 + }, + "rules": { + "prettier/prettier": "error", + "sonarjs/cognitive-complexity": "error", + "sonarjs/no-identical-expressions": "error", + "sonarjs/no-duplicate-string": "error", + "sonarjs/no-identical-functions": "error", + "sonarjs/prefer-immediate-return": "error" + } +} diff --git a/app.js b/app.js index eaaa731..ace2cce 100644 --- a/app.js +++ b/app.js @@ -21,6 +21,12 @@ ImageServer.on('error', (err) => { // Don't log 404 errors, so we do nothing here. }); +function sendJsonHeaders(res) { + if (!res.headerSent) { + res.setHeader('Content-Type', 'application/json'); + } +} + // Global middleware to catch errors app.use(function (err, req, res, next) { const status = err.status ? err.status : 500; @@ -28,74 +34,84 @@ app.use(function (err, req, res, next) { console.error(err); } - if (!res.headerSent) { - res.setHeader('Content-Type', 'application/json'); - } - res.status(status).send(JSON.stringify({ - error: err.message - })); + sendJsonHeaders(res); + res.status(status).send( + JSON.stringify({ + error: err.message, + }) + ); }); -app.get('/image/*', - function (req, res, next) { - req.url = req.url.replace('/image', ''); +app.get('/image/*', function (req, res, next) { + req.url = req.url.replace('/image', ''); - /** - * Pass request en response to the image server - */ - imageHandler(req, res); - }); + /** + * Pass request en response to the image server + */ + imageHandler(req, res); +}); /** * The url for creating one Image */ -app.post('/image', - passport.authenticate('bearer', {session: false}), - upload.single('image'), (req, res, next) => { +app.post( + '/image', + passport.authenticate('bearer', { session: false }), + upload.single('image'), + (req, res, next) => { // req.file is the `image` file // req.body will hold the text fields, if there were any // - if (!res.headerSent) { - res.setHeader('Content-Type', 'application/json'); - } + sendJsonHeaders(res); const filename = req.file.key || req.file.filename; - res.send(JSON.stringify({ - url: process.env.APP_URL + '/image/' + filename - })); - }); + res.send( + JSON.stringify({ + url: process.env.APP_URL + '/image/' + filename, + }) + ); + } +); -app.post('/images', - passport.authenticate('bearer', {session: false}), - upload.array('images', 30), (req, res, next) => { +app.post( + '/images', + passport.authenticate('bearer', { session: false }), + upload.array('images', 30), + (req, res, next) => { // req.files is array of `photos` files // req.body will contain the text fields, if there were any - if (!res.headerSent) { - res.setHeader('Content-Type', 'application/json'); - } - - res.send(JSON.stringify(req.files.map((file) => { - const filename = file.key || file.filename; - return { - url: process.env.APP_URL + '/image/' + filename - } - }))); - }); + sendJsonHeaders(res); + + res.send( + JSON.stringify( + req.files.map((file) => { + const filename = file.key || file.filename; + return { + url: process.env.APP_URL + '/image/' + filename, + }; + }) + ) + ); + } +); -app.post('/file', - passport.authenticate('bearer', {session: false}), - upload.single('file'), (req, res, next) => { +app.post( + '/file', + passport.authenticate('bearer', { session: false }), + upload.single('file'), + (req, res, next) => { // req.file is the `image` file // req.body will hold the text fields, if there were any // - if (!res.headerSent) { - res.setHeader('Content-Type', 'application/json'); - } + sendJsonHeaders(res); const filename = req.file.key || req.file.filename; - res.send(JSON.stringify({ - url: process.env.APP_URL + '/files/' + filename - })); - }); + res.send( + JSON.stringify({ + url: process.env.APP_URL + '/files/' + filename, + }) + ); + } +); function handleFileResponse(filePath, readStream, res) { // Content-type is very interesting part that guarantee that @@ -106,35 +122,31 @@ function handleFileResponse(filePath, readStream, res) { const mimeType = mime.lookup(filename); res.writeHead(200, { - "Content-Type": mimeType, - "Content-Disposition": "attachment; filename=" + filename + 'Content-Type': mimeType, + 'Content-Disposition': 'attachment; filename=' + filename, }); readStream.pipe(res); } -app.get('/files/*', - async function (req, res, next) { +app.get('/files/*', async function (req, res, next) { + const filePath = decodeURI(req.url.replace(/^\/+/, '').replace('files/', '')); - const filePath = decodeURI(req.url.replace(/^\/+/, '').replace('files/', '')); + if (s3.isEnabled()) { + const readStream = s3.getFile(filePath).createReadStream(); + return handleFileResponse(filePath, readStream, res); + } - if (s3.isEnabled()) { - const readStream = s3.getFile(filePath).createReadStream(); - return handleFileResponse(filePath, readStream, res); + // Check if file specified by the filePath exists + fs.exists(filePath, function (exists) { + if (exists) { + const readStream = fs.createReadStream(filePath); + handleFileResponse(filePath, readStream, res); + } else { + res.writeHead(400, { 'Content-Type': 'text/plain' }); + res.end('ERROR File does not exist'); } - - // Check if file specified by the filePath exists - fs.exists(filePath, function(exists) { - if (exists) { - const readStream = fs.createReadStream(filePath) - handleFileResponse(filePath, readStream, res); - } else { - res.writeHead(400, {"Content-Type": "text/plain"}); - res.end("ERROR File does not exist"); - } - }); }); +}); module.exports = app; - - diff --git a/db/clients.js b/db/clients.js index 5ad836c..28ee36b 100755 --- a/db/clients.js +++ b/db/clients.js @@ -4,26 +4,24 @@ const bookshelf = require('bookshelf')(knex); const clients = bookshelf.Model.extend({ tableName: 'clients', hasTimestamps: true, - hasTimestamps: ['created_at', 'updated_at'] + hasTimestamps: ['created_at', 'updated_at'], }); exports.clients = clients; -exports.findByToken = function(token, cb) { - process.nextTick(function() { - clients - .fetchAll() - .then(function (records) { - records = records.serialize(); +exports.findByToken = function (token, cb) { + process.nextTick(function () { + clients.fetchAll().then(function (records) { + records = records.serialize(); - for (var i = 0, len = records.length; i < len; i++) { - var record = records[i]; - if (record.token === token) { - return cb(null, record); - } + for (var i = 0, len = records.length; i < len; i++) { + var record = records[i]; + if (record.token === token) { + return cb(null, record); } + } - return cb(null, null); + return cb(null, null); }); }); -} +}; diff --git a/lib/imageServer.js b/lib/imageServer.js index 8170ee4..7806f20 100644 --- a/lib/imageServer.js +++ b/lib/imageServer.js @@ -5,32 +5,33 @@ module.exports.getImageServer = () => { const imgSteam = require('image-steam'); const imageSteamConfig = { - "storage": { - "defaults": { - "driver": "fs", - "path": "./files", + storage: { + defaults: { + driver: 'fs', + path: './files', }, - "cacheTTS": process.env.CACHE_TTS || 86400 * 14, /* 24 * 14 hrs */ - "cacheOptimizedTTS": process.env.CACHE_OPTIMIZED_TTS || 86400 * 14, /* 24 * 14 hrs */ - "cacheArtifacts": process.env.CACHE_ARTIFACTS || true + cacheTTS: process.env.CACHE_TTS || 86400 * 14 /* 24 * 14 hrs */, + cacheOptimizedTTS: + process.env.CACHE_OPTIMIZED_TTS || 86400 * 14 /* 24 * 14 hrs */, + cacheArtifacts: process.env.CACHE_ARTIFACTS || true, }, - "throttle": { - "ccProcessors": process.env.THROTTLE_CC_PROCESSORS || 4, - "ccPrefetchers": process.env.THROTTLE_CC_PREFETCHER || 20, - "ccRequests": process.env.THROTTLE_CC_REQUESTS || 100 + throttle: { + ccProcessors: process.env.THROTTLE_CC_PROCESSORS || 4, + ccPrefetchers: process.env.THROTTLE_CC_PREFETCHER || 20, + ccRequests: process.env.THROTTLE_CC_REQUESTS || 100, }, log: { - errors: false - } + errors: false, + }, }; if (s3.isEnabled()) { imageSteamConfig.storage.defaults = { - "driverPath": "image-steam-s3", - "endpoint": process.env.S3_ENDPOINT, - "bucket": process.env.S3_BUCKET, - "accessKey": process.env.S3_KEY, - "secretKey": process.env.S3_SECRET + driverPath: 'image-steam-s3', + endpoint: process.env.S3_ENDPOINT, + bucket: process.env.S3_BUCKET, + accessKey: process.env.S3_KEY, + secretKey: process.env.S3_SECRET, }; } diff --git a/lib/multer.js b/lib/multer.js index 09e0649..de43a7d 100644 --- a/lib/multer.js +++ b/lib/multer.js @@ -10,7 +10,7 @@ const md5 = require('md5'); */ function generateFileName(file) { const ext = file.originalname.substring(file.originalname.lastIndexOf('.')); - return Date.now().toString() + ext + return Date.now().toString() + ext; } const multerConfig = { @@ -27,7 +27,7 @@ const multerConfig = { 'image/gif', 'image/jpeg', 'image/png', - 'image/svg+xml' + 'image/svg+xml', ]; if (allowedTypes.indexOf(file.mimetype) === -1) { @@ -39,8 +39,8 @@ const multerConfig = { }, limits: { // 15 mb limit - fileSize: 15*1024*1024 // Todo: make configurable - } + fileSize: 15 * 1024 * 1024, // Todo: make configurable + }, }; if (s3.isEnabled()) { @@ -51,26 +51,26 @@ if (s3.isEnabled()) { acl: 'public-read', metadata: function (req, file, cb) { cb(null, { - fieldName: file.fieldname + fieldName: file.fieldname, }); }, destination: function (req, file, cb) { - cb(null, 'files/') + cb(null, 'files/'); }, key: function (req, file, cb) { - cb(null, generateFileName(file)) - } + cb(null, generateFileName(file)); + }, }); - } catch(error) { + } catch (error) { throw new Error(`S3 Multer storage error: ${error.message}`); } } else { multerConfig.storage = multer.diskStorage({ filename: function (req, file, cb) { - cb(null, generateFileName(file)) + cb(null, generateFileName(file)); }, destination: function (req, file, cb) { - cb(null, 'files/') + cb(null, 'files/'); }, }); } diff --git a/lib/passport.js b/lib/passport.js index 1e38ffc..4878c76 100644 --- a/lib/passport.js +++ b/lib/passport.js @@ -2,8 +2,8 @@ const passport = require('passport'); const Strategy = require('passport-http-bearer').Strategy; const db = require('../db'); -passport.use(new Strategy( - function (token, done) { +passport.use( + new Strategy(function (token, done) { db.clients.findByToken(token, function (err, client) { if (err) { return done(err); @@ -11,9 +11,9 @@ passport.use(new Strategy( if (!client) { return done(null, false); } - return done(null, client, {scope: 'all'}); + return done(null, client, { scope: 'all' }); }); - } -)); + }) +); module.exports = passport; diff --git a/lib/s3.js b/lib/s3.js index aed0b0e..06cfbc3 100644 --- a/lib/s3.js +++ b/lib/s3.js @@ -7,7 +7,7 @@ module.exports = { * @returns {boolean} */ isEnabled: () => { - return !!process.env.S3_ENDPOINT + return !!process.env.S3_ENDPOINT; }, /** * @returns {S3|null} @@ -23,7 +23,7 @@ module.exports = { this.client = new AWS.S3({ accessKeyId: process.env.S3_KEY, secretAccessKey: process.env.S3_SECRET, - endpoint: endpoint + endpoint: endpoint, }); return this.client; @@ -36,9 +36,9 @@ module.exports = { getFile: function (path) { const params = { Bucket: process.env.S3_BUCKET, - Key: path - } + Key: path, + }; return this.getClient().getObject(params); - } -} + }, +}; diff --git a/server.js b/server.js index 7847d66..108594b 100644 --- a/server.js +++ b/server.js @@ -5,23 +5,22 @@ const argv = require('yargs') .usage('Usage: $0 [options] pathToImage') .demand(0) .options({ - 'port': { + port: { alias: 'p', describe: 'Port number the service will listen to', type: 'number', group: 'Image service', - default: process.env.PORT_API || 9999 + default: process.env.PORT_API || 9999, }, - 'portImageSteam': { + portImageSteam: { alias: 'pis', describe: 'Port number the Image server will listen to', type: 'number', group: 'Image service', - default: process.env.PORT_IMAGE_SERVER || 13337 + default: process.env.PORT_IMAGE_SERVER || 13337, }, }) - .help() - .argv; + .help().argv; app.listen(argv.port, function () { console.log('Application listen on port %d...', argv.port); From ca0369d261990372586e762a0a6ba6e614cba7ff Mon Sep 17 00:00:00 2001 From: Stijn van der Vegt Date: Wed, 27 Oct 2021 20:46:53 +0200 Subject: [PATCH 9/9] add workflows gitops and lint --- .github/workflows/gitops.yml | 76 ++++++++++++++++++++++++++++++++++++ .github/workflows/lint.yaml | 11 ++++++ gitops_push | 24 ++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 .github/workflows/gitops.yml create mode 100644 .github/workflows/lint.yaml create mode 100644 gitops_push diff --git a/.github/workflows/gitops.yml b/.github/workflows/gitops.yml new file mode 100644 index 0000000..beb3e0b --- /dev/null +++ b/.github/workflows/gitops.yml @@ -0,0 +1,76 @@ +name: Gitops + +# Run this workflow every time a new commit pushed to your repository +on: + workflow_dispatch: + inputs: + environmentValuesFile: + description: 'Gitops environment values file' + required: true + default: 'dev' + push: + branches: + - master + - development + - release/* + +jobs: + gitops: + environment: gitops + env: + HELM_REPO_NAME: openstad-kubernetes + HELM_CHART_FOLDER: k8s/openstad + GIT_USER_EMAIL: github@ci.push + GIT_USER_NAME: GitHub + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + HELM_REPO: ${{ secrets.HELM_REPO }} + HELM_REPO_WITH_TOKEN: ${{ secrets.HELM_REPO_WITH_TOKEN }} + GITOPS_RELEASE_BRANCH: ${{ secrets.GITOPS_RELEASE_BRANCH }} + BRANCH_REF: ${{ github.ref }} + GITOPS_VALUES_FILE: k8s/openstad/environments/dev.values.yaml + + name: gitops commit + runs-on: ubuntu-latest + + services: + docker: + image: docker + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Set environment to acc + id: acc_values_file + shell: bash + if: contains(github.ref, 'release') + run: echo "GITOPS_VALUES_FILE=k8s/openstad/environments/acc.values.yaml" >> $GITHUB_ENV + + - name: Set environment to production + id: prod_values_file + shell: bash + if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/master' + run: echo "GITOPS_VALUES_FILE=k8s/openstad/environments/prod.values.yaml" >> $GITHUB_ENV + + - name: Set commit SHA & current branch + id: vars + shell: bash + run: | + echo "::set-output name=sha_short::$(git rev-parse --short HEAD)" + echo "::set-output name=current_branch::$(git branch --show-current | sed "s/\//-/g")" + + - name: Install yq + run: sudo snap install yq --channel=v3/stable + + - name: Run build script + run: docker build -t ${{ secrets.DOCKER_PUBLIC_USERNAME }}/${{ secrets.DOCKER_IMAGE_NAME }}:${{ steps.vars.outputs.current_branch }}-${{ steps.vars.outputs.sha_short }}-${{ github.run_id }} . + shell: bash + + - name: Run docker push script + run: | + sudo chmod a+x ./gitops_push + ./gitops_push + shell: bash + env: + IMAGE_TAG: ${{ secrets.DOCKER_PUBLIC_USERNAME }}/${{ secrets.DOCKER_IMAGE_NAME }}:${{ steps.vars.outputs.current_branch }}-${{ steps.vars.outputs.sha_short }}-${{ github.run_id }} diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml new file mode 100644 index 0000000..574680a --- /dev/null +++ b/.github/workflows/lint.yaml @@ -0,0 +1,11 @@ +name: CI +on: push +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install modules + run: npm i + - name: Run ESLint + run: npm run lint diff --git a/gitops_push b/gitops_push new file mode 100644 index 0000000..1d5d5e3 --- /dev/null +++ b/gitops_push @@ -0,0 +1,24 @@ +#!/bin/bash + +echo "DOCKER LOGIN" +echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin; +echo "DOCKER PUSH TAG" +echo ${IMAGE_TAG} +docker push ${IMAGE_TAG} + +git config --global user.email ${GIT_USER_EMAIL} +git config --global user.name ${GIT_USER_NAME} + +git clone ${HELM_REPO} && cd ${HELM_REPO_NAME} && \ + +git remote add origin-ci ${HELM_REPO_WITH_TOKEN} > /dev/null 2>&1 + +git checkout ${GITOPS_RELEASE_BRANCH} + +/snap/bin/yq write -i ${GITOPS_VALUES_FILE} api.deploymentContainer.image ${IMAGE_TAG} && \ + +git add ${GITOPS_VALUES_FILE} && \ + +git commit -am "Release ${IMAGE_TAG}" && \ + +git push --quiet --set-upstream origin-ci ${GITOPS_RELEASE_BRANCH}