From 0e5b432113a20b85e23f356b10faf84820f482fc Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Wed, 29 May 2019 02:50:08 +0530 Subject: [PATCH 01/78] feat: add initial api endpoint for work with test --- package.json | 1 + src/api/endpoints/work.js | 22 +++++++++++++++++++ src/common/queries/work.js | 19 +++++++++++++++++ src/server/routes.js | 8 ++++++- test/src/api/endpoints/test-work.js | 33 +++++++++++++++++++++++++++++ 5 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 src/api/endpoints/work.js create mode 100644 src/common/queries/work.js create mode 100644 test/src/api/endpoints/test-work.js diff --git a/package.json b/package.json index 1ed9842d0..78e32d227 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "body-parser": "^1.14.1", "bookbrainz-data": "^2.1.1", "browserify": "^14.5.0", + "chai-http": "^4.3.0", "classnames": "^2.2.5", "compression": "^1.7.1", "connect-redis": "^3.0.1", diff --git a/src/api/endpoints/work.js b/src/api/endpoints/work.js new file mode 100644 index 000000000..2aa925969 --- /dev/null +++ b/src/api/endpoints/work.js @@ -0,0 +1,22 @@ +/* eslint-disable */ + + +import express from 'express'; +import {getEntityBasicInfo} from '../../common/queries/work'; + + +const router = express.Router(); + + +function middleware(req, res, next) { + //console.log('middleware called'); + next(); +} + +router.get('/:bbid', middleware, async (req, res) => { + //console.log(req.params.bbid); + const work = await getEntityBasicInfo('entityTpye', 'bbid'); // example params + return res.send(work); +}); + +export default router; diff --git a/src/common/queries/work.js b/src/common/queries/work.js new file mode 100644 index 000000000..23ec337ba --- /dev/null +++ b/src/common/queries/work.js @@ -0,0 +1,19 @@ +/* eslint-disable */ + +// Stastic data is temporary +const work = { + "bbid": "ba446064-90a5-447b-abe5-139be547da2e", + "default-alias": { + "name": "Harry Potter", + "sort-name": "Harry Potter", + "alias-language": "English" + }, + "languages": ["English"], + "disambiguation": "Harry Potter", + "type": "Epic" +}; + +export function getEntityBasicInfo(entityTpye, bbid) { + // write query here to fetch entity detail + return work; +} diff --git a/src/server/routes.js b/src/server/routes.js index 021960aab..ccce628d0 100644 --- a/src/server/routes.js +++ b/src/server/routes.js @@ -28,8 +28,10 @@ import registerRouter from './routes/register'; import revisionRouter from './routes/revision'; import searchRouter from './routes/search'; import statisticsRouter from './routes/statistics'; +import workEndpoints from '../api/endpoints/work'; import workRouter from './routes/entity/work'; + function initRootRoutes(app) { app.use('/', indexRouter); app.use('/', authRouter); @@ -38,6 +40,10 @@ function initRootRoutes(app) { app.use('/statistics', statisticsRouter); } +function apiEndpoints(app) { + app.use('/v1/work', workEndpoints); +} + function initEditionGroupRoutes(app) { /* Retro-compatibility for /publication links */ app.use(['/edition-group', '/publication'], editionGroupRouter); @@ -70,7 +76,7 @@ function initEditorRoutes(app) { function initRoutes(app) { initRootRoutes(app); - + apiEndpoints(app); initEditionGroupRoutes(app); initAuthorRoutes(app); initEditionRoutes(app); diff --git a/test/src/api/endpoints/test-work.js b/test/src/api/endpoints/test-work.js new file mode 100644 index 000000000..d5ac1b9a8 --- /dev/null +++ b/test/src/api/endpoints/test-work.js @@ -0,0 +1,33 @@ +/* eslint-disable */ + +process.env.NODE_ENV = 'test'; + + +/// Import the dependencies for testing +import chai from 'chai'; +import chaiHttp from 'chai-http'; +import app from '../../../../src/server/app'; +// Configure chai +chai.use(chaiHttp); +chai.should(); + +describe("Work", () => { + describe("GET /work", () => { + // Test to get basic information of a work + it("should get basic information of work", (done) => { + chai.request(app) + .get('/v1/work/bbid') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('bbid'); + res.body.should.have.property('default-alias'); + res.body.should.have.property('languages'); + res.body.should.have.property('disambiguation'); + res.body.should.have.property('type'); + done(); + }); + }); + + }); +}); From 45a2532dfa19cf0af246c51edf5a3ebfa05ebede Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Wed, 29 May 2019 14:45:51 +0530 Subject: [PATCH 02/78] fix: push lock file to update dependencies in CI. --- package-lock.json | 51 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/package-lock.json b/package-lock.json index 0352af1a9..4c03b5713 100644 --- a/package-lock.json +++ b/package-lock.json @@ -188,6 +188,30 @@ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.4.0.tgz", "integrity": "sha512-yOvY4vhouiTXMNHMlxdgjjC6rdmspQTFCMaRDcxzOK+LP9YfoIccXpOK9boyUgvA1U/pgzHlVZDHrWs6r3sRcA==" }, + "@types/chai": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz", + "integrity": "sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==" + }, + "@types/cookiejar": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.1.tgz", + "integrity": "sha512-aRnpPa7ysx3aNW60hTiCtLHlQaIFsXFCgQlpakNgDNVFzbtusSY8PwjAQgRWfSk0ekNoBjO51eQRB6upA9uuyw==" + }, + "@types/node": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.3.tgz", + "integrity": "sha512-zkOxCS/fA+3SsdA+9Yun0iANxzhQRiNwTvJSr6N95JhuJ/x27z9G2URx1Jpt3zYFfCGUXZGL5UDxt5eyLE7wgw==" + }, + "@types/superagent": { + "version": "3.8.7", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.7.tgz", + "integrity": "sha512-9KhCkyXv268A2nZ1Wvu7rQWM+BmdYUVkycFeNnYrUL5Zwu7o8wPQ3wBfW59dDP+wuoxw0ww8YKgTNv8j/cgscA==", + "requires": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, "@webassemblyjs/ast": { "version": "1.5.13", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.13.tgz", @@ -2465,6 +2489,20 @@ "check-error": "^1.0.2" } }, + "chai-http": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.3.0.tgz", + "integrity": "sha512-zFTxlN7HLMv+7+SPXZdkd5wUlK+KxH6Q7bIEMiEx0FK3zuuMqL7cwICAQ0V1+yYRozBburYuxN1qZstgHpFZQg==", + "requires": { + "@types/chai": "4", + "@types/superagent": "^3.8.3", + "cookiejar": "^2.1.1", + "is-ip": "^2.0.0", + "methods": "^1.1.2", + "qs": "^6.5.1", + "superagent": "^3.7.0" + } + }, "chalk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", @@ -6089,6 +6127,11 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, "ipaddr.js": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", @@ -6268,6 +6311,14 @@ "is-path-inside": "^1.0.0" } }, + "is-ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz", + "integrity": "sha1-aO6gfooKCpTC0IDdZ0xzGrKkYas=", + "requires": { + "ip-regex": "^2.0.0" + } + }, "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", From d1b5a4c25534d9eb0b4c145566ad05289088e0a1 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Wed, 29 May 2019 21:20:21 +0530 Subject: [PATCH 03/78] refactor: fetch work data from database --- src/api/endpoints/work.js | 2 +- src/common/queries/work.js | 39 ++++++++++++++++++----------- test/src/api/endpoints/test-work.js | 6 ++--- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/api/endpoints/work.js b/src/api/endpoints/work.js index 2aa925969..9178ea152 100644 --- a/src/api/endpoints/work.js +++ b/src/api/endpoints/work.js @@ -15,7 +15,7 @@ function middleware(req, res, next) { router.get('/:bbid', middleware, async (req, res) => { //console.log(req.params.bbid); - const work = await getEntityBasicInfo('entityTpye', 'bbid'); // example params + const work = await getEntityBasicInfo(req); // example params return res.send(work); }); diff --git a/src/common/queries/work.js b/src/common/queries/work.js index 23ec337ba..2916f148b 100644 --- a/src/common/queries/work.js +++ b/src/common/queries/work.js @@ -1,19 +1,28 @@ /* eslint-disable */ -// Stastic data is temporary -const work = { - "bbid": "ba446064-90a5-447b-abe5-139be547da2e", - "default-alias": { - "name": "Harry Potter", - "sort-name": "Harry Potter", - "alias-language": "English" - }, - "languages": ["English"], - "disambiguation": "Harry Potter", - "type": "Epic" -}; +import _ from 'lodash'; -export function getEntityBasicInfo(entityTpye, bbid) { - // write query here to fetch entity detail - return work; + +function filterData(entity) { + + return _.isNil(entity) ? null : + { + bbid: entity.bbid, + defaultAlias: entity.defaultAlias, + disambiguation: entity.disambiguation ? + entity.disambiguation.comment : null, + languages: entity.languageSet ? entity.languageSet : null, + entityType: entity.type ? entity.type : null + }; +} + +export async function getEntityBasicInfo(req) { + const {orm} = req.app.locals; + const {Work} = orm; + const workPromise = Work.forge({bbid: req.params.bbid}) + .fetch({withRelated: ['defaultAlias', 'languageSet']}) + .then((data) => filterData(data.toJSON())); + + const workData = await Promise.resolve(workPromise) + return workData; } diff --git a/test/src/api/endpoints/test-work.js b/test/src/api/endpoints/test-work.js index d5ac1b9a8..10e5ba432 100644 --- a/test/src/api/endpoints/test-work.js +++ b/test/src/api/endpoints/test-work.js @@ -16,15 +16,15 @@ describe("Work", () => { // Test to get basic information of a work it("should get basic information of work", (done) => { chai.request(app) - .get('/v1/work/bbid') + .get('/v1/work/13ab71b4-908f-4c72-88a9-4b94a56c7d3e') .end((err, res) => { res.should.have.status(200); res.body.should.be.a('object'); res.body.should.have.property('bbid'); - res.body.should.have.property('default-alias'); + res.body.should.have.property('defaultAlias'); res.body.should.have.property('languages'); res.body.should.have.property('disambiguation'); - res.body.should.have.property('type'); + res.body.should.have.property('entityType'); done(); }); }); From f8d44410d13ee2312c2b2335d65ba0a50c631318 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Wed, 29 May 2019 23:13:28 +0530 Subject: [PATCH 04/78] fix: test passed for work endpoint --- src/common/queries/work.js | 1 - test/src/api/endpoints/test-work.js | 134 ++++++++++++++++++++++++---- 2 files changed, 115 insertions(+), 20 deletions(-) diff --git a/src/common/queries/work.js b/src/common/queries/work.js index 2916f148b..330ba243e 100644 --- a/src/common/queries/work.js +++ b/src/common/queries/work.js @@ -4,7 +4,6 @@ import _ from 'lodash'; function filterData(entity) { - return _.isNil(entity) ? null : { bbid: entity.bbid, diff --git a/test/src/api/endpoints/test-work.js b/test/src/api/endpoints/test-work.js index 10e5ba432..282a5d87a 100644 --- a/test/src/api/endpoints/test-work.js +++ b/test/src/api/endpoints/test-work.js @@ -2,32 +2,128 @@ process.env.NODE_ENV = 'test'; - +import app from '../../../../src/server/app'; /// Import the dependencies for testing import chai from 'chai'; import chaiHttp from 'chai-http'; -import app from '../../../../src/server/app'; +import orm from '../../../bookbrainz-data'; // Configure chai chai.use(chaiHttp); chai.should(); -describe("Work", () => { - describe("GET /work", () => { - // Test to get basic information of a work - it("should get basic information of work", (done) => { - chai.request(app) - .get('/v1/work/13ab71b4-908f-4c72-88a9-4b94a56c7d3e') - .end((err, res) => { - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.should.have.property('bbid'); - res.body.should.have.property('defaultAlias'); - res.body.should.have.property('languages'); - res.body.should.have.property('disambiguation'); - res.body.should.have.property('entityType'); - done(); - }); - }); +const { + Alias, AliasSet, Annotation, Disambiguation, Editor, EditorType, Entity, Gender, + IdentifierSet, RelationshipSet, Revision, Work, bookshelf, util +} = orm; + +const genderData = { + id: 1, + name: 'test' +}; +const editorTypeData = { + id: 1, + label: 'test_type' +}; +const editorData = { + genderId: 1, + id: 1, + name: 'bob', + typeId: 1 +}; +const setData = {id: 1}; + +const aliasData = { + id: 1, + name: 'work name', + sortName: 'Work sort name' +}; + +const revisionAttribs = { + authorId: 1, + id: 1 +}; +const aBBID = '13ab71b4-908f-4c72-88a9-4b94a56c7d3e'; +const workAttribs = { + aliasSetId: 1, + annotationId: 1, + bbid: aBBID, + disambiguationId: 1, + identifierSetId: 1, + relationshipSetId: 1, + revisionId: 1 +}; + + +describe("GET /work", () => { + before( + async () =>{ + await new Gender(genderData) + .save(null, {method: 'insert'}); + await new EditorType(editorTypeData) + .save(null, {method: 'insert'}) + await new Editor(editorData) + .save(null, {method: 'insert'}) + await new Alias(aliasData) + .save(null, {method: 'insert'}) + await new AliasSet({...setData, default_alias_id: 1}) + .save(null, {method: 'insert'}); + await new IdentifierSet(setData) + .save(null, {method: 'insert'}); + await new RelationshipSet(setData) + .save(null, {method: 'insert'}); + await new Disambiguation({ + comment: 'Test Disambiguation', + id: 1 + }) + .save(null, {method: 'insert'}); + await new Entity({bbid: aBBID, type: 'Work'}) + .save(null, {method: 'insert'}); + await new Revision(revisionAttribs) + .save(null, {method: 'insert'}); + new Annotation({ + content: 'Test Annotation', + id: 1, + lastRevisionId: 1 + }) + .save(null, {method: 'insert'}); + await new Work(workAttribs) + .save(null, {method: 'insert'}); + }); + + after(function truncate() { + this.timeout(0); // eslint-disable-line babel/no-invalid-this + + return util.truncateTables(bookshelf, [ + 'bookbrainz.entity', + 'bookbrainz.revision', + 'bookbrainz.relationship_set', + 'bookbrainz.identifier_set', + 'bookbrainz.alias', + 'bookbrainz.alias_set', + 'bookbrainz.annotation', + 'bookbrainz.disambiguation', + 'bookbrainz.editor', + 'bookbrainz.editor_type', + 'bookbrainz.work_header', + 'musicbrainz.gender' + ]); }); + + // Test to get basic information of a work + it("should get basic information of work", (done) => { + chai.request(app) + .get('/v1/work/13ab71b4-908f-4c72-88a9-4b94a56c7d3e') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('bbid'); + res.body.should.have.property('defaultAlias'); + res.body.should.have.property('languages'); + res.body.should.have.property('disambiguation'); + res.body.should.have.property('entityType'); + done(); + }); + }); + }); From 6a5f38b1cc7e23558ddbd92bf4f3f32a9c6f8291 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Sat, 1 Jun 2019 00:12:10 +0530 Subject: [PATCH 05/78] refactor: restrucure api section --- package.json | 2 + src/api/app.js | 186 ++++++++++++++++++++++++++ src/api/routes.js | 32 +++++ src/api/{endpoints => routes}/work.js | 2 - 4 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 src/api/app.js create mode 100644 src/api/routes.js rename src/api/{endpoints => routes}/work.js (84%) diff --git a/package.json b/package.json index 78e32d227..ee4afab7d 100644 --- a/package.json +++ b/package.json @@ -9,12 +9,14 @@ "prepublishOnly": "npm run clean && npm run mkdirs && npm run copy-client-scripts", "postinstall": "npm run prepublishOnly", "build-server-js": "babel src --out-dir lib", + "build-api-js": "babel src/api --out-dir lib", "build-client-js": "./scripts/build-client-js.sh", "build-less": "./scripts/build-less.sh", "build": "npm run build-less && npm run build-client-js && npm run build-server-js", "WIP-build-client-webpack": "cross-env NODE_ENV=production SSR=true webpack --progress --config webpack.client.js", "prestart": "npm run build-less & npm run build-client-js & npm run build-server-js", "start": "cross-env SSR=true node ./lib/server/app.js", + "start-api": "npm run build-api-js && cross-env SSR=true node ./lib/api/app.js", "debug": "cross-env DEBUG=bbsite NODE_ENV=development SSR=true babel-node src/server/app.js", "debug-watch-server": "cross-env DEBUG=bbsite NODE_ENV=development SSR=true nodemon src/server/app.js --watch src/server --exec babel-node", "lint": "eslint .", diff --git a/src/api/app.js b/src/api/app.js new file mode 100644 index 000000000..992ef45c7 --- /dev/null +++ b/src/api/app.js @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2014-2015 Ben Ockmore + * 2015-2017 Sean Burke + * 2015 Leo Verto + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* eslint global-require: 'warn' */ + + +import * as error from '../server/helpers/error'; + +import BookBrainzData from 'bookbrainz-data'; +import Debug from 'debug'; +import Promise from 'bluebird'; +import {get as _get} from 'lodash'; +import appCleanup from '../server/helpers/appCleanup'; +import bodyParser from 'body-parser'; +import compression from 'compression'; +import config from '../server/helpers/config'; +import express from 'express'; +import favicon from 'serve-favicon'; +import git from 'git-rev'; +import logger from 'morgan'; +import path from 'path'; +import redis from 'connect-redis'; +import routes from './routes'; +import serveStatic from 'serve-static'; +import session from 'express-session'; + + +Promise.config({ + longStackTraces: true, + warnings: true +}); + +// Initialize application +const app = express(); +app.locals.orm = BookBrainzData(config.database); + +const rootDir = path.join(__dirname, '../../'); + +app.set('trust proxy', config.site.proxyTrust); + +app.use(favicon(path.join(rootDir, 'static/images/icons/favicon.ico'))); + +if (app.get('env') !== 'testing') { + app.use(logger('dev')); +} + +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ + extended: false +})); +app.use(compression()); + +// Set up serving of static assets +if (process.env.NODE_ENV === 'development') { + const webpack = require('webpack'); + const webpackDevMiddleware = require('webpack-dev-middleware'); + const webpackHotMiddleware = require('webpack-hot-middleware'); + + const webpackConfig = require(path.resolve(rootDir, './webpack.client')); + const compiler = webpack(webpackConfig); + + app.use(webpackDevMiddleware(compiler, { + // lazy: false, + logTime: true, + noInfo: false, + publicPath: webpackConfig.output.publicPath + // serverSideRender: false + })); + + app.use(webpackHotMiddleware(compiler)); +} +else { + app.use(serveStatic(path.join(rootDir, 'static/js'))); +} +app.use(express.static(path.join(rootDir, 'static'))); + +const RedisStore = redis(session); +app.use(session({ + cookie: { + maxAge: _get(config, 'session.maxAge', 2592000000), + secure: _get(config, 'session.secure', false) + }, + resave: false, + saveUninitialized: false, + secret: config.session.secret, + store: new RedisStore({ + host: _get(config, 'session.redis.host', 'localhost'), + port: _get(config, 'session.redis.port', 6379) + }) +})); + + +// Set up constants that will remain valid for the life of the app +let siteRevision = 'unknown'; +git.short((revision) => { + siteRevision = revision; +}); + +const repositoryUrl = 'https://github.com/bookbrainz/bookbrainz-site/'; + +app.use((req, res, next) => { + // Set up globally-used properties + res.locals.siteRevision = siteRevision; + res.locals.repositoryUrl = repositoryUrl; + res.locals.alerts = []; + + if (!req.session) { + res.locals.alerts.push({ + level: 'danger', + message: 'We are currently experiencing technical difficulties; ' + + 'signing in will not work until this is resolved.' + }); + } + + // Add user data to every rendered route + res.locals.user = req.user; + + next(); +}); + +// Set up routes +routes(app); + +// Catch 404 and forward to error handler +app.use((req, res, next) => { + next(new error.NotFoundError(null, req)); +}); + +// Error handler; arity MUST be 4 or express doesn't treat it as such +app.use((err, req, res, next) => { // eslint-disable-line no-unused-vars + error.renderError(req, res, err); +}); + +const debug = Debug('bbsite'); + +const DEFAULT_PORT = 9099; +app.set('port', process.env.PORT || DEFAULT_PORT); // eslint-disable-line no-process-env,max-len + +const server = app.listen(app.get('port'), () => { + debug(`Express server listening on port ${server.address().port}`); +}); + +/* eslint-disable no-console */ +function cleanupFunction() { + return new Promise((resolve, reject) => { + console.log('Cleaning up before closing'); + server.close((err) => { + if (err) { + console.log('Error while closing server connections'); + reject(err); + } + else { + console.log('Closed all server connections. Bye bye!'); + resolve(); + } + }); + // force-kill after X milliseconds. + if (config.site.forceExitAfterMs) { + setTimeout(() => { + reject(new Error(`Cleanup function timed out after ${config.site.forceExitAfterMs} ms`)); + }, config.site.forceExitAfterMs); + } + }); +} +/* eslint-enable no-console */ + +// Run cleanup function +appCleanup(cleanupFunction); + +export default server; diff --git a/src/api/routes.js b/src/api/routes.js new file mode 100644 index 000000000..cd87c9fe2 --- /dev/null +++ b/src/api/routes.js @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + + +import workRouter from './routes/work'; + + +function initWorkRoute(app) { + app.use('/work', workRouter); +} + + +function initRoutes(app) { + initWorkRoute(app); +} + +export default initRoutes; diff --git a/src/api/endpoints/work.js b/src/api/routes/work.js similarity index 84% rename from src/api/endpoints/work.js rename to src/api/routes/work.js index 9178ea152..a0a93e7b8 100644 --- a/src/api/endpoints/work.js +++ b/src/api/routes/work.js @@ -9,12 +9,10 @@ const router = express.Router(); function middleware(req, res, next) { - //console.log('middleware called'); next(); } router.get('/:bbid', middleware, async (req, res) => { - //console.log(req.params.bbid); const work = await getEntityBasicInfo(req); // example params return res.send(work); }); From 5e374b59d633a15fe774bc9203e0ac2141d155f0 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Sat, 1 Jun 2019 00:21:49 +0530 Subject: [PATCH 06/78] fix: separate build for api and website and remove api routes from website app.js --- package.json | 2 +- src/server/routes.js | 6 ------ test/src/api/{endpoints => routes}/test-work.js | 2 +- 3 files changed, 2 insertions(+), 8 deletions(-) rename test/src/api/{endpoints => routes}/test-work.js (98%) diff --git a/package.json b/package.json index ee4afab7d..b0d8fdeaa 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "clean": "./scripts/clean.sh", "prepublishOnly": "npm run clean && npm run mkdirs && npm run copy-client-scripts", "postinstall": "npm run prepublishOnly", - "build-server-js": "babel src --out-dir lib", + "build-server-js": "babel src --ignore src/api --out-dir lib", "build-api-js": "babel src/api --out-dir lib", "build-client-js": "./scripts/build-client-js.sh", "build-less": "./scripts/build-less.sh", diff --git a/src/server/routes.js b/src/server/routes.js index ccce628d0..25d0a456a 100644 --- a/src/server/routes.js +++ b/src/server/routes.js @@ -28,7 +28,6 @@ import registerRouter from './routes/register'; import revisionRouter from './routes/revision'; import searchRouter from './routes/search'; import statisticsRouter from './routes/statistics'; -import workEndpoints from '../api/endpoints/work'; import workRouter from './routes/entity/work'; @@ -40,10 +39,6 @@ function initRootRoutes(app) { app.use('/statistics', statisticsRouter); } -function apiEndpoints(app) { - app.use('/v1/work', workEndpoints); -} - function initEditionGroupRoutes(app) { /* Retro-compatibility for /publication links */ app.use(['/edition-group', '/publication'], editionGroupRouter); @@ -76,7 +71,6 @@ function initEditorRoutes(app) { function initRoutes(app) { initRootRoutes(app); - apiEndpoints(app); initEditionGroupRoutes(app); initAuthorRoutes(app); initEditionRoutes(app); diff --git a/test/src/api/endpoints/test-work.js b/test/src/api/routes/test-work.js similarity index 98% rename from test/src/api/endpoints/test-work.js rename to test/src/api/routes/test-work.js index 282a5d87a..6f36c757f 100644 --- a/test/src/api/endpoints/test-work.js +++ b/test/src/api/routes/test-work.js @@ -113,7 +113,7 @@ describe("GET /work", () => { // Test to get basic information of a work it("should get basic information of work", (done) => { chai.request(app) - .get('/v1/work/13ab71b4-908f-4c72-88a9-4b94a56c7d3e') + .get('/work/13ab71b4-908f-4c72-88a9-4b94a56c7d3e') .end((err, res) => { res.should.have.status(200); res.body.should.be.a('object'); From ad91e9f38d51c3effbc42f721355048d8ee103d6 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Sat, 1 Jun 2019 01:08:50 +0530 Subject: [PATCH 07/78] fix: update app for api in test file --- test/src/api/routes/test-work.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index 6f36c757f..7cbb117d6 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -1,8 +1,8 @@ /* eslint-disable */ -process.env.NODE_ENV = 'test'; +process.env.NODE_ENV = 'testing'; -import app from '../../../../src/server/app'; +import app from '../../../../src/api/app'; /// Import the dependencies for testing import chai from 'chai'; import chaiHttp from 'chai-http'; From 3f9f83dc5bf8d9f14d8fe3e1a186cb11ab3c88d2 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Sat, 1 Jun 2019 01:56:07 +0530 Subject: [PATCH 08/78] fix: work test --- package-lock.json | 5 +++++ package.json | 1 + src/api/app.js | 4 ++-- test/src/api/routes/test-work.js | 9 ++++----- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4c03b5713..5d1059d5e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4646,6 +4646,11 @@ } } }, + "faker": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/faker/-/faker-4.1.0.tgz", + "integrity": "sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8=" + }, "fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", diff --git a/package.json b/package.json index b0d8fdeaa..1bc6b108f 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "elasticsearch": "^15.2.0", "express": "^4.16.2", "express-session": "^1.10.1", + "faker": "^4.1.0", "git-rev": "^0.2.1", "http-status": "^1.0.0", "immutable": "^3.8.2", diff --git a/src/api/app.js b/src/api/app.js index 992ef45c7..31db94c92 100644 --- a/src/api/app.js +++ b/src/api/app.js @@ -149,8 +149,8 @@ app.use((err, req, res, next) => { // eslint-disable-line no-unused-vars const debug = Debug('bbsite'); -const DEFAULT_PORT = 9099; -app.set('port', process.env.PORT || DEFAULT_PORT); // eslint-disable-line no-process-env,max-len +const DEFAULT_API_PORT = 9098; +app.set('port', process.env.PORT || DEFAULT_API_PORT); // eslint-disable-line no-process-env,max-len const server = app.listen(app.get('port'), () => { debug(`Express server listening on port ${server.address().port}`); diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index 7cbb117d6..e66a92d33 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -1,12 +1,11 @@ /* eslint-disable */ -process.env.NODE_ENV = 'testing'; - import app from '../../../../src/api/app'; +import orm from '../../../bookbrainz-data'; /// Import the dependencies for testing import chai from 'chai'; import chaiHttp from 'chai-http'; -import orm from '../../../bookbrainz-data'; +import faker from 'faker'; // Configure chai chai.use(chaiHttp); chai.should(); @@ -42,7 +41,7 @@ const revisionAttribs = { authorId: 1, id: 1 }; -const aBBID = '13ab71b4-908f-4c72-88a9-4b94a56c7d3e'; +const aBBID = faker.random.uuid(); const workAttribs = { aliasSetId: 1, annotationId: 1, @@ -113,7 +112,7 @@ describe("GET /work", () => { // Test to get basic information of a work it("should get basic information of work", (done) => { chai.request(app) - .get('/work/13ab71b4-908f-4c72-88a9-4b94a56c7d3e') + .get(`/work/${aBBID}`) .end((err, res) => { res.should.have.status(200); res.body.should.be.a('object'); From 1e1225bb8201569e5499399e53469f61cd108601 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Sat, 1 Jun 2019 02:36:17 +0530 Subject: [PATCH 09/78] refactor: check keys on object via .all in work test --- test/src/api/routes/test-work.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index e66a92d33..1b61640d3 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -65,7 +65,7 @@ describe("GET /work", () => { .save(null, {method: 'insert'}) await new Alias(aliasData) .save(null, {method: 'insert'}) - await new AliasSet({...setData, default_alias_id: 1}) + await new AliasSet({...setData, defaultAliasId: 1}) .save(null, {method: 'insert'}); await new IdentifierSet(setData) .save(null, {method: 'insert'}); @@ -80,11 +80,10 @@ describe("GET /work", () => { .save(null, {method: 'insert'}); await new Revision(revisionAttribs) .save(null, {method: 'insert'}); - new Annotation({ + await new Annotation({ content: 'Test Annotation', id: 1, - lastRevisionId: 1 - }) + lastRevisionId: 1}) .save(null, {method: 'insert'}); await new Work(workAttribs) .save(null, {method: 'insert'}); @@ -116,11 +115,13 @@ describe("GET /work", () => { .end((err, res) => { res.should.have.status(200); res.body.should.be.a('object'); - res.body.should.have.property('bbid'); - res.body.should.have.property('defaultAlias'); - res.body.should.have.property('languages'); - res.body.should.have.property('disambiguation'); - res.body.should.have.property('entityType'); + res.body.should.all.keys( + 'bbid', + 'defaultAlias', + 'languages', + 'disambiguation', + 'entityType' + ); done(); }); }); From ee970c66af5e8e073690980e76c852aebb6b6b68 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Sun, 2 Jun 2019 02:43:18 +0530 Subject: [PATCH 10/78] fix: handle request if work is not founded and add test for same --- package.json | 4 ++-- src/api/helpers/formatWorkData.js | 15 +++++++++++++++ src/api/routes/work.js | 20 +++++++++++--------- src/common/queries/work.js | 17 ++++------------- test/src/api/routes/test-work.js | 14 ++++++++++++++ 5 files changed, 46 insertions(+), 24 deletions(-) create mode 100644 src/api/helpers/formatWorkData.js diff --git a/package.json b/package.json index 1bc6b108f..19f246b9b 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ "clean": "./scripts/clean.sh", "prepublishOnly": "npm run clean && npm run mkdirs && npm run copy-client-scripts", "postinstall": "npm run prepublishOnly", - "build-server-js": "babel src --ignore src/api --out-dir lib", - "build-api-js": "babel src/api --out-dir lib", + "build-server-js": "babel src --out-dir lib --ignore src/api", + "build-api-js": "babel src --out-dir lib --ignore src/client", "build-client-js": "./scripts/build-client-js.sh", "build-less": "./scripts/build-less.sh", "build": "npm run build-less && npm run build-client-js && npm run build-server-js", diff --git a/src/api/helpers/formatWorkData.js b/src/api/helpers/formatWorkData.js new file mode 100644 index 000000000..4baab80ef --- /dev/null +++ b/src/api/helpers/formatWorkData.js @@ -0,0 +1,15 @@ +/* eslint-disable */ + +import _ from 'lodash'; + +export function getWorkBasicInfo(entity) { + return _.isNil(entity) ? null : + { + bbid: entity.bbid, + defaultAlias: entity.defaultAlias, + disambiguation: entity.disambiguation ? + entity.disambiguation.comment : null, + languages: entity.languageSet ? entity.languageSet : null, + entityType: entity.type ? entity.type : null + }; +} \ No newline at end of file diff --git a/src/api/routes/work.js b/src/api/routes/work.js index a0a93e7b8..f4453dba6 100644 --- a/src/api/routes/work.js +++ b/src/api/routes/work.js @@ -2,19 +2,21 @@ import express from 'express'; -import {getEntityBasicInfo} from '../../common/queries/work'; - +import {getWorkFromDB} from '../../common/queries/work'; +import {getWorkBasicInfo} from '../helpers/formatWorkData'; +import _ from 'lodash'; const router = express.Router(); -function middleware(req, res, next) { - next(); -} - -router.get('/:bbid', middleware, async (req, res) => { - const work = await getEntityBasicInfo(req); // example params - return res.send(work); +router.get('/:bbid', async (req, res, next) => { + const work = await getWorkFromDB(req); // example params + if(_.isNil(work)) { + return res.status(404).send({message: 'This Work is not founded'}); + } else { + const workBasicInfo = getWorkBasicInfo(work.toJSON()); + return res.status(200).send(workBasicInfo); + } }); export default router; diff --git a/src/common/queries/work.js b/src/common/queries/work.js index 330ba243e..97ccbcf59 100644 --- a/src/common/queries/work.js +++ b/src/common/queries/work.js @@ -3,25 +3,16 @@ import _ from 'lodash'; -function filterData(entity) { - return _.isNil(entity) ? null : - { - bbid: entity.bbid, - defaultAlias: entity.defaultAlias, - disambiguation: entity.disambiguation ? - entity.disambiguation.comment : null, - languages: entity.languageSet ? entity.languageSet : null, - entityType: entity.type ? entity.type : null - }; -} -export async function getEntityBasicInfo(req) { + +export async function getWorkFromDB(req) { const {orm} = req.app.locals; const {Work} = orm; + const workPromise = Work.forge({bbid: req.params.bbid}) .fetch({withRelated: ['defaultAlias', 'languageSet']}) - .then((data) => filterData(data.toJSON())); const workData = await Promise.resolve(workPromise) + return workData; } diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index 1b61640d3..a667ef817 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -42,6 +42,7 @@ const revisionAttribs = { id: 1 }; const aBBID = faker.random.uuid(); +const bBBID = faker.random.uuid(); const workAttribs = { aliasSetId: 1, annotationId: 1, @@ -126,4 +127,17 @@ describe("GET /work", () => { }); }); + it("should return status 404, if work is not founded", (done) => { + chai.request(app) + .get(`/work/${bBBID}`) + .end((err, res) => { + res.should.have.status(404); + res.body.should.be.a('object'); + res.body.message.should.equal( + 'This Work is not founded' + ); + done(); + }); + }); + }); From 80e4bb2c15ced0716fb4d9e50bc624ccd0f24b53 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Mon, 3 Jun 2019 02:21:27 +0530 Subject: [PATCH 11/78] feat: add more lookup endpoint for work like aliases and identifiers with tests --- src/api/helpers/formatWorkData.js | 48 +++++++++++++++++++++++++------ src/api/routes/work.js | 27 +++++++++++++++-- src/common/queries/work.js | 6 ++-- test/src/api/routes/test-work.js | 40 +++++++++++++++++++++++++- 4 files changed, 107 insertions(+), 14 deletions(-) diff --git a/src/api/helpers/formatWorkData.js b/src/api/helpers/formatWorkData.js index 4baab80ef..1c6bf20b0 100644 --- a/src/api/helpers/formatWorkData.js +++ b/src/api/helpers/formatWorkData.js @@ -2,14 +2,46 @@ import _ from 'lodash'; -export function getWorkBasicInfo(entity) { - return _.isNil(entity) ? null : +export function getWorkBasicInfo(work: object) { + return _.isNil(work) ? null : { - bbid: entity.bbid, - defaultAlias: entity.defaultAlias, - disambiguation: entity.disambiguation ? - entity.disambiguation.comment : null, - languages: entity.languageSet ? entity.languageSet : null, - entityType: entity.type ? entity.type : null + bbid: work.bbid, + defaultAlias: work.defaultAlias, + disambiguation: work.disambiguation ? + work.disambiguation.comment : null, + languages: work.languageSet ? + work.languageSet.languages.map((language) => language.name) : null, + workType: work.typeId, + entityType: work.type ? work.type : null }; +} + +export function getWorkAliases(work: object) { + + return _.isNil(work) ? null : + { + bbid: work.bbid, + aliases: work.aliasSet.aliases.map( (alias) => { + return { + name: alias.name, + sortName: alias.sortName, + aliasLanguage: alias.languageId, + primary: alias.primary + } + }) + } +} + +export function getWorkIdentifiers(work: object) { + return _.isNil(work) ? null : + { + bbid: work.bbid, + identifires: work.identifierSet.identifiers.map( (identifier) => { + return { + type: identifier.typeId, + value: identifier.value + } + }) + } + } \ No newline at end of file diff --git a/src/api/routes/work.js b/src/api/routes/work.js index f4453dba6..3e51621fe 100644 --- a/src/api/routes/work.js +++ b/src/api/routes/work.js @@ -3,14 +3,15 @@ import express from 'express'; import {getWorkFromDB} from '../../common/queries/work'; -import {getWorkBasicInfo} from '../helpers/formatWorkData'; +import {getWorkBasicInfo, getWorkAliases, getWorkIdentifiers} from '../helpers/formatWorkData'; import _ from 'lodash'; const router = express.Router(); router.get('/:bbid', async (req, res, next) => { - const work = await getWorkFromDB(req); // example params + const params = ['defaultAlias', 'languageSet.languages', 'disambiguation']; + const work = await getWorkFromDB(req, params); // example params if(_.isNil(work)) { return res.status(404).send({message: 'This Work is not founded'}); } else { @@ -19,4 +20,26 @@ router.get('/:bbid', async (req, res, next) => { } }); +router.get('/:bbid/aliases', async (req, res, next) => { + const params = ['aliasSet.aliases']; + const workWithAliases = await getWorkFromDB(req, params) + if(_.isNil(workWithAliases.aliasSet)) { + return res.status(404).send({message: 'This Work is not founded'}); + } else { + const workAliasesList = getWorkAliases(workWithAliases.toJSON()); + return res.status(200).send(workAliasesList); + } +}) + +router.get('/:bbid/identifiers', async (req, res, next) => { + const params = ['identifierSet.identifiers']; + const workWithIdentifiers = await getWorkFromDB(req, params) + if(_.isNil(workWithIdentifiers.identifierSet)) { + return res.status(404).send({message: 'No identifiers are founded for this work'}); + } else { + const workIdentifiersList = getWorkIdentifiers(workWithIdentifiers.toJSON()); + return res.status(200).send(workIdentifiersList); + } +}) + export default router; diff --git a/src/common/queries/work.js b/src/common/queries/work.js index 97ccbcf59..c6f85f6a1 100644 --- a/src/common/queries/work.js +++ b/src/common/queries/work.js @@ -5,14 +5,14 @@ import _ from 'lodash'; -export async function getWorkFromDB(req) { +export async function getWorkFromDB(req, params) { const {orm} = req.app.locals; const {Work} = orm; const workPromise = Work.forge({bbid: req.params.bbid}) - .fetch({withRelated: ['defaultAlias', 'languageSet']}) + .fetch({withRelated: params}) const workData = await Promise.resolve(workPromise) - + return workData; } diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index a667ef817..112edc7ac 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -12,7 +12,7 @@ chai.should(); const { Alias, AliasSet, Annotation, Disambiguation, Editor, EditorType, Entity, Gender, - IdentifierSet, RelationshipSet, Revision, Work, bookshelf, util + IdentifierSet, Identifier, RelationshipSet, Revision, Work, bookshelf, util } = orm; const genderData = { @@ -37,6 +37,12 @@ const aliasData = { sortName: 'Work sort name' }; +const identifierData = { + id: 1, + typeId: 1, + value: 'Q123456' +} + const revisionAttribs = { authorId: 1, id: 1 @@ -70,6 +76,8 @@ describe("GET /work", () => { .save(null, {method: 'insert'}); await new IdentifierSet(setData) .save(null, {method: 'insert'}); + await new Identifier(identifierData) + .save(null, {method: 'insert'}); await new RelationshipSet(setData) .save(null, {method: 'insert'}); await new Disambiguation({ @@ -97,6 +105,7 @@ describe("GET /work", () => { 'bookbrainz.entity', 'bookbrainz.revision', 'bookbrainz.relationship_set', + 'bookbrainz.identifier', 'bookbrainz.identifier_set', 'bookbrainz.alias', 'bookbrainz.alias_set', @@ -121,6 +130,7 @@ describe("GET /work", () => { 'defaultAlias', 'languages', 'disambiguation', + 'workType', 'entityType' ); done(); @@ -140,4 +150,32 @@ describe("GET /work", () => { }); }); + it("should return list of aliases of work", (done) => { + chai.request(app) + .get(`/work/${aBBID}/aliases`) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.all.keys( + 'bbid', + 'aliases' + ); + done(); + }); + }); + + it("should return list of identifiers of work", (done) => { + chai.request(app) + .get(`/work/${aBBID}/identifiers`) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.all.keys( + 'bbid', + 'identifiers' + ); + done(); + }); + }); + }); From eb666e7b442dd5fdf20438ebb4e24df0b0a651b5 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Mon, 3 Jun 2019 16:37:25 +0530 Subject: [PATCH 12/78] fix: insert identifier in testing --- src/api/helpers/formatWorkData.js | 2 +- test/src/api/routes/test-work.js | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/api/helpers/formatWorkData.js b/src/api/helpers/formatWorkData.js index 1c6bf20b0..935c0379c 100644 --- a/src/api/helpers/formatWorkData.js +++ b/src/api/helpers/formatWorkData.js @@ -36,7 +36,7 @@ export function getWorkIdentifiers(work: object) { return _.isNil(work) ? null : { bbid: work.bbid, - identifires: work.identifierSet.identifiers.map( (identifier) => { + identifiers: work.identifierSet.identifiers.map( (identifier) => { return { type: identifier.typeId, value: identifier.value diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index 112edc7ac..a8a910ba3 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -12,7 +12,7 @@ chai.should(); const { Alias, AliasSet, Annotation, Disambiguation, Editor, EditorType, Entity, Gender, - IdentifierSet, Identifier, RelationshipSet, Revision, Work, bookshelf, util + IdentifierSet, Identifier, IdentifierType, RelationshipSet, Revision, Work, bookshelf, util } = orm; const genderData = { @@ -37,6 +37,15 @@ const aliasData = { sortName: 'Work sort name' }; +const identifierTypeData = { + id: 1, + label: 'test label', + description: 'test description', + validationRegex: 'test regex', + displayTemplate: 'test template', + entityType: 'Work' +} + const identifierData = { id: 1, typeId: 1, @@ -76,6 +85,8 @@ describe("GET /work", () => { .save(null, {method: 'insert'}); await new IdentifierSet(setData) .save(null, {method: 'insert'}); + await new IdentifierType(identifierTypeData) + .save(null, {method: 'insert'}); await new Identifier(identifierData) .save(null, {method: 'insert'}); await new RelationshipSet(setData) @@ -105,6 +116,7 @@ describe("GET /work", () => { 'bookbrainz.entity', 'bookbrainz.revision', 'bookbrainz.relationship_set', + 'bookbrainz.identifier_type', 'bookbrainz.identifier', 'bookbrainz.identifier_set', 'bookbrainz.alias', From 2fd5c44cb893e6b17acd95d4205f3d2a742b67e4 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Mon, 3 Jun 2019 18:37:33 +0530 Subject: [PATCH 13/78] refactor: move config to common section --- src/api/app.js | 2 +- src/{server => common}/helpers/config.js | 0 src/server/app.js | 2 +- src/server/helpers/achievement.js | 2 +- src/server/helpers/auth.js | 2 +- src/server/helpers/error.js | 2 +- src/server/routes/entity/entity.js | 2 +- src/server/routes/register.js | 2 +- 8 files changed, 7 insertions(+), 7 deletions(-) rename src/{server => common}/helpers/config.js (100%) diff --git a/src/api/app.js b/src/api/app.js index 31db94c92..c4e6a440d 100644 --- a/src/api/app.js +++ b/src/api/app.js @@ -29,7 +29,7 @@ import {get as _get} from 'lodash'; import appCleanup from '../server/helpers/appCleanup'; import bodyParser from 'body-parser'; import compression from 'compression'; -import config from '../server/helpers/config'; +import config from '../common/helpers/config'; import express from 'express'; import favicon from 'serve-favicon'; import git from 'git-rev'; diff --git a/src/server/helpers/config.js b/src/common/helpers/config.js similarity index 100% rename from src/server/helpers/config.js rename to src/common/helpers/config.js diff --git a/src/server/app.js b/src/server/app.js index d1188b44b..8e5ee7609 100644 --- a/src/server/app.js +++ b/src/server/app.js @@ -30,7 +30,7 @@ import {get as _get} from 'lodash'; import appCleanup from './helpers/appCleanup'; import bodyParser from 'body-parser'; import compression from 'compression'; -import config from './helpers/config'; +import config from '../common/helpers/config'; import express from 'express'; import favicon from 'serve-favicon'; import git from 'git-rev'; diff --git a/src/server/helpers/achievement.js b/src/server/helpers/achievement.js index 730399e64..7c037e917 100644 --- a/src/server/helpers/achievement.js +++ b/src/server/helpers/achievement.js @@ -26,7 +26,7 @@ import * as error from './error'; import Log from 'log'; import Promise from 'bluebird'; -import config from './config'; +import config from '../../common/helpers/config'; const log = new Log(config.site.log); diff --git a/src/server/helpers/auth.js b/src/server/helpers/auth.js index 7b09987c4..a9a9efa26 100644 --- a/src/server/helpers/auth.js +++ b/src/server/helpers/auth.js @@ -22,7 +22,7 @@ import * as error from '../helpers/error'; import Log from 'log'; import _ from 'lodash'; -import config from './config'; +import config from '../../common/helpers/config'; import passport from 'passport'; import status from 'http-status'; diff --git a/src/server/helpers/error.js b/src/server/helpers/error.js index 82784dad5..ff7d3b973 100644 --- a/src/server/helpers/error.js +++ b/src/server/helpers/error.js @@ -22,7 +22,7 @@ import Layout from '../../client/containers/layout'; import Log from 'log'; import React from 'react'; import ReactDOMServer from 'react-dom/server'; -import config from './config'; +import config from '../../common/helpers/config'; import {generateProps} from './props'; import status from 'http-status'; import target from '../templates/target'; diff --git a/src/server/routes/entity/entity.js b/src/server/routes/entity/entity.js index 6fd9d109e..84778db29 100644 --- a/src/server/routes/entity/entity.js +++ b/src/server/routes/entity/entity.js @@ -49,7 +49,7 @@ import React from 'react'; import ReactDOMServer from 'react-dom/server'; import WorkPage from '../../../client/components/pages/entities/work'; import _ from 'lodash'; -import config from '../../helpers/config'; +import config from '../../../common/helpers/config'; import target from '../../templates/target'; type PassportRequest = $Request & {user: any, session: any}; diff --git a/src/server/routes/register.js b/src/server/routes/register.js index b9b1e6987..25d40415d 100644 --- a/src/server/routes/register.js +++ b/src/server/routes/register.js @@ -31,7 +31,7 @@ import RegisterAuthPage from '../../client/components/pages/registration-auth'; import RegisterDetailPage from '../../client/components/forms/registration-details'; import _ from 'lodash'; -import config from '../helpers/config'; +import config from '../../common/helpers/config'; import express from 'express'; import target from '../templates/target'; From 39a8946c80e36f8c873eee33f3270dfbbc2068c9 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Mon, 3 Jun 2019 19:44:56 +0530 Subject: [PATCH 14/78] refactor: create entity using test-helper --- test/src/api/routes/test-work.js | 151 ++++++------------------------- 1 file changed, 28 insertions(+), 123 deletions(-) diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index a8a910ba3..8783701cf 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -1,137 +1,42 @@ -/* eslint-disable */ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {createWork, getRandomUUID, truncateEntities} from '../../../test-helpers/create-entities'; import app from '../../../../src/api/app'; -import orm from '../../../bookbrainz-data'; -/// Import the dependencies for testing import chai from 'chai'; import chaiHttp from 'chai-http'; -import faker from 'faker'; -// Configure chai -chai.use(chaiHttp); -chai.should(); - -const { - Alias, AliasSet, Annotation, Disambiguation, Editor, EditorType, Entity, Gender, - IdentifierSet, Identifier, IdentifierType, RelationshipSet, Revision, Work, bookshelf, util -} = orm; - -const genderData = { - id: 1, - name: 'test' -}; -const editorTypeData = { - id: 1, - label: 'test_type' -}; -const editorData = { - genderId: 1, - id: 1, - name: 'bob', - typeId: 1 -}; -const setData = {id: 1}; - -const aliasData = { - id: 1, - name: 'work name', - sortName: 'Work sort name' -}; - -const identifierTypeData = { - id: 1, - label: 'test label', - description: 'test description', - validationRegex: 'test regex', - displayTemplate: 'test template', - entityType: 'Work' -} - -const identifierData = { - id: 1, - typeId: 1, - value: 'Q123456' -} - -const revisionAttribs = { - authorId: 1, - id: 1 -}; -const aBBID = faker.random.uuid(); -const bBBID = faker.random.uuid(); -const workAttribs = { - aliasSetId: 1, - annotationId: 1, - bbid: aBBID, - disambiguationId: 1, - identifierSetId: 1, - relationshipSetId: 1, - revisionId: 1 -}; +chai.use(chaiHttp); +chai.should(); -describe("GET /work", () => { - before( - async () =>{ - await new Gender(genderData) - .save(null, {method: 'insert'}); - await new EditorType(editorTypeData) - .save(null, {method: 'insert'}) - await new Editor(editorData) - .save(null, {method: 'insert'}) - await new Alias(aliasData) - .save(null, {method: 'insert'}) - await new AliasSet({...setData, defaultAliasId: 1}) - .save(null, {method: 'insert'}); - await new IdentifierSet(setData) - .save(null, {method: 'insert'}); - await new IdentifierType(identifierTypeData) - .save(null, {method: 'insert'}); - await new Identifier(identifierData) - .save(null, {method: 'insert'}); - await new RelationshipSet(setData) - .save(null, {method: 'insert'}); - await new Disambiguation({ - comment: 'Test Disambiguation', - id: 1 - }) - .save(null, {method: 'insert'}); - await new Entity({bbid: aBBID, type: 'Work'}) - .save(null, {method: 'insert'}); - await new Revision(revisionAttribs) - .save(null, {method: 'insert'}); - await new Annotation({ - content: 'Test Annotation', - id: 1, - lastRevisionId: 1}) - .save(null, {method: 'insert'}); - await new Work(workAttribs) - .save(null, {method: 'insert'}); - }); +/* eslint-disable */ - after(function truncate() { - this.timeout(0); // eslint-disable-line babel/no-invalid-this - return util.truncateTables(bookshelf, [ - 'bookbrainz.entity', - 'bookbrainz.revision', - 'bookbrainz.relationship_set', - 'bookbrainz.identifier_type', - 'bookbrainz.identifier', - 'bookbrainz.identifier_set', - 'bookbrainz.alias', - 'bookbrainz.alias_set', - 'bookbrainz.annotation', - 'bookbrainz.disambiguation', - 'bookbrainz.editor', - 'bookbrainz.editor_type', - 'bookbrainz.work_header', - 'musicbrainz.gender' - ]); - }); +const aBBID = getRandomUUID(); +const bBBID = getRandomUUID(); +describe('GET /work', () => { + beforeEach(() => createWork(aBBID)); + afterEach(truncateEntities); // Test to get basic information of a work - it("should get basic information of work", (done) => { + it('should get basic information of work', (done) => { chai.request(app) .get(`/work/${aBBID}`) .end((err, res) => { From 080e4f6d6c3a75b2da62f1114ce42735b520a2f0 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Mon, 3 Jun 2019 23:31:10 +0530 Subject: [PATCH 15/78] fix: remove linting errors and handle errors for tests --- src/api/routes/work.js | 58 +++++++++++++++++++------------- test/src/api/routes/test-work.js | 21 ++++++++---- 2 files changed, 50 insertions(+), 29 deletions(-) diff --git a/src/api/routes/work.js b/src/api/routes/work.js index 3e51621fe..def7990d5 100644 --- a/src/api/routes/work.js +++ b/src/api/routes/work.js @@ -1,45 +1,57 @@ -/* eslint-disable */ - - +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {getWorkAliases, getWorkBasicInfo, getWorkIdentifiers} from '../helpers/formatWorkData'; +import _ from 'lodash'; import express from 'express'; import {getWorkFromDB} from '../../common/queries/work'; -import {getWorkBasicInfo, getWorkAliases, getWorkIdentifiers} from '../helpers/formatWorkData'; -import _ from 'lodash'; -const router = express.Router(); +const router = express.Router(); router.get('/:bbid', async (req, res, next) => { const params = ['defaultAlias', 'languageSet.languages', 'disambiguation']; - const work = await getWorkFromDB(req, params); // example params - if(_.isNil(work)) { + const work = await getWorkFromDB(req, params); + if (_.isNil(work)) { return res.status(404).send({message: 'This Work is not founded'}); - } else { - const workBasicInfo = getWorkBasicInfo(work.toJSON()); - return res.status(200).send(workBasicInfo); } + const workBasicInfo = getWorkBasicInfo(work.toJSON()); + return res.status(200).send(workBasicInfo); }); router.get('/:bbid/aliases', async (req, res, next) => { const params = ['aliasSet.aliases']; - const workWithAliases = await getWorkFromDB(req, params) - if(_.isNil(workWithAliases.aliasSet)) { + const workWithAliases = await getWorkFromDB(req, params); + if (_.isNil(workWithAliases.aliasSet)) { return res.status(404).send({message: 'This Work is not founded'}); - } else { - const workAliasesList = getWorkAliases(workWithAliases.toJSON()); - return res.status(200).send(workAliasesList); } -}) + const workAliasesList = getWorkAliases(workWithAliases.toJSON()); + return res.status(200).send(workAliasesList); +}); router.get('/:bbid/identifiers', async (req, res, next) => { const params = ['identifierSet.identifiers']; - const workWithIdentifiers = await getWorkFromDB(req, params) - if(_.isNil(workWithIdentifiers.identifierSet)) { + const workWithIdentifiers = await getWorkFromDB(req, params); + if (_.isNil(workWithIdentifiers.identifierSet)) { return res.status(404).send({message: 'No identifiers are founded for this work'}); - } else { - const workIdentifiersList = getWorkIdentifiers(workWithIdentifiers.toJSON()); - return res.status(200).send(workIdentifiersList); } -}) + const workIdentifiersList = getWorkIdentifiers(workWithIdentifiers.toJSON()); + return res.status(200).send(workIdentifiersList); +}); export default router; diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index 8783701cf..035b40765 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -26,8 +26,6 @@ import chaiHttp from 'chai-http'; chai.use(chaiHttp); chai.should(); -/* eslint-disable */ - const aBBID = getRandomUUID(); const bBBID = getRandomUUID(); @@ -40,6 +38,9 @@ describe('GET /work', () => { chai.request(app) .get(`/work/${aBBID}`) .end((err, res) => { + if (err) { + throw err; + } res.should.have.status(200); res.body.should.be.a('object'); res.body.should.all.keys( @@ -54,10 +55,13 @@ describe('GET /work', () => { }); }); - it("should return status 404, if work is not founded", (done) => { + it('should return status 404, if work is not founded', (done) => { chai.request(app) .get(`/work/${bBBID}`) .end((err, res) => { + if (err) { + throw err; + } res.should.have.status(404); res.body.should.be.a('object'); res.body.message.should.equal( @@ -67,10 +71,13 @@ describe('GET /work', () => { }); }); - it("should return list of aliases of work", (done) => { + it('should return list of aliases of work', (done) => { chai.request(app) .get(`/work/${aBBID}/aliases`) .end((err, res) => { + if (err) { + throw err; + } res.should.have.status(200); res.body.should.be.a('object'); res.body.should.all.keys( @@ -81,10 +88,13 @@ describe('GET /work', () => { }); }); - it("should return list of identifiers of work", (done) => { + it('should return list of identifiers of work', (done) => { chai.request(app) .get(`/work/${aBBID}/identifiers`) .end((err, res) => { + if (err) { + throw err; + } res.should.have.status(200); res.body.should.be.a('object'); res.body.should.all.keys( @@ -94,5 +104,4 @@ describe('GET /work', () => { done(); }); }); - }); From 7a2252b1e9802abccd7b5cf9b0159f3b5a072ecf Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Mon, 3 Jun 2019 23:33:01 +0530 Subject: [PATCH 16/78] refaxtor: clean api app.js --- src/api/app.js | 57 -------------------------------------------------- 1 file changed, 57 deletions(-) diff --git a/src/api/app.js b/src/api/app.js index c4e6a440d..50ac363a6 100644 --- a/src/api/app.js +++ b/src/api/app.js @@ -31,13 +31,10 @@ import bodyParser from 'body-parser'; import compression from 'compression'; import config from '../common/helpers/config'; import express from 'express'; -import favicon from 'serve-favicon'; -import git from 'git-rev'; import logger from 'morgan'; import path from 'path'; import redis from 'connect-redis'; import routes from './routes'; -import serveStatic from 'serve-static'; import session from 'express-session'; @@ -50,12 +47,9 @@ Promise.config({ const app = express(); app.locals.orm = BookBrainzData(config.database); -const rootDir = path.join(__dirname, '../../'); app.set('trust proxy', config.site.proxyTrust); -app.use(favicon(path.join(rootDir, 'static/images/icons/favicon.ico'))); - if (app.get('env') !== 'testing') { app.use(logger('dev')); } @@ -66,29 +60,6 @@ app.use(bodyParser.urlencoded({ })); app.use(compression()); -// Set up serving of static assets -if (process.env.NODE_ENV === 'development') { - const webpack = require('webpack'); - const webpackDevMiddleware = require('webpack-dev-middleware'); - const webpackHotMiddleware = require('webpack-hot-middleware'); - - const webpackConfig = require(path.resolve(rootDir, './webpack.client')); - const compiler = webpack(webpackConfig); - - app.use(webpackDevMiddleware(compiler, { - // lazy: false, - logTime: true, - noInfo: false, - publicPath: webpackConfig.output.publicPath - // serverSideRender: false - })); - - app.use(webpackHotMiddleware(compiler)); -} -else { - app.use(serveStatic(path.join(rootDir, 'static/js'))); -} -app.use(express.static(path.join(rootDir, 'static'))); const RedisStore = redis(session); app.use(session({ @@ -106,34 +77,6 @@ app.use(session({ })); -// Set up constants that will remain valid for the life of the app -let siteRevision = 'unknown'; -git.short((revision) => { - siteRevision = revision; -}); - -const repositoryUrl = 'https://github.com/bookbrainz/bookbrainz-site/'; - -app.use((req, res, next) => { - // Set up globally-used properties - res.locals.siteRevision = siteRevision; - res.locals.repositoryUrl = repositoryUrl; - res.locals.alerts = []; - - if (!req.session) { - res.locals.alerts.push({ - level: 'danger', - message: 'We are currently experiencing technical difficulties; ' + - 'signing in will not work until this is resolved.' - }); - } - - // Add user data to every rendered route - res.locals.user = req.user; - - next(); -}); - // Set up routes routes(app); From df9618ace98dbd4abd54b8bac5e0ddded2e656cd Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Tue, 4 Jun 2019 03:30:08 +0530 Subject: [PATCH 17/78] refactor: add work type, replace langauge in place of languageId and linting errors --- src/api/helpers/formatWorkData.js | 79 +++++++++++++++++++------------ src/api/routes/work.js | 12 ++--- src/common/queries/work.js | 4 +- 3 files changed, 57 insertions(+), 38 deletions(-) diff --git a/src/api/helpers/formatWorkData.js b/src/api/helpers/formatWorkData.js index 935c0379c..aae5f319d 100644 --- a/src/api/helpers/formatWorkData.js +++ b/src/api/helpers/formatWorkData.js @@ -1,47 +1,66 @@ -/* eslint-disable */ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* eslint-disable */ import _ from 'lodash'; export function getWorkBasicInfo(work: object) { return _.isNil(work) ? null : { bbid: work.bbid, - defaultAlias: work.defaultAlias, + defaultAlias: { + name: work.defaultAlias.name, + sortName: work.defaultAlias.sortName, + aliasLanguage: work.defaultAlias.language.name + }, disambiguation: work.disambiguation ? work.disambiguation.comment : null, languages: work.languageSet ? - work.languageSet.languages.map((language) => language.name) : null, - workType: work.typeId, + work.languageSet.languages.map((language) => language.name) : null, + workType: work.workType.label, entityType: work.type ? work.type : null }; } -export function getWorkAliases(work: object) { - - return _.isNil(work) ? null : - { - bbid: work.bbid, - aliases: work.aliasSet.aliases.map( (alias) => { - return { - name: alias.name, - sortName: alias.sortName, - aliasLanguage: alias.languageId, - primary: alias.primary - } - }) - } +export function getWorkAliases(work: object) { + return _.isNil(work) ? null : + { + bbid: work.bbid, + aliases: work.aliasSet.aliases.map((alias) => { + return { + name: alias.name, + sortName: alias.sortName, + aliasLanguage: alias.language.name, + primary: alias.primary + }; + }) + }; } export function getWorkIdentifiers(work: object) { - return _.isNil(work) ? null : - { - bbid: work.bbid, - identifiers: work.identifierSet.identifiers.map( (identifier) => { - return { - type: identifier.typeId, - value: identifier.value - } - }) - } - -} \ No newline at end of file + return _.isNil(work) ? null : + { + bbid: work.bbid, + identifiers: work.identifierSet.identifiers.map((identifier) => { + return { + type: identifier.type.label, + value: identifier.value + }; + }) + }; +} diff --git a/src/api/routes/work.js b/src/api/routes/work.js index def7990d5..6d856d7fc 100644 --- a/src/api/routes/work.js +++ b/src/api/routes/work.js @@ -25,8 +25,8 @@ import {getWorkFromDB} from '../../common/queries/work'; const router = express.Router(); router.get('/:bbid', async (req, res, next) => { - const params = ['defaultAlias', 'languageSet.languages', 'disambiguation']; - const work = await getWorkFromDB(req, params); + const relations = ['defaultAlias.language', 'languageSet.languages', 'disambiguation', 'workType']; + const work = await getWorkFromDB(req, relations); if (_.isNil(work)) { return res.status(404).send({message: 'This Work is not founded'}); } @@ -35,8 +35,8 @@ router.get('/:bbid', async (req, res, next) => { }); router.get('/:bbid/aliases', async (req, res, next) => { - const params = ['aliasSet.aliases']; - const workWithAliases = await getWorkFromDB(req, params); + const relations = ['aliasSet.aliases.language']; + const workWithAliases = await getWorkFromDB(req, relations); if (_.isNil(workWithAliases.aliasSet)) { return res.status(404).send({message: 'This Work is not founded'}); } @@ -45,8 +45,8 @@ router.get('/:bbid/aliases', async (req, res, next) => { }); router.get('/:bbid/identifiers', async (req, res, next) => { - const params = ['identifierSet.identifiers']; - const workWithIdentifiers = await getWorkFromDB(req, params); + const relations = ['identifierSet.identifiers.type']; + const workWithIdentifiers = await getWorkFromDB(req, relations); if (_.isNil(workWithIdentifiers.identifierSet)) { return res.status(404).send({message: 'No identifiers are founded for this work'}); } diff --git a/src/common/queries/work.js b/src/common/queries/work.js index c6f85f6a1..952462d75 100644 --- a/src/common/queries/work.js +++ b/src/common/queries/work.js @@ -5,12 +5,12 @@ import _ from 'lodash'; -export async function getWorkFromDB(req, params) { +export async function getWorkFromDB(req, relations) { const {orm} = req.app.locals; const {Work} = orm; const workPromise = Work.forge({bbid: req.params.bbid}) - .fetch({withRelated: params}) + .fetch({withRelated: relations}) const workData = await Promise.resolve(workPromise) From 27a0bc4099463125fbb138fb7f8cf33d4a2f36da Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Wed, 5 Jun 2019 15:34:36 +0200 Subject: [PATCH 18/78] test: Refactor API work tests to use async/await Solving an issue with uncaught exceptions that would break the test harness --- test/src/api/routes/test-work.js | 101 ++++++++++++------------------- 1 file changed, 38 insertions(+), 63 deletions(-) diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index 035b40765..fde947278 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -1,3 +1,4 @@ +/* eslint-disable prefer-arrow-callback,func-names */ /* * Copyright (C) 2019 Akhilesh Kumar * @@ -34,74 +35,48 @@ describe('GET /work', () => { beforeEach(() => createWork(aBBID)); afterEach(truncateEntities); // Test to get basic information of a work - it('should get basic information of work', (done) => { - chai.request(app) - .get(`/work/${aBBID}`) - .end((err, res) => { - if (err) { - throw err; - } - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.should.all.keys( - 'bbid', - 'defaultAlias', - 'languages', - 'disambiguation', - 'workType', - 'entityType' - ); - done(); - }); + it('should get basic information of work', async function () { + const res = await chai.request(app).get(`/work/${aBBID}`); + + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.all.keys( + 'bbid', + 'defaultAlias', + 'languages', + 'disambiguation', + 'workType', + 'entityType' + ); }); - it('should return status 404, if work is not founded', (done) => { - chai.request(app) - .get(`/work/${bBBID}`) - .end((err, res) => { - if (err) { - throw err; - } - res.should.have.status(404); - res.body.should.be.a('object'); - res.body.message.should.equal( - 'This Work is not founded' - ); - done(); - }); + it('should return status 404, if work is not founded', async function () { + const res = await chai.request(app).get(`/work/${bBBID}`); + + res.should.have.status(404); + res.body.should.be.a('object'); + res.body.message.should.equal('This Work is not founded'); }); - it('should return list of aliases of work', (done) => { - chai.request(app) - .get(`/work/${aBBID}/aliases`) - .end((err, res) => { - if (err) { - throw err; - } - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.should.all.keys( - 'bbid', - 'aliases' - ); - done(); - }); + it('should return list of aliases of work', async function () { + const res = await chai.request(app).get(`/work/${aBBID}/aliases`); + + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.all.keys( + 'bbid', + 'aliases' + ); }); - it('should return list of identifiers of work', (done) => { - chai.request(app) - .get(`/work/${aBBID}/identifiers`) - .end((err, res) => { - if (err) { - throw err; - } - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.should.all.keys( - 'bbid', - 'identifiers' - ); - done(); - }); + it('should return list of identifiers of work', async function () { + const res = await chai.request(app).get(`/work/${aBBID}/identifiers`); + + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.all.keys( + 'bbid', + 'identifiers' + ); }); }); From 5d0069f2903af0d9d81eb27b8d789fa1ec73f250 Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Wed, 5 Jun 2019 16:32:36 +0200 Subject: [PATCH 19/78] test: Added WorkType and LanguageSet to entity creation test utility --- test/test-helpers/create-entities.js | 41 ++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/test/test-helpers/create-entities.js b/test/test-helpers/create-entities.js index badf4f4fa..a406d4725 100644 --- a/test/test-helpers/create-entities.js +++ b/test/test-helpers/create-entities.js @@ -25,8 +25,11 @@ const { bookshelf, util, Editor, EditorType, Revision, RelationshipSet, Alias, AliasSet, Identifier, IdentifierType, IdentifierSet, Disambiguation, Entity, Annotation, Gender, - Author, Edition, EditionGroup, Publisher, Work + Author, Edition, EditionGroup, Publisher, Work, + Language, WorkType } = orm; +const {updateLanguageSet} = orm.func.language; + const setData = {id: 1}; @@ -110,6 +113,30 @@ async function createRelationshipSet() { await new RelationshipSet(setData) .save(null, {method: 'insert'}); } +const languageAttribs = { + frequency: 1, + id: 1, + isoCode1: 'en', + isoCode2b: 'eng', + isoCode2t: 'eng', + isoCode3: 'eng', + name: 'English' +}; + +async function createLanguageSet() { + // Create relationships here if you need them + await new Language(languageAttribs) + .save(null, {method: 'insert'}); + await new Language({...languageAttribs, id: 2}) + .save(null, {method: 'insert'}); + const languageSet = await updateLanguageSet( + orm, + null, + null, + [{id: 1}, {id: 2}] + ); + return languageSet.get('id'); +} export function getRandomUUID() { return uuidv4(); @@ -151,10 +178,18 @@ export async function createWork(optionalBBID) { const bbid = optionalBBID || uuidv4(); await createEntityPrerequisites(); + const languageSetId = await createLanguageSet(); + const workAttribs = { + bbid, + languageSetId, + typeId: setData.id + }; + await new WorkType({...setData, label: 'Work Type 1'}) + .save(null, {method: 'insert'}); await new Entity({bbid, type: 'Work'}) .save(null, {method: 'insert'}); - await new Work({...entityAttribs, bbid}) + await new Work({...entityAttribs, ...workAttribs}) .save(null, {method: 'insert'}); } @@ -173,6 +208,8 @@ export function truncateEntities() { 'bookbrainz.entity', 'bookbrainz.revision', 'bookbrainz.annotation', + 'bookbrainz.work_type', + 'musicbrainz.language', 'musicbrainz.gender' ]); } From 4c04fb08c36ec924d747a18b5b4f70c964aa56a1 Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Wed, 5 Jun 2019 17:41:38 +0200 Subject: [PATCH 20/78] refactor: Move some helpers to common code To make sure no code in src/api or src/common depends on any code in src/server or src/client --- src/api/app.js | 4 +- src/{server => common}/helpers/appCleanup.js | 0 src/common/helpers/error.js | 163 +++++++++++++++++++ src/server/app.js | 8 +- src/server/helpers/entityRouteUtils.js | 2 +- src/server/helpers/error.js | 147 +---------------- src/server/routes/editor.js | 2 +- src/server/routes/register.js | 2 +- src/server/routes/search.js | 2 +- 9 files changed, 175 insertions(+), 155 deletions(-) rename src/{server => common}/helpers/appCleanup.js (100%) create mode 100644 src/common/helpers/error.js diff --git a/src/api/app.js b/src/api/app.js index 50ac363a6..f21fefd30 100644 --- a/src/api/app.js +++ b/src/api/app.js @@ -20,13 +20,13 @@ /* eslint global-require: 'warn' */ -import * as error from '../server/helpers/error'; +import * as error from '../common/helpers/error'; import BookBrainzData from 'bookbrainz-data'; import Debug from 'debug'; import Promise from 'bluebird'; import {get as _get} from 'lodash'; -import appCleanup from '../server/helpers/appCleanup'; +import appCleanup from '../common/helpers/appCleanup'; import bodyParser from 'body-parser'; import compression from 'compression'; import config from '../common/helpers/config'; diff --git a/src/server/helpers/appCleanup.js b/src/common/helpers/appCleanup.js similarity index 100% rename from src/server/helpers/appCleanup.js rename to src/common/helpers/appCleanup.js diff --git a/src/common/helpers/error.js b/src/common/helpers/error.js new file mode 100644 index 000000000..f901d8ba9 --- /dev/null +++ b/src/common/helpers/error.js @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2015-2016 Sean Burke + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import Log from 'log'; +import config from '../../common/helpers/config'; +import status from 'http-status'; + + +const log = new Log(config.site.log); + +export class SiteError extends Error { + constructor(message) { + super(); + + /* + * We can't access the subclass's default message before calling super, + * so we set it manually here + */ + this.message = message || this.constructor.defaultMessage; + + this.name = this.constructor.name; + this.status = this.constructor.status; + } + + static get defaultMessage() { + return 'An unhandled error occurred'; + } + + static get status() { + return status.INTERNAL_SERVER_ERROR; + } +} + +class PathError extends SiteError { + constructor(message, req) { + super(message); + this.detailedMessage = this.constructor.detailedMessage && + this.constructor.detailedMessage(req); + } +} + +class _AuthenticationError extends SiteError { + static get status() { + return status.UNAUTHORIZED; + } +} + +export class AuthenticationFailedError extends _AuthenticationError { + static get defaultMessage() { + return 'Invalid authentication credentials'; + } +} + +// For use when something slips past client-side validation +export class FormSubmissionError extends SiteError { + static get defaultMessage() { + return 'Form contained invalid data'; + } + + static get status() { + return status.BAD_REQUEST; + } +} + +export class NotAuthenticatedError extends _AuthenticationError { + static get defaultMessage() { + return 'You are not currently authenticated'; + } +} + +export class NotFoundError extends PathError { + static get defaultMessage() { + return 'Page not found'; + } + + static get status() { + return status.NOT_FOUND; + } + + static detailedMessage(req) { + return [ + `No content exists at the path requested: ${req.path}`, + 'Please make sure you have entered in the correct address!' + ]; + } +} + +export class PermissionDeniedError extends PathError { + static get defaultMessage() { + return 'You do not have permission to access this page'; + } + + static get status() { + return status.FORBIDDEN; + } + + static detailedMessage(req) { + return [ + `You do not have permission to access the following path: + ${req.path}`, + `Please make sure you have entered in the correct credentials and + address!` + ]; + } +} + +function _logError(err) { + log.error(err); +} + +export function getErrorToSend(err) { + if (err instanceof SiteError) { + return err; + } + + /* + * If we haven't generated the error ourselves with display in mind, log + * instead and return a new generic SiteError + */ + _logError(err); + return new SiteError(); +} + +export function sendErrorAsJSON(res, err) { + const errorToSend = getErrorToSend(err); + + res.status( + errorToSend.status || status.INTERNAL_SERVER_ERROR + ).send({error: errorToSend.message}); +} + +export class AwardNotUnlockedError extends Error { + constructor(message) { + super(); + + /* + * We can't access the subclass's default message before calling super, + * so we set it manually here + */ + this.message = message || this.constructor.defaultMessage; + + this.name = this.constructor.name; + } + + static get defaultMessage() { + return 'An award was not unlocked'; + } +} diff --git a/src/server/app.js b/src/server/app.js index 8e5ee7609..a56c5d6bb 100644 --- a/src/server/app.js +++ b/src/server/app.js @@ -20,14 +20,14 @@ /* eslint global-require: 'warn' */ import * as auth from './helpers/auth'; -import * as error from './helpers/error'; +import * as error from '../common/helpers/error'; import * as search from './helpers/search'; - +import * as serverErrorHelper from './helpers/error'; import BookBrainzData from 'bookbrainz-data'; import Debug from 'debug'; import Promise from 'bluebird'; import {get as _get} from 'lodash'; -import appCleanup from './helpers/appCleanup'; +import appCleanup from '../common/helpers/appCleanup'; import bodyParser from 'body-parser'; import compression from 'compression'; import config from '../common/helpers/config'; @@ -153,7 +153,7 @@ app.use((req, res, next) => { // Error handler; arity MUST be 4 or express doesn't treat it as such app.use((err, req, res, next) => { // eslint-disable-line no-unused-vars - error.renderError(req, res, err); + serverErrorHelper.renderError(req, res, err); }); const debug = Debug('bbsite'); diff --git a/src/server/helpers/entityRouteUtils.js b/src/server/helpers/entityRouteUtils.js index cb068a30a..2d5cd9e70 100644 --- a/src/server/helpers/entityRouteUtils.js +++ b/src/server/helpers/entityRouteUtils.js @@ -21,7 +21,7 @@ import * as Immutable from 'immutable'; import * as entityEditorHelpers from '../../client/entity-editor/helpers'; import * as entityRoutes from '../routes/entity/entity'; -import * as error from './error'; +import * as error from '../../common/helpers/error'; import * as propHelpers from '../../client/helpers/props'; import * as utils from './utils'; diff --git a/src/server/helpers/error.js b/src/server/helpers/error.js index ff7d3b973..7ec60cfd1 100644 --- a/src/server/helpers/error.js +++ b/src/server/helpers/error.js @@ -16,135 +16,18 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +import * as error from '../../common/helpers/error'; import * as propHelpers from '../../client/helpers/props'; import ErrorPage from '../../client/components/pages/error'; import Layout from '../../client/containers/layout'; -import Log from 'log'; import React from 'react'; import ReactDOMServer from 'react-dom/server'; -import config from '../../common/helpers/config'; import {generateProps} from './props'; import status from 'http-status'; import target from '../templates/target'; - -const log = new Log(config.site.log); - -export class SiteError extends Error { - constructor(message) { - super(); - - /* - * We can't access the subclass's default message before calling super, - * so we set it manually here - */ - this.message = message || this.constructor.defaultMessage; - - this.name = this.constructor.name; - this.status = this.constructor.status; - } - - static get defaultMessage() { - return 'An unhandled error occurred'; - } - - static get status() { - return status.INTERNAL_SERVER_ERROR; - } -} - -class PathError extends SiteError { - constructor(message, req) { - super(message); - this.detailedMessage = this.constructor.detailedMessage && - this.constructor.detailedMessage(req); - } -} - -class _AuthenticationError extends SiteError { - static get status() { - return status.UNAUTHORIZED; - } -} - -export class AuthenticationFailedError extends _AuthenticationError { - static get defaultMessage() { - return 'Invalid authentication credentials'; - } -} - -// For use when something slips past client-side validation -export class FormSubmissionError extends SiteError { - static get defaultMessage() { - return 'Form contained invalid data'; - } - - static get status() { - return status.BAD_REQUEST; - } -} - -export class NotAuthenticatedError extends _AuthenticationError { - static get defaultMessage() { - return 'You are not currently authenticated'; - } -} - -export class NotFoundError extends PathError { - static get defaultMessage() { - return 'Page not found'; - } - - static get status() { - return status.NOT_FOUND; - } - - static detailedMessage(req) { - return [ - `No content exists at the path requested: ${req.path}`, - 'Please make sure you have entered in the correct address!' - ]; - } -} - -export class PermissionDeniedError extends PathError { - static get defaultMessage() { - return 'You do not have permission to access this page'; - } - - static get status() { - return status.FORBIDDEN; - } - - static detailedMessage(req) { - return [ - `You do not have permission to access the following path: - ${req.path}`, - `Please make sure you have entered in the correct credentials and - address!` - ]; - } -} - -function _logError(err) { - log.error(err); -} - -function _getErrorToSend(err) { - if (err instanceof SiteError) { - return err; - } - - /* - * If we haven't generated the error ourselves with display in mind, log - * instead and return a new generic SiteError - */ - _logError(err); - return new SiteError(); -} - export function renderError(req, res, err) { - const errorToSend = _getErrorToSend(err); + const errorToSend = error.getErrorToSend(err); const props = generateProps(req, res, { error: errorToSend }); @@ -159,29 +42,3 @@ export function renderError(req, res, err) { errorToSend.status || status.INTERNAL_SERVER_ERROR ).send(target({markup})); } - -export function sendErrorAsJSON(res, err) { - const errorToSend = _getErrorToSend(err); - - res.status( - errorToSend.status || status.INTERNAL_SERVER_ERROR - ).send({error: errorToSend.message}); -} - -export class AwardNotUnlockedError extends Error { - constructor(message) { - super(); - - /* - * We can't access the subclass's default message before calling super, - * so we set it manually here - */ - this.message = message || this.constructor.defaultMessage; - - this.name = this.constructor.name; - } - - static get defaultMessage() { - return 'An award was not unlocked'; - } -} diff --git a/src/server/routes/editor.js b/src/server/routes/editor.js index eb97084e4..83dae86d9 100644 --- a/src/server/routes/editor.js +++ b/src/server/routes/editor.js @@ -18,7 +18,7 @@ */ import * as auth from '../helpers/auth'; -import * as error from '../helpers/error'; +import * as error from '../../common/helpers/error'; import * as handler from '../helpers/handler'; import * as propHelpers from '../../client/helpers/props'; import {escapeProps, generateProps} from '../helpers/props'; diff --git a/src/server/routes/register.js b/src/server/routes/register.js index 25d40415d..a620bc656 100644 --- a/src/server/routes/register.js +++ b/src/server/routes/register.js @@ -18,7 +18,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -import * as error from '../helpers/error'; +import * as error from '../../common/helpers/error'; import * as handler from '../helpers/handler'; import * as middleware from '../helpers/middleware'; import * as propHelpers from '../../client/helpers/props'; diff --git a/src/server/routes/search.js b/src/server/routes/search.js index f9ad29449..cd86c86a9 100644 --- a/src/server/routes/search.js +++ b/src/server/routes/search.js @@ -18,7 +18,7 @@ */ import * as auth from '../helpers/auth'; -import * as error from '../helpers/error'; +import * as error from '../../common/helpers/error'; import * as handler from '../helpers/handler'; import * as propHelpers from '../../client/helpers/props'; import * as search from '../helpers/search'; From f85e706afd4fdcf8b7b6a9c94468f16c16eb4f49 Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Wed, 5 Jun 2019 17:42:17 +0200 Subject: [PATCH 21/78] refactor: Don't render HTML page for API error --- src/api/app.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/api/app.js b/src/api/app.js index f21fefd30..fa3911a24 100644 --- a/src/api/app.js +++ b/src/api/app.js @@ -85,12 +85,8 @@ app.use((req, res, next) => { next(new error.NotFoundError(null, req)); }); -// Error handler; arity MUST be 4 or express doesn't treat it as such -app.use((err, req, res, next) => { // eslint-disable-line no-unused-vars - error.renderError(req, res, err); -}); -const debug = Debug('bbsite'); +const debug = Debug('bbapi'); const DEFAULT_API_PORT = 9098; app.set('port', process.env.PORT || DEFAULT_API_PORT); // eslint-disable-line no-process-env,max-len From 2da97469f5bcacb3c137e6e432553d2186e204bd Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Wed, 5 Jun 2019 17:43:05 +0200 Subject: [PATCH 22/78] fix: Ignore client and server when building API --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 19f246b9b..4ec87fa3a 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "prepublishOnly": "npm run clean && npm run mkdirs && npm run copy-client-scripts", "postinstall": "npm run prepublishOnly", "build-server-js": "babel src --out-dir lib --ignore src/api", - "build-api-js": "babel src --out-dir lib --ignore src/client", + "build-api-js": "babel src --out-dir lib --ignore 'src/server','src/client'", "build-client-js": "./scripts/build-client-js.sh", "build-less": "./scripts/build-less.sh", "build": "npm run build-less && npm run build-client-js && npm run build-server-js", From 6775679b4af139ff97372c8da78d715906c7b926 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Thu, 6 Jun 2019 23:27:27 +0530 Subject: [PATCH 23/78] refactor: load entity data with middleware Add more tests --- src/api/helpers/entityLoader.js | 19 ++++++ ...{formatWorkData.js => formatEntityData.js} | 30 ++++----- src/api/routes/work.js | 66 ++++++++++--------- src/common/helpers/utils.js | 21 ++++++ src/server/helpers/achievement.js | 2 +- src/server/helpers/auth.js | 2 +- src/server/helpers/handler.js | 2 +- src/server/helpers/middleware.js | 6 +- src/server/helpers/search.js | 3 +- src/server/helpers/utils.js | 19 ------ test/src/api/routes/test-work.js | 49 +++++++++++--- 11 files changed, 137 insertions(+), 82 deletions(-) create mode 100644 src/api/helpers/entityLoader.js rename src/api/helpers/{formatWorkData.js => formatEntityData.js} (61%) create mode 100644 src/common/helpers/utils.js diff --git a/src/api/helpers/entityLoader.js b/src/api/helpers/entityLoader.js new file mode 100644 index 000000000..b90a073a1 --- /dev/null +++ b/src/api/helpers/entityLoader.js @@ -0,0 +1,19 @@ +import * as commonUtils from '../../common/helpers/utils'; + + +export function makeEntityLoader(modelName, relations, errMessage) { + return async (req, res, next) => { + const {orm} = req.app.locals; + if (commonUtils.isValidBBID(req.params.bbid)) { + try { + const entityData = await orm.func.entity.getEntity(orm, modelName, req.params.bbid, relations); + res.locals.entity = entityData; + return next(); + } + catch (err) { + return res.status(404).send({message: errMessage}); + } + } + return res.status(406).send({message: 'BBID is not valid uuid'}); + }; +} diff --git a/src/api/helpers/formatWorkData.js b/src/api/helpers/formatEntityData.js similarity index 61% rename from src/api/helpers/formatWorkData.js rename to src/api/helpers/formatEntityData.js index aae5f319d..b0ce9b6b1 100644 --- a/src/api/helpers/formatWorkData.js +++ b/src/api/helpers/formatEntityData.js @@ -22,26 +22,24 @@ import _ from 'lodash'; export function getWorkBasicInfo(work: object) { return _.isNil(work) ? null : { - bbid: work.bbid, + bbid: _.get(work, 'bbid', null), defaultAlias: { - name: work.defaultAlias.name, - sortName: work.defaultAlias.sortName, - aliasLanguage: work.defaultAlias.language.name + name: _.get(work, 'defaultAlias.name', null), + sortName: _.get(work, 'defaultAlias.sortName', null), + aliasLanguage: _.get(work, 'defaultAlias.language.name', null) }, - disambiguation: work.disambiguation ? - work.disambiguation.comment : null, - languages: work.languageSet ? - work.languageSet.languages.map((language) => language.name) : null, - workType: work.workType.label, - entityType: work.type ? work.type : null + disambiguation: _.get(work, 'disambiguation.comment', null), + languages: _.get(work, 'languageSet.languages', []).map((language) => language.name), + workType: _.get(work, 'workType.label', null), + entityType: _.get(work, 'type', null) }; } -export function getWorkAliases(work: object) { +export function getEntityAliases(work: object) { return _.isNil(work) ? null : { - bbid: work.bbid, - aliases: work.aliasSet.aliases.map((alias) => { + bbid: _.get(work, 'bbid', null), + aliases: _.get(work, 'aliasSet.aliases', []).map((alias) => { return { name: alias.name, sortName: alias.sortName, @@ -52,11 +50,11 @@ export function getWorkAliases(work: object) { }; } -export function getWorkIdentifiers(work: object) { +export function getEntityIdentifiers(work: object) { return _.isNil(work) ? null : { - bbid: work.bbid, - identifiers: work.identifierSet.identifiers.map((identifier) => { + bbid: _.get(work, 'bbid', null), + identifiers: _.get(work, 'identifierSet.identifiers', []).map((identifier) => { return { type: identifier.type.label, value: identifier.value diff --git a/src/api/routes/work.js b/src/api/routes/work.js index 6d856d7fc..d8be04e26 100644 --- a/src/api/routes/work.js +++ b/src/api/routes/work.js @@ -16,42 +16,46 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -import {getWorkAliases, getWorkBasicInfo, getWorkIdentifiers} from '../helpers/formatWorkData'; +import {getEntityAliases, getEntityIdentifiers, getWorkBasicInfo} from '../helpers/formatEntityData'; import _ from 'lodash'; import express from 'express'; -import {getWorkFromDB} from '../../common/queries/work'; +import {makeEntityLoader} from '../helpers/entityLoader'; const router = express.Router(); -router.get('/:bbid', async (req, res, next) => { - const relations = ['defaultAlias.language', 'languageSet.languages', 'disambiguation', 'workType']; - const work = await getWorkFromDB(req, relations); - if (_.isNil(work)) { - return res.status(404).send({message: 'This Work is not founded'}); - } - const workBasicInfo = getWorkBasicInfo(work.toJSON()); - return res.status(200).send(workBasicInfo); -}); - -router.get('/:bbid/aliases', async (req, res, next) => { - const relations = ['aliasSet.aliases.language']; - const workWithAliases = await getWorkFromDB(req, relations); - if (_.isNil(workWithAliases.aliasSet)) { - return res.status(404).send({message: 'This Work is not founded'}); - } - const workAliasesList = getWorkAliases(workWithAliases.toJSON()); - return res.status(200).send(workAliasesList); -}); - -router.get('/:bbid/identifiers', async (req, res, next) => { - const relations = ['identifierSet.identifiers.type']; - const workWithIdentifiers = await getWorkFromDB(req, relations); - if (_.isNil(workWithIdentifiers.identifierSet)) { - return res.status(404).send({message: 'No identifiers are founded for this work'}); - } - const workIdentifiersList = getWorkIdentifiers(workWithIdentifiers.toJSON()); - return res.status(200).send(workIdentifiersList); -}); +const workBasicRelations = [ + 'defaultAlias.language', + 'languageSet.languages', + 'disambiguation', + 'workType' +]; + +const workError = 'Work not found'; + +router.get('/:bbid', + makeEntityLoader('Work', workBasicRelations, workError), + async (req, res, next) => { + const workBasicInfo = await getWorkBasicInfo(res.locals.entity); + return res.status(200).send(workBasicInfo); + }); + +const workAliasRelation = ['aliasSet.aliases.language']; + +router.get('/:bbid/aliases', + makeEntityLoader('Work', workAliasRelation, workError), + async (req, res, next) => { + const workAliasesList = await getEntityAliases(res.locals.entity); + return res.status(200).send(workAliasesList); + }); + +const workIdentifierRelation = ['identifierSet.identifiers.type']; + +router.get('/:bbid/identifiers', + makeEntityLoader('Work', workIdentifierRelation, workError), + async (req, res, next) => { + const workIdentifiersList = await getEntityIdentifiers(res.locals.entity); + return res.status(200).send(workIdentifiersList); + }); export default router; diff --git a/src/common/helpers/utils.js b/src/common/helpers/utils.js new file mode 100644 index 000000000..80a76b27d --- /dev/null +++ b/src/common/helpers/utils.js @@ -0,0 +1,21 @@ + +// @flow + +/** + * Regular expression for valid BookBrainz UUIDs (bbid) + * + * @type {RegExp} + * @private + */ +const _bbidRegex = + /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/; + +/** + * Tests if a BookBrainz UUID is valid + * + * @param {string} bbid - BookBrainz UUID to validate + * @returns {boolean} - Returns true if BookBrainz UUID is valid + */ +export function isValidBBID(bbid: string): boolean { + return _bbidRegex.test(bbid); +} diff --git a/src/server/helpers/achievement.js b/src/server/helpers/achievement.js index 7c037e917..529bc7cf6 100644 --- a/src/server/helpers/achievement.js +++ b/src/server/helpers/achievement.js @@ -22,7 +22,7 @@ */ /* eslint prefer-spread: 1, prefer-reflect: 1, no-magic-numbers: 0 */ -import * as error from './error'; +import * as error from '../../common/helpers/error'; import Log from 'log'; import Promise from 'bluebird'; diff --git a/src/server/helpers/auth.js b/src/server/helpers/auth.js index a9a9efa26..1331cb036 100644 --- a/src/server/helpers/auth.js +++ b/src/server/helpers/auth.js @@ -18,7 +18,7 @@ */ import * as MusicBrainzOAuth from 'passport-musicbrainz-oauth2'; -import * as error from '../helpers/error'; +import * as error from '../../common/helpers/error'; import Log from 'log'; import _ from 'lodash'; diff --git a/src/server/helpers/handler.js b/src/server/helpers/handler.js index cff8a1221..a4e85046a 100644 --- a/src/server/helpers/handler.js +++ b/src/server/helpers/handler.js @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -import * as error from './error'; +import * as error from '../../common/helpers/error'; export function sendPromiseResult(res, promise, processingCallback) { diff --git a/src/server/helpers/middleware.js b/src/server/helpers/middleware.js index 9e7ac7191..52afa10bf 100644 --- a/src/server/helpers/middleware.js +++ b/src/server/helpers/middleware.js @@ -17,12 +17,14 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -import * as error from '../helpers/error'; +import * as commonUtils from '../../common/helpers/utils'; +import * as error from '../../common/helpers/error'; import * as utils from '../helpers/utils'; import Promise from 'bluebird'; import renderRelationship from '../helpers/render'; + function makeLoader(modelName, propName, sortFunc) { return function loaderFunc(req, res, next) { const model = req.app.locals.orm[modelName]; @@ -141,7 +143,7 @@ export function makeEntityLoader(modelName, additionalRels, errMessage) { return async (req, res, next, bbid) => { const {orm} = req.app.locals; - if (utils.isValidBBID(bbid)) { + if (commonUtils.isValidBBID(bbid)) { try { const entity = await orm.func.entity.getEntity(orm, modelName, bbid, relations); if (!entity.dataId) { diff --git a/src/server/helpers/search.js b/src/server/helpers/search.js index 7f12a76e5..fe4b84d32 100644 --- a/src/server/helpers/search.js +++ b/src/server/helpers/search.js @@ -16,6 +16,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +import * as commonUtils from '../../common/helpers/utils'; import * as utils from '../helpers/utils'; import ElasticSearch from 'elasticsearch'; @@ -149,7 +150,7 @@ async function _processEntityListForBulk(entityList) { export function autocomplete(orm, query, collection) { let queryBody = null; - if (utils.isValidBBID(query)) { + if (commonUtils.isValidBBID(query)) { queryBody = { ids: { values: [query] diff --git a/src/server/helpers/utils.js b/src/server/helpers/utils.js index 837ca6ec3..8e22be34e 100644 --- a/src/server/helpers/utils.js +++ b/src/server/helpers/utils.js @@ -108,25 +108,6 @@ export function getEntityModelByType(orm: Object, type: string): Object { return entityModels[type]; } -/** - * Regular expression for valid BookBrainz UUIDs (bbid) - * - * @type {RegExp} - * @private - */ -const _bbidRegex = - /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/; - -/** - * Tests if a BookBrainz UUID is valid - * - * @param {string} bbid - BookBrainz UUID to validate - * @returns {boolean} - Returns true if BookBrainz UUID is valid - */ -export function isValidBBID(bbid: string): boolean { - return _bbidRegex.test(bbid); -} - /** * Helper-function / template-tag that allows the values of an object that * is passed in at a later time to be interpolated into a diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index fde947278..9c37b8188 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -30,10 +30,11 @@ chai.should(); const aBBID = getRandomUUID(); const bBBID = getRandomUUID(); +const inValidBBID = 'akjd-adjjk-23123'; describe('GET /work', () => { - beforeEach(() => createWork(aBBID)); - afterEach(truncateEntities); + before(() => createWork(aBBID)); + after(truncateEntities); // Test to get basic information of a work it('should get basic information of work', async function () { const res = await chai.request(app).get(`/work/${aBBID}`); @@ -50,19 +51,12 @@ describe('GET /work', () => { ); }); - it('should return status 404, if work is not founded', async function () { - const res = await chai.request(app).get(`/work/${bBBID}`); - - res.should.have.status(404); - res.body.should.be.a('object'); - res.body.message.should.equal('This Work is not founded'); - }); - it('should return list of aliases of work', async function () { const res = await chai.request(app).get(`/work/${aBBID}/aliases`); res.should.have.status(200); res.body.should.be.a('object'); + res.body.aliases.should.be.a('array'); res.body.should.all.keys( 'bbid', 'aliases' @@ -74,9 +68,44 @@ describe('GET /work', () => { res.should.have.status(200); res.body.should.be.a('object'); + res.body.identifiers.should.be.a('array'); res.body.should.all.keys( 'bbid', 'identifiers' ); }); + + it('should throw a 404 error if trying to access a work that does not exist', async function () { + const res = await chai.request(app).get(`/work/${bBBID}`); + + res.should.have.status(404); + res.body.should.be.a('object'); + res.body.message.should.equal('Work not found'); + }); + + it('should throw a 406 error if trying to access a work with ivalid BBID', async function () { + const res = await chai.request(app).get(`/work/${inValidBBID}`); + + res.should.have.status(406); + res.body.should.be.a('object'); + res.body.message.should.equal('BBID is not valid uuid'); + }); + + it('should throw a 404 error if trying to identifiers aliases of a work that does not exist', async function () { + const res = await chai.request(app).get(`/work/${bBBID}/identifiers`); + + res.should.have.status(404); + res.body.should.be.a('object'); + res.body.message.should.equal('Work not found'); + }); + + + it('should throw a 404 error if trying to access aliases of a work that does not exist', async function () { + const res = await chai.request(app).get(`/work/${bBBID}/aliases`); + + res.should.have.status(404); + res.body.should.be.a('object'); + res.body.message.should.equal('Work not found'); + }); }); + From 89c9a8585106f9c8d566cf4b5882df11c7500b5f Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Fri, 7 Jun 2019 00:55:27 +0530 Subject: [PATCH 24/78] refactor: use expect instead of should to make consistecy on tests --- test/src/api/routes/test-work.js | 56 ++++++++++++++------------------ 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index 9c37b8188..0adde9e2a 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -25,7 +25,7 @@ import chaiHttp from 'chai-http'; chai.use(chaiHttp); -chai.should(); +const {expect} = chai; const aBBID = getRandomUUID(); @@ -38,10 +38,9 @@ describe('GET /work', () => { // Test to get basic information of a work it('should get basic information of work', async function () { const res = await chai.request(app).get(`/work/${aBBID}`); - - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.should.have.all.keys( + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body).to.have.all.keys( 'bbid', 'defaultAlias', 'languages', @@ -53,11 +52,10 @@ describe('GET /work', () => { it('should return list of aliases of work', async function () { const res = await chai.request(app).get(`/work/${aBBID}/aliases`); - - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.aliases.should.be.a('array'); - res.body.should.all.keys( + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.aliases).to.be.an('array'); + expect(res.body).to.have.all.keys( 'bbid', 'aliases' ); @@ -65,11 +63,10 @@ describe('GET /work', () => { it('should return list of identifiers of work', async function () { const res = await chai.request(app).get(`/work/${aBBID}/identifiers`); - - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.identifiers.should.be.a('array'); - res.body.should.all.keys( + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.identifiers).to.be.an('array'); + expect(res.body).to.have.all.keys( 'bbid', 'identifiers' ); @@ -77,35 +74,30 @@ describe('GET /work', () => { it('should throw a 404 error if trying to access a work that does not exist', async function () { const res = await chai.request(app).get(`/work/${bBBID}`); - - res.should.have.status(404); - res.body.should.be.a('object'); - res.body.message.should.equal('Work not found'); + expect(res.status).to.equal(404); + expect(res.body).to.be.an('object'); + expect(res.body.message).to.equal('Work not found'); }); - it('should throw a 406 error if trying to access a work with ivalid BBID', async function () { + it('should throw a 406 error if trying to access a work with invalid BBID', async function () { const res = await chai.request(app).get(`/work/${inValidBBID}`); - - res.should.have.status(406); - res.body.should.be.a('object'); - res.body.message.should.equal('BBID is not valid uuid'); + expect(res.status).to.equal(406); + expect(res.body.message).to.equal('BBID is not valid uuid'); }); it('should throw a 404 error if trying to identifiers aliases of a work that does not exist', async function () { const res = await chai.request(app).get(`/work/${bBBID}/identifiers`); - - res.should.have.status(404); - res.body.should.be.a('object'); - res.body.message.should.equal('Work not found'); + expect(res.status).to.equal(404); + expect(res.body).to.be.an('object'); + expect(res.body.message).to.equal('Work not found'); }); it('should throw a 404 error if trying to access aliases of a work that does not exist', async function () { const res = await chai.request(app).get(`/work/${bBBID}/aliases`); - - res.should.have.status(404); - res.body.should.be.a('object'); - res.body.message.should.equal('Work not found'); + expect(res.status).to.equal(404); + expect(res.body).to.be.an('object'); + expect(res.body.message).to.equal('Work not found'); }); }); From 67c393170594ace258e826f876e01de287354fd5 Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Fri, 7 Jun 2019 12:54:03 +0200 Subject: [PATCH 25/78] test: Testing CI setup for testing expected API errors --- test/src/api/routes/test-work.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index 0adde9e2a..38f1e29ac 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -73,10 +73,19 @@ describe('GET /work', () => { }); it('should throw a 404 error if trying to access a work that does not exist', async function () { - const res = await chai.request(app).get(`/work/${bBBID}`); - expect(res.status).to.equal(404); - expect(res.body).to.be.an('object'); - expect(res.body.message).to.equal('Work not found'); + try { + const res = await chai.request(app).get(`/work/${bBBID}`); + expect(res).to.have.status(404); + expect(res.body).to.be.an('object'); + expect(res.body.message).to.equal('Work not found'); + } + catch ({response}) { + // Chai-http promise throws in CI, so we catch it here and test for it. + expect(response).to.have.status(404); + expect(response.body).to.be.an('object'); + expect(response.body.success).to.equal(false); + expect(response.body.errors[0]).to.equal('Work not found'); + } }); it('should throw a 406 error if trying to access a work with invalid BBID', async function () { From cd370bf1538a97b02c7fdda875ed9731dfe812d8 Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Fri, 7 Jun 2019 13:19:14 +0200 Subject: [PATCH 26/78] test: Trying another method to test expected API errors --- test/src/api/routes/test-work.js | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index 38f1e29ac..f72ce6f93 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -72,20 +72,17 @@ describe('GET /work', () => { ); }); - it('should throw a 404 error if trying to access a work that does not exist', async function () { - try { - const res = await chai.request(app).get(`/work/${bBBID}`); - expect(res).to.have.status(404); - expect(res.body).to.be.an('object'); - expect(res.body.message).to.equal('Work not found'); - } - catch ({response}) { - // Chai-http promise throws in CI, so we catch it here and test for it. - expect(response).to.have.status(404); - expect(response.body).to.be.an('object'); - expect(response.body.success).to.equal(false); - expect(response.body.errors[0]).to.equal('Work not found'); - } + it('should throw a 404 error if trying to access a work that does not exist', function (done) { + chai.request(app) + .get(`/work/${bBBID}`) + .end(function (err, res) { + if (err) { return done(err); } + expect(res).to.have.status(404); + expect(res.ok).to.be.false; + expect(res.body).to.be.an('object'); + expect(res.body.message).to.equal('Work not found'); + return done(); + }); }); it('should throw a 406 error if trying to access a work with invalid BBID', async function () { From cc0288d7e1bd3e204a0c276dfd034c8314f09cfd Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Sun, 9 Jun 2019 00:03:58 +0530 Subject: [PATCH 27/78] refactor: modify work tests to pass in CI --- test/src/api/routes/test-work.js | 47 ++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index f72ce6f93..96c7290dc 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -85,25 +85,44 @@ describe('GET /work', () => { }); }); - it('should throw a 406 error if trying to access a work with invalid BBID', async function () { - const res = await chai.request(app).get(`/work/${inValidBBID}`); - expect(res.status).to.equal(406); - expect(res.body.message).to.equal('BBID is not valid uuid'); + it('should throw a 406 error if trying to access a work with invalid BBID', function (done) { + chai.request(app) + .get(`/work/${inValidBBID}`) + .end(function (err, res) { + if (err) { return done(err); } + expect(res).to.have.status(406); + expect(res.ok).to.be.false; + expect(res.body).to.be.an('object'); + expect(res.body.message).to.equal('BBID is not valid uuid'); + return done(); + }); }); - it('should throw a 404 error if trying to identifiers aliases of a work that does not exist', async function () { - const res = await chai.request(app).get(`/work/${bBBID}/identifiers`); - expect(res.status).to.equal(404); - expect(res.body).to.be.an('object'); - expect(res.body.message).to.equal('Work not found'); + it('should throw a 404 error if trying to identifiers aliases of a work that does not exist', function (done) { + chai.request(app) + .get(`/work/${bBBID}/identifiers`) + .end(function (err, res) { + if (err) { return done(err); } + expect(res).to.have.status(404); + expect(res.ok).to.be.false; + expect(res.body).to.be.an('object'); + expect(res.body.message).to.equal('Work not found'); + return done(); + }); }); - it('should throw a 404 error if trying to access aliases of a work that does not exist', async function () { - const res = await chai.request(app).get(`/work/${bBBID}/aliases`); - expect(res.status).to.equal(404); - expect(res.body).to.be.an('object'); - expect(res.body.message).to.equal('Work not found'); + it('should throw a 404 error if trying to access aliases of a work that does not exist', function (done) { + chai.request(app) + .get(`/work/${bBBID}/aliases`) + .end(function (err, res) { + if (err) { return done(err); } + expect(res).to.have.status(404); + expect(res.ok).to.be.false; + expect(res.body).to.be.an('object'); + expect(res.body.message).to.equal('Work not found'); + return done(); + }); }); }); From 08380983c84b3c8dae71852a2f0841fbab94e733 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Sun, 9 Jun 2019 00:09:27 +0530 Subject: [PATCH 28/78] feat: add new endpoints for lookup of editions --- src/api/helpers/formatEntityData.js | 39 +++++++++++--- src/api/routes.js | 6 +++ src/api/routes/edition.js | 63 ++++++++++++++++++++++ test/src/api/routes/test-edition.js | 81 +++++++++++++++++++++++++++++ 4 files changed, 183 insertions(+), 6 deletions(-) create mode 100644 src/api/routes/edition.js create mode 100644 test/src/api/routes/test-edition.js diff --git a/src/api/helpers/formatEntityData.js b/src/api/helpers/formatEntityData.js index b0ce9b6b1..cff459054 100644 --- a/src/api/helpers/formatEntityData.js +++ b/src/api/helpers/formatEntityData.js @@ -19,22 +19,49 @@ /* eslint-disable */ import _ from 'lodash'; +function getDefaultAlias(entity: object){ + return { + name: _.get(entity, 'defaultAlias.name', null), + sortName: _.get(entity, 'defaultAlias.sortName', null), + aliasLanguage: _.get(entity, 'defaultAlias.language.name', null) + } +} + +function getLanguages(entity: object) { + return _.get(entity, 'languageSet.languages', []).map((language) => language.name) +} + export function getWorkBasicInfo(work: object) { return _.isNil(work) ? null : { bbid: _.get(work, 'bbid', null), - defaultAlias: { - name: _.get(work, 'defaultAlias.name', null), - sortName: _.get(work, 'defaultAlias.sortName', null), - aliasLanguage: _.get(work, 'defaultAlias.language.name', null) - }, + defaultAlias: getDefaultAlias(work), disambiguation: _.get(work, 'disambiguation.comment', null), - languages: _.get(work, 'languageSet.languages', []).map((language) => language.name), + languages: getLanguages(work), workType: _.get(work, 'workType.label', null), entityType: _.get(work, 'type', null) }; } +export function getEditionBasicInfo(edition: object) { + + return _.isNil(edition) ? null : + { + bbid: _.get(edition, 'bbid', null), + defaultAlias: getDefaultAlias(edition), + languages: getLanguages(edition), + disambiguation: _.get(edition, 'disambiguation.comment', null), + hight: _.get(edition, 'hight', null), + width: _.get(edition, 'width', null), + depth: _.get(edition, 'depth', null), + pages: _.get(edition, 'pages', null), + releaseEventDates: _.get(edition, 'releaseEventSet.releaseEvents', []).map((event) => event.date), + editionFormat: _.get(edition, 'editioFormat.label', null), + weight: _.get(edition, 'waight', null), + status: _.get(edition, 'editionStatus.label', null) + } +} + export function getEntityAliases(work: object) { return _.isNil(work) ? null : { diff --git a/src/api/routes.js b/src/api/routes.js index cd87c9fe2..3258231c6 100644 --- a/src/api/routes.js +++ b/src/api/routes.js @@ -17,6 +17,7 @@ */ +import editionRouter from './routes/edition'; import workRouter from './routes/work'; @@ -24,9 +25,14 @@ function initWorkRoute(app) { app.use('/work', workRouter); } +function initEditionRoute(app) { + app.use('/edition', editionRouter); +} + function initRoutes(app) { initWorkRoute(app); + initEditionRoute(app); } export default initRoutes; diff --git a/src/api/routes/edition.js b/src/api/routes/edition.js new file mode 100644 index 000000000..c53bc2903 --- /dev/null +++ b/src/api/routes/edition.js @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {getEditionBasicInfo, getEntityAliases, getEntityIdentifiers} from '../helpers/formatEntityData'; +import _ from 'lodash'; +import express from 'express'; +import {makeEntityLoader} from '../helpers/entityLoader'; + + +const router = express.Router(); + +const editionBasicRelations = [ + 'defaultAlias.language', + 'languageSet.languages', + 'disambiguation', + 'editionFormat', + 'editionStatus', + 'releaseEventSet.releaseEvents' +]; + +const editionError = 'Edition not found'; + +router.get('/:bbid', + makeEntityLoader('Edition', editionBasicRelations, editionError), + async (req, res, next) => { + const editionBasicInfo = await getEditionBasicInfo(res.locals.entity); + return res.status(200).send(editionBasicInfo); + }); + +const editionAliasRelation = ['aliasSet.aliases.language']; + +router.get('/:bbid/aliases', + makeEntityLoader('Edition', editionAliasRelation, editionError), + async (req, res, next) => { + const editionAliasesList = await getEntityAliases(res.locals.entity); + return res.status(200).send(editionAliasesList); + }); + +const editionIdentifierRelation = ['identifierSet.identifiers.type']; + +router.get('/:bbid/identifiers', + makeEntityLoader('Edition', editionIdentifierRelation, editionError), + async (req, res, next) => { + const editionIdentifiersList = await getEntityIdentifiers(res.locals.entity); + return res.status(200).send(editionIdentifiersList); + }); + +export default router; diff --git a/test/src/api/routes/test-edition.js b/test/src/api/routes/test-edition.js new file mode 100644 index 000000000..0fa9132eb --- /dev/null +++ b/test/src/api/routes/test-edition.js @@ -0,0 +1,81 @@ +/* eslint-disable prefer-arrow-callback,func-names */ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {createEdition, getRandomUUID, truncateEntities} from '../../../test-helpers/create-entities'; + +import app from '../../../../src/api/app'; +import chai from 'chai'; +import chaiHttp from 'chai-http'; + + +chai.use(chaiHttp); +const {expect} = chai; + + +const aBBID = getRandomUUID(); +const bBBID = getRandomUUID(); +const inValidBBID = 'akjd-adjjk-23123'; + +describe('GET /Edition', () => { + before(() => createEdition(aBBID)); + after(truncateEntities); + // Test to get basic information of a work + it('should get basic information of edition', async function () { + const res = await chai.request(app).get(`/edition/${aBBID}`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body).to.have.all.keys( + 'bbid', + 'defaultAlias', + 'languages', + 'disambiguation', + 'editionFormat', + 'hight', + 'width', + 'depth', + 'pages', + 'status', + 'releaseEventDates', + 'weight' + ); + }); + + it('should return list of aliases of Edition', async function () { + const res = await chai.request(app).get(`/edition/${aBBID}/aliases`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.aliases).to.be.an('array'); + expect(res.body).to.have.all.keys( + 'bbid', + 'aliases' + ); + }); + + it('should return list of identifiers of edition', async function () { + const res = await chai.request(app).get(`/edition/${aBBID}/identifiers`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.identifiers).to.be.an('array'); + expect(res.body).to.have.all.keys( + 'bbid', + 'identifiers' + ); + }); +}); + From 2da5a768c155ae9fd8e31dffc1feb94fdcbe3c23 Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Wed, 12 Jun 2019 17:26:08 +0200 Subject: [PATCH 29/78] fix: Fix BB-347 remedy null date for Editions without a releaseDate --- src/client/entity-editor/common/new-date-field.js | 3 ++- src/client/entity-editor/edition-section/edition-section.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/client/entity-editor/common/new-date-field.js b/src/client/entity-editor/common/new-date-field.js index f43a277f7..73e3d7860 100644 --- a/src/client/entity-editor/common/new-date-field.js +++ b/src/client/entity-editor/common/new-date-field.js @@ -143,7 +143,7 @@ class DateField extends React.Component { } DateField.propTypes = { - defaultValue: PropTypes.object.isRequired, + defaultValue: PropTypes.object, empty: PropTypes.bool.isRequired, error: PropTypes.bool.isRequired, errorMessage: PropTypes.string, @@ -152,6 +152,7 @@ DateField.propTypes = { show: PropTypes.bool.isRequired }; DateField.defaultProps = { + defaultValue: {day: '', month: '', year: ''}, errorMessage: null }; diff --git a/src/client/entity-editor/edition-section/edition-section.js b/src/client/entity-editor/edition-section/edition-section.js index 3152d3d04..9d1d682f7 100644 --- a/src/client/entity-editor/edition-section/edition-section.js +++ b/src/client/entity-editor/edition-section/edition-section.js @@ -236,7 +236,7 @@ function EditionSection({ Date: Wed, 12 Jun 2019 22:56:03 +0530 Subject: [PATCH 30/78] feat: add lookup endpoints for edition-group and author with basic tests --- src/api/helpers/formatEntityData.js | 26 ++++++++ src/api/routes.js | 13 +++- src/api/routes/author.js | 63 ++++++++++++++++++ src/api/routes/edition-group.js | 60 +++++++++++++++++ test/src/api/routes/test-author.js | 79 +++++++++++++++++++++++ test/src/api/routes/test-edition-group.js | 73 +++++++++++++++++++++ test/src/api/routes/test-edition.js | 2 +- test/test-helpers/create-entities.js | 44 ++++++++++++- 8 files changed, 357 insertions(+), 3 deletions(-) create mode 100644 src/api/routes/author.js create mode 100644 src/api/routes/edition-group.js create mode 100644 test/src/api/routes/test-author.js create mode 100644 test/src/api/routes/test-edition-group.js diff --git a/src/api/helpers/formatEntityData.js b/src/api/helpers/formatEntityData.js index cff459054..d2dd56ed3 100644 --- a/src/api/helpers/formatEntityData.js +++ b/src/api/helpers/formatEntityData.js @@ -62,6 +62,32 @@ export function getEditionBasicInfo(edition: object) { } } +export function getEditionGroupBasicInfo(editionGroup: object) { + return _.isNil(editionGroup) ? null : + { + bbid: _.get(editionGroup, 'bbid', null), + defaultAlias: getDefaultAlias(editionGroup), + disambiguation: _.get(editionGroup, 'disambiguation.comment', null), + type: _.get(editionGroup, 'editionGroupType.label') + } +} + +export function getAuthorBasicInfo(author: object) { + return _.isNil(author) ? null : + { + bbid: _.get(author, 'bbid', null), + defaultAlias: getDefaultAlias(author), + disambiguation: _.get(author, 'disambiguation.comment', null), + type: _.get(author, 'authorType.label', null), + gender: _.get(author, 'gender.name', null), + beginArea: _.get(author, 'beginArea.name', null), + beginDate: _.get(author, 'beginDate', null), + ended: _.get(author, 'ended', null), + endArea: _.get(author, 'endArea.name', null), + endDate: _.get(author, 'endDate', null) + } +} + export function getEntityAliases(work: object) { return _.isNil(work) ? null : { diff --git a/src/api/routes.js b/src/api/routes.js index 3258231c6..725087ed7 100644 --- a/src/api/routes.js +++ b/src/api/routes.js @@ -16,7 +16,8 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - +import authorRouter from './routes/author'; +import editionGroupRouter from './routes/edition-group'; import editionRouter from './routes/edition'; import workRouter from './routes/work'; @@ -29,10 +30,20 @@ function initEditionRoute(app) { app.use('/edition', editionRouter); } +function initEditionGroupRoute(app) { + app.use('/edition-group', editionGroupRouter); +} + +function initAuthorRoute(app) { + app.use('/author', authorRouter); +} + function initRoutes(app) { initWorkRoute(app); initEditionRoute(app); + initEditionGroupRoute(app); + initAuthorRoute(app); } export default initRoutes; diff --git a/src/api/routes/author.js b/src/api/routes/author.js new file mode 100644 index 000000000..97e90e815 --- /dev/null +++ b/src/api/routes/author.js @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {getAuthorBasicInfo, getEntityAliases, getEntityIdentifiers} from '../helpers/formatEntityData'; +import _ from 'lodash'; +import express from 'express'; +import {makeEntityLoader} from '../helpers/entityLoader'; + + +const router = express.Router(); + +const authorBasicRelations = [ + 'defaultAlias.language', + 'disambiguation', + 'authorType', + 'gender', + 'beginArea', + 'endArea' +]; + +const authorError = 'Author not found'; + +router.get('/:bbid', + makeEntityLoader('Author', authorBasicRelations, authorError), + async (req, res, next) => { + const authorBasicInfo = await getAuthorBasicInfo(res.locals.entity); + return res.status(200).send(authorBasicInfo); + }); + +const authorAliasRelation = ['aliasSet.aliases.language']; + +router.get('/:bbid/aliases', + makeEntityLoader('Author', authorAliasRelation, authorError), + async (req, res, next) => { + const authorAliasesList = await getEntityAliases(res.locals.entity); + return res.status(200).send(authorAliasesList); + }); + +const authorIdentifierRelation = ['identifierSet.identifiers.type']; + +router.get('/:bbid/identifiers', + makeEntityLoader('Author', authorIdentifierRelation, authorError), + async (req, res, next) => { + const authorIdentifiersList = await getEntityIdentifiers(res.locals.entity); + return res.status(200).send(authorIdentifiersList); + }); + +export default router; diff --git a/src/api/routes/edition-group.js b/src/api/routes/edition-group.js new file mode 100644 index 000000000..d891f456a --- /dev/null +++ b/src/api/routes/edition-group.js @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {getEditionGroupBasicInfo, getEntityAliases, getEntityIdentifiers} from '../helpers/formatEntityData'; +import _ from 'lodash'; +import express from 'express'; +import {makeEntityLoader} from '../helpers/entityLoader'; + + +const router = express.Router(); + +const editionGroupBasicRelations = [ + 'defaultAlias.language', + 'disambiguation', + 'editionGroupType' +]; + +const editionGroupError = 'Edition-Group not found'; + +router.get('/:bbid', + makeEntityLoader('EditionGroup', editionGroupBasicRelations, editionGroupError), + async (req, res, next) => { + const editionGroupBasicInfo = await getEditionGroupBasicInfo(res.locals.entity); + return res.status(200).send(editionGroupBasicInfo); + }); + +const editionGroupAliasRelation = ['aliasSet.aliases.language']; + +router.get('/:bbid/aliases', + makeEntityLoader('EditionGroup', editionGroupAliasRelation, editionGroupError), + async (req, res, next) => { + const editionAliasesList = await getEntityAliases(res.locals.entity); + return res.status(200).send(editionAliasesList); + }); + +const editionGroupIdentifierRelation = ['identifierSet.identifiers.type']; + +router.get('/:bbid/identifiers', + makeEntityLoader('EditionGroup', editionGroupIdentifierRelation, editionGroupError), + async (req, res, next) => { + const editionGroupIdentifiersList = await getEntityIdentifiers(res.locals.entity); + return res.status(200).send(editionGroupIdentifiersList); + }); + +export default router; diff --git a/test/src/api/routes/test-author.js b/test/src/api/routes/test-author.js new file mode 100644 index 000000000..25f85d508 --- /dev/null +++ b/test/src/api/routes/test-author.js @@ -0,0 +1,79 @@ +/* eslint-disable prefer-arrow-callback,func-names */ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {createAuthor, getRandomUUID, truncateEntities} from '../../../test-helpers/create-entities'; + +import app from '../../../../src/api/app'; +import chai from 'chai'; +import chaiHttp from 'chai-http'; + + +chai.use(chaiHttp); +const {expect} = chai; + + +const aBBID = getRandomUUID(); +const bBBID = getRandomUUID(); +const inValidBBID = 'akjd-adjjk-23123'; + +describe('GET /Author', () => { + before(() => createAuthor(aBBID)); + after(truncateEntities); + // Test to get basic information of an author + it('should get basic information of an author', async function () { + const res = await chai.request(app).get(`/author/${aBBID}`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body).to.have.all.keys( + 'bbid', + 'defaultAlias', + 'disambiguation', + 'type', + 'gender', + 'beginArea', + 'beginDate', + 'endArea', + 'endDate', + 'ended' + ); + }); + + it('should return list of aliases of an author', async function () { + const res = await chai.request(app).get(`/author/${aBBID}/aliases`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.aliases).to.be.an('array'); + expect(res.body).to.have.all.keys( + 'bbid', + 'aliases' + ); + }); + + it('should return list of identifiers of an author', async function () { + const res = await chai.request(app).get(`/author/${aBBID}/identifiers`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.identifiers).to.be.an('array'); + expect(res.body).to.have.all.keys( + 'bbid', + 'identifiers' + ); + }); +}); + diff --git a/test/src/api/routes/test-edition-group.js b/test/src/api/routes/test-edition-group.js new file mode 100644 index 000000000..3078d8760 --- /dev/null +++ b/test/src/api/routes/test-edition-group.js @@ -0,0 +1,73 @@ +/* eslint-disable prefer-arrow-callback,func-names */ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {createEditionGroup, getRandomUUID, truncateEntities} from '../../../test-helpers/create-entities'; + +import app from '../../../../src/api/app'; +import chai from 'chai'; +import chaiHttp from 'chai-http'; + + +chai.use(chaiHttp); +const {expect} = chai; + + +const aBBID = getRandomUUID(); +const bBBID = getRandomUUID(); +const inValidBBID = 'akjd-adjjk-23123'; + +describe('GET /EditionGroup', () => { + before(() => createEditionGroup(aBBID)); + after(truncateEntities); + // Test to get basic information of an Edition Group + it('should get basic information of edition group', async function () { + const res = await chai.request(app).get(`/edition-group/${aBBID}`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body).to.have.all.keys( + 'bbid', + 'defaultAlias', + 'disambiguation', + 'type' + ); + }); + + it('should return list of aliases of Edition Group', async function () { + const res = await chai.request(app).get(`/edition-group/${aBBID}/aliases`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.aliases).to.be.an('array'); + expect(res.body).to.have.all.keys( + 'bbid', + 'aliases' + ); + }); + + it('should return list of identifiers of edition group', async function () { + const res = await chai.request(app).get(`/edition-group/${aBBID}/identifiers`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.identifiers).to.be.an('array'); + expect(res.body).to.have.all.keys( + 'bbid', + 'identifiers' + ); + }); +}); + diff --git a/test/src/api/routes/test-edition.js b/test/src/api/routes/test-edition.js index 0fa9132eb..d2f89854b 100644 --- a/test/src/api/routes/test-edition.js +++ b/test/src/api/routes/test-edition.js @@ -35,7 +35,7 @@ const inValidBBID = 'akjd-adjjk-23123'; describe('GET /Edition', () => { before(() => createEdition(aBBID)); after(truncateEntities); - // Test to get basic information of a work + // Test to get basic information of an Edition it('should get basic information of edition', async function () { const res = await chai.request(app).get(`/edition/${aBBID}`); expect(res.status).to.equal(200); diff --git a/test/test-helpers/create-entities.js b/test/test-helpers/create-entities.js index a406d4725..fe0246da6 100644 --- a/test/test-helpers/create-entities.js +++ b/test/test-helpers/create-entities.js @@ -26,7 +26,7 @@ const { Alias, AliasSet, Identifier, IdentifierType, IdentifierSet, Disambiguation, Entity, Annotation, Gender, Author, Edition, EditionGroup, Publisher, Work, - Language, WorkType + Language, WorkType, EditionGroupType, AuthorType } = orm; const {updateLanguageSet} = orm.func.language; @@ -193,6 +193,46 @@ export async function createWork(optionalBBID) { .save(null, {method: 'insert'}); } +export async function createEditionGroup(optionalBBID) { + const bbid = optionalBBID || uuidv4(); + await createEntityPrerequisites(); + const editionGroupAttribs = { + bbid, + typeId: setData.id + }; + await new EditionGroupType({...setData, label: 'Edition Group Type 1'}) + .save(null, {method: 'insert'}); + await new Entity({bbid, type: 'EditionGroup'}) + .save(null, {method: 'insert'}); + await new EditionGroup({...entityAttribs, ...editionGroupAttribs}) + .save(null, {method: 'insert'}); +} + +export async function createAuthor(optionalBBID) { + const bbid = optionalBBID || uuidv4(); + await createEntityPrerequisites(); + const authorAttribs = { + bbid, + beginAreaId: setData.id, + beginDay: 25, + beginMonth: 12, + beginYear: 2000, + endAreaId: setData.id, + endDay: 10, + endMonth: 5, + endYear: 2012, + ended: true, + genderId: setData.id, + typeId: setData.id + }; + await new AuthorType({...setData, label: 'Author Type 1'}) + .save(null, {method: 'insert'}); + await new Entity({bbid, type: 'Author'}) + .save(null, {method: 'insert'}); + await new Author({...entityAttribs, ...authorAttribs}) + .save(null, {method: 'insert'}); +} + export function truncateEntities() { return util.truncateTables(bookshelf, [ 'bookbrainz.editor', @@ -209,6 +249,8 @@ export function truncateEntities() { 'bookbrainz.revision', 'bookbrainz.annotation', 'bookbrainz.work_type', + 'bookbrainz.edition_group_type', + 'bookbrainz.author_type', 'musicbrainz.language', 'musicbrainz.gender' ]); From be73044d1d590f899995d865b437f4aafbd83c7b Mon Sep 17 00:00:00 2001 From: code-master5 Date: Wed, 5 Jun 2019 10:09:36 +0530 Subject: [PATCH 31/78] fix: fix BB-341 disable login and register links when redis is down --- src/client/components/pages/index.js | 11 +++++++++-- src/client/containers/layout.js | 9 ++++++--- src/server/app.js | 4 ++-- src/server/routes/index.js | 12 +++++++++++- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/client/components/pages/index.js b/src/client/components/pages/index.js index 70e2d2fd4..40171871e 100644 --- a/src/client/components/pages/index.js +++ b/src/client/components/pages/index.js @@ -166,6 +166,7 @@ class IndexPage extends React.Component { renderContent() { const {recent} = this.props; + const disableSignUp = this.props.disableSignUp ? {'disabled' : true} : {}; return ( @@ -205,7 +206,12 @@ class IndexPage extends React.Component {
-
@@ -254,7 +260,8 @@ class IndexPage extends React.Component { IndexPage.displayName = 'IndexPage'; IndexPage.propTypes = { - recent: PropTypes.array.isRequired + recent: PropTypes.array.isRequired, + disableSignUp: PropTypes.bool }; export default IndexPage; diff --git a/src/client/containers/layout.js b/src/client/containers/layout.js index 3b0d274ec..4904ef4b1 100644 --- a/src/client/containers/layout.js +++ b/src/client/containers/layout.js @@ -109,6 +109,8 @@ class Layout extends React.Component { ); + const disableSignUp = this.props.disableSignUp ? {'disabled' : true} : {}; + return ( {user && user.id ? @@ -154,7 +156,7 @@ class Layout extends React.Component { name="info" />{' Profile'} - + : @@ -283,7 +285,8 @@ Layout.propTypes = { repositoryUrl: PropTypes.string.isRequired, requiresJS: PropTypes.bool, siteRevision: PropTypes.string.isRequired, - user: PropTypes.object + user: PropTypes.object, + disableSignUp: PropTypes.bool }; Layout.defaultProps = { hideSearch: false, diff --git a/src/server/app.js b/src/server/app.js index d1188b44b..72ac065ff 100644 --- a/src/server/app.js +++ b/src/server/app.js @@ -132,8 +132,8 @@ app.use((req, res, next) => { if (!req.session || !authInitiated) { res.locals.alerts.push({ level: 'danger', - message: 'We are currently experiencing technical difficulties; ' + - 'signing in will not work until this is resolved.' + message: `We are currently experiencing technical difficulties; + signing in and signing up are disabled until this is resolved.` }); } diff --git a/src/server/routes/index.js b/src/server/routes/index.js index fd9432d08..b19a84127 100644 --- a/src/server/routes/index.js +++ b/src/server/routes/index.js @@ -52,15 +52,25 @@ router.get('/', async (req, res, next) => { requireJS: Boolean(res.locals.user) }); + const disableSignUp = props.alerts.some( + alert => alert.message.includes( + 'signing in and signing up are disabled' + ) + ); + /* * Renders react components server side and injects markup into target * file object spread injects the app.locals variables into React as * props */ const markup = ReactDOMServer.renderToString( - + ); From d89053dbf40daf78dfab260dcb13cce88ef65b14 Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Mon, 10 Jun 2019 20:15:22 +0200 Subject: [PATCH 32/78] css: Changed disabled navbar button style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It was previously the same colour for the text and background… --- src/client/stylesheets/style.less | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/client/stylesheets/style.less b/src/client/stylesheets/style.less index 3cb2be8d4..3c8122eaf 100644 --- a/src/client/stylesheets/style.less +++ b/src/client/stylesheets/style.less @@ -39,9 +39,16 @@ The production configuration for webpack needs to be finalized before using this /* Modifications to Lobes */ /* ====================== */ @brand-secondary: @bookbrainz; +@disabled-bg: lighten(desaturate(@bookbrainz,10%),42%); +@disabled-color: lighten(@disabled-bg,15%); + .navbar.BookBrainz { background: rgba(255, 255, 255, 0.9); margin-bottom: 0px; + .nav.navbar-nav > .disabled > a { + color: @disabled-color; + background: @disabled-bg; + } } .navbar-collapse { From 139255b75f9f7ef39bcb30fa5645a4dac4234767 Mon Sep 17 00:00:00 2001 From: code-master5 Date: Thu, 13 Jun 2019 12:28:30 +0530 Subject: [PATCH 33/78] style(display): fixed lint issues --- src/client/components/pages/index.js | 9 ++++++--- src/client/containers/layout.js | 7 ++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/client/components/pages/index.js b/src/client/components/pages/index.js index 40171871e..5ccbb6085 100644 --- a/src/client/components/pages/index.js +++ b/src/client/components/pages/index.js @@ -166,7 +166,7 @@ class IndexPage extends React.Component { renderContent() { const {recent} = this.props; - const disableSignUp = this.props.disableSignUp ? {'disabled' : true} : {}; + const disableSignUp = this.props.disableSignUp ? {disabled: true} : {}; return ( @@ -260,8 +260,11 @@ class IndexPage extends React.Component { IndexPage.displayName = 'IndexPage'; IndexPage.propTypes = { - recent: PropTypes.array.isRequired, - disableSignUp: PropTypes.bool + disableSignUp: PropTypes.bool, + recent: PropTypes.array.isRequired +}; +IndexPage.defaultProps = { + disableSignUp: false }; export default IndexPage; diff --git a/src/client/containers/layout.js b/src/client/containers/layout.js index 4904ef4b1..9e3ef6ae0 100644 --- a/src/client/containers/layout.js +++ b/src/client/containers/layout.js @@ -109,7 +109,7 @@ class Layout extends React.Component { ); - const disableSignUp = this.props.disableSignUp ? {'disabled' : true} : {}; + const disableSignUp = this.props.disableSignUp ? {disabled: true} : {}; return ( @@ -280,15 +280,16 @@ Layout.displayName = 'Layout'; Layout.propTypes = { alerts: PropTypes.array.isRequired, children: PropTypes.node.isRequired, + disableSignUp: PropTypes.bool, hideSearch: PropTypes.bool, homepage: PropTypes.bool, repositoryUrl: PropTypes.string.isRequired, requiresJS: PropTypes.bool, siteRevision: PropTypes.string.isRequired, - user: PropTypes.object, - disableSignUp: PropTypes.bool + user: PropTypes.object }; Layout.defaultProps = { + disableSignUp: false, hideSearch: false, homepage: false, requiresJS: false, From 09ed1499b69cde81324177bef058d105013cfd58 Mon Sep 17 00:00:00 2001 From: code-master5 Date: Thu, 13 Jun 2019 12:33:42 +0530 Subject: [PATCH 34/78] fix: disable signup/login if redis down --- src/server/app.js | 2 ++ src/server/routes/index.js | 10 ++-------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/server/app.js b/src/server/app.js index 72ac065ff..fbb887d9e 100644 --- a/src/server/app.js +++ b/src/server/app.js @@ -128,6 +128,7 @@ app.use((req, res, next) => { res.locals.siteRevision = siteRevision; res.locals.repositoryUrl = repositoryUrl; res.locals.alerts = []; + req.signUpDisabled = false; if (!req.session || !authInitiated) { res.locals.alerts.push({ @@ -135,6 +136,7 @@ app.use((req, res, next) => { message: `We are currently experiencing technical difficulties; signing in and signing up are disabled until this is resolved.` }); + req.signUpDisabled = true; } // Add user data to every rendered route diff --git a/src/server/routes/index.js b/src/server/routes/index.js index b19a84127..803af8f7d 100644 --- a/src/server/routes/index.js +++ b/src/server/routes/index.js @@ -52,12 +52,6 @@ router.get('/', async (req, res, next) => { requireJS: Boolean(res.locals.user) }); - const disableSignUp = props.alerts.some( - alert => alert.message.includes( - 'signing in and signing up are disabled' - ) - ); - /* * Renders react components server side and injects markup into target * file object spread injects the app.locals variables into React as @@ -66,11 +60,11 @@ router.get('/', async (req, res, next) => { const markup = ReactDOMServer.renderToString( ); From 66099ebbc261bb00546e7555349e42c52418fcb6 Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Thu, 13 Jun 2019 14:06:11 +0200 Subject: [PATCH 35/78] tests: Added Area when creating Author test entity --- test/test-helpers/create-entities.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/test-helpers/create-entities.js b/test/test-helpers/create-entities.js index fe0246da6..76da8f2b6 100644 --- a/test/test-helpers/create-entities.js +++ b/test/test-helpers/create-entities.js @@ -23,7 +23,7 @@ import uuidv4 from 'uuid/v4'; const { bookshelf, util, Editor, EditorType, Revision, RelationshipSet, - Alias, AliasSet, Identifier, IdentifierType, IdentifierSet, + Alias, AliasSet, Area, Identifier, IdentifierType, IdentifierSet, Disambiguation, Entity, Annotation, Gender, Author, Edition, EditionGroup, Publisher, Work, Language, WorkType, EditionGroupType, AuthorType @@ -225,6 +225,8 @@ export async function createAuthor(optionalBBID) { genderId: setData.id, typeId: setData.id }; + await new Area({...setData, gid: uuidv4(), name: 'Rlyeh'}) + .save(null, {method: 'insert'}); await new AuthorType({...setData, label: 'Author Type 1'}) .save(null, {method: 'insert'}); await new Entity({bbid, type: 'Author'}) From d148968cbca29810254d6fbb623efe06de0f3d5a Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Thu, 13 Jun 2019 23:07:54 +0530 Subject: [PATCH 36/78] feat: add publisher endpoints for lookup --- src/api/helpers/formatEntityData.js | 14 +++++ src/api/routes.js | 6 +++ src/api/routes/publisher.js | 61 +++++++++++++++++++++ test/src/api/routes/test-publisher.js | 77 +++++++++++++++++++++++++++ test/test-helpers/create-entities.js | 29 +++++++++- 5 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 src/api/routes/publisher.js create mode 100644 test/src/api/routes/test-publisher.js diff --git a/src/api/helpers/formatEntityData.js b/src/api/helpers/formatEntityData.js index d2dd56ed3..e529fd864 100644 --- a/src/api/helpers/formatEntityData.js +++ b/src/api/helpers/formatEntityData.js @@ -88,6 +88,20 @@ export function getAuthorBasicInfo(author: object) { } } +export function getPublisherBasicInfo(publisher: object) { + return _.isNil(publisher) ? null : + { + bbid: _.get(publisher, 'bbid', null), + defaultAlias: getDefaultAlias(publisher), + disambiguation: _.get(publisher, 'disambiguation.comment', null), + type: _.get(publisher, 'publisherType.label', null), + area: _.get(publisher, 'area.name', null), + beginDate: _.get(publisher, 'beginDate', null), + ended: _.get(publisher, 'ended', null), + endDate: _.get(publisher, 'endDate', null) + } +} + export function getEntityAliases(work: object) { return _.isNil(work) ? null : { diff --git a/src/api/routes.js b/src/api/routes.js index 725087ed7..63ac2154d 100644 --- a/src/api/routes.js +++ b/src/api/routes.js @@ -19,6 +19,7 @@ import authorRouter from './routes/author'; import editionGroupRouter from './routes/edition-group'; import editionRouter from './routes/edition'; +import publisherRouter from './routes/publisher'; import workRouter from './routes/work'; @@ -38,12 +39,17 @@ function initAuthorRoute(app) { app.use('/author', authorRouter); } +function initPublishetRouter(app) { + app.use('/publisher', publisherRouter); +} + function initRoutes(app) { initWorkRoute(app); initEditionRoute(app); initEditionGroupRoute(app); initAuthorRoute(app); + initPublishetRouter(app); } export default initRoutes; diff --git a/src/api/routes/publisher.js b/src/api/routes/publisher.js new file mode 100644 index 000000000..c3972a036 --- /dev/null +++ b/src/api/routes/publisher.js @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {getEntityAliases, getEntityIdentifiers, getPublisherBasicInfo} from '../helpers/formatEntityData'; +import _ from 'lodash'; +import express from 'express'; +import {makeEntityLoader} from '../helpers/entityLoader'; + + +const router = express.Router(); + +const publisherBasicRelations = [ + 'defaultAlias.language', + 'disambiguation', + 'publisherType', + 'area' +]; + +const publisherError = 'Publisher not found'; + +router.get('/:bbid', + makeEntityLoader('Publisher', publisherBasicRelations, publisherError), + async (req, res, next) => { + const publisherBasicInfo = await getPublisherBasicInfo(res.locals.entity); + return res.status(200).send(publisherBasicInfo); + }); + +const publisherAliasRelation = ['aliasSet.aliases.language']; + +router.get('/:bbid/aliases', + makeEntityLoader('Publisher', publisherAliasRelation, publisherError), + async (req, res, next) => { + const publisherAliasesList = await getEntityAliases(res.locals.entity); + return res.status(200).send(publisherAliasesList); + }); + +const publisherIdentifierRelation = ['identifierSet.identifiers.type']; + +router.get('/:bbid/identifiers', + makeEntityLoader('Publisher', publisherIdentifierRelation, publisherError), + async (req, res, next) => { + const publisherIdentifiersList = await getEntityIdentifiers(res.locals.entity); + return res.status(200).send(publisherIdentifiersList); + }); + +export default router; diff --git a/test/src/api/routes/test-publisher.js b/test/src/api/routes/test-publisher.js new file mode 100644 index 000000000..84dfe53cb --- /dev/null +++ b/test/src/api/routes/test-publisher.js @@ -0,0 +1,77 @@ +/* eslint-disable prefer-arrow-callback,func-names */ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {createPublisher, getRandomUUID, truncateEntities} from '../../../test-helpers/create-entities'; + +import app from '../../../../src/api/app'; +import chai from 'chai'; +import chaiHttp from 'chai-http'; + + +chai.use(chaiHttp); +const {expect} = chai; + + +const aBBID = getRandomUUID(); +const bBBID = getRandomUUID(); +const inValidBBID = 'akjd-adjjk-23123'; + +describe('GET /Publisher', () => { + before(() => createPublisher(aBBID)); + after(truncateEntities); + // Test to get basic information of a publisher + it('should get basic information of a publisher', async function () { + const res = await chai.request(app).get(`/publisher/${aBBID}`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body).to.have.all.keys( + 'bbid', + 'defaultAlias', + 'disambiguation', + 'type', + 'area', + 'beginDate', + 'endDate', + 'ended' + ); + }); + + it('should return list of aliases of a publisher', async function () { + const res = await chai.request(app).get(`/publisher/${aBBID}/aliases`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.aliases).to.be.an('array'); + expect(res.body).to.have.all.keys( + 'bbid', + 'aliases' + ); + }); + + it('should return list of identifiers of a publisher', async function () { + const res = await chai.request(app).get(`/publisher/${aBBID}/identifiers`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.identifiers).to.be.an('array'); + expect(res.body).to.have.all.keys( + 'bbid', + 'identifiers' + ); + }); +}); + diff --git a/test/test-helpers/create-entities.js b/test/test-helpers/create-entities.js index 76da8f2b6..481f16b1b 100644 --- a/test/test-helpers/create-entities.js +++ b/test/test-helpers/create-entities.js @@ -26,7 +26,7 @@ const { Alias, AliasSet, Area, Identifier, IdentifierType, IdentifierSet, Disambiguation, Entity, Annotation, Gender, Author, Edition, EditionGroup, Publisher, Work, - Language, WorkType, EditionGroupType, AuthorType + Language, WorkType, EditionGroupType, AuthorType, PublisherType } = orm; const {updateLanguageSet} = orm.func.language; @@ -235,6 +235,31 @@ export async function createAuthor(optionalBBID) { .save(null, {method: 'insert'}); } +export async function createPublisher(optionalBBID) { + const bbid = optionalBBID || uuidv4(); + await createEntityPrerequisites(); + const publisherAttribs = { + areaId: setData.id, + bbid, + beginDay: 25, + beginMonth: 12, + beginYear: 2000, + endDay: 10, + endMonth: 5, + endYear: 2012, + ended: true, + typeId: setData.id + }; + await new Area({...setData, gid: uuidv4(), name: 'Rlyeh'}) + .save(null, {method: 'insert'}); + await new PublisherType({...setData, label: 'Publisher Type 1'}) + .save(null, {method: 'insert'}); + await new Entity({bbid, type: 'Publisher'}) + .save(null, {method: 'insert'}); + await new Publisher({...entityAttribs, ...publisherAttribs}) + .save(null, {method: 'insert'}); +} + export function truncateEntities() { return util.truncateTables(bookshelf, [ 'bookbrainz.editor', @@ -253,6 +278,8 @@ export function truncateEntities() { 'bookbrainz.work_type', 'bookbrainz.edition_group_type', 'bookbrainz.author_type', + 'bookbrainz.publisher_type', + 'musicbrainz.area', 'musicbrainz.language', 'musicbrainz.gender' ]); From a784222e715b80a5b27d48d2c672f84bec776bf4 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Fri, 14 Jun 2019 01:40:48 +0530 Subject: [PATCH 37/78] fix: fix typo and replace entity in place of work for common function --- src/api/helpers/formatEntityData.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/api/helpers/formatEntityData.js b/src/api/helpers/formatEntityData.js index e529fd864..29670a2b6 100644 --- a/src/api/helpers/formatEntityData.js +++ b/src/api/helpers/formatEntityData.js @@ -56,8 +56,8 @@ export function getEditionBasicInfo(edition: object) { depth: _.get(edition, 'depth', null), pages: _.get(edition, 'pages', null), releaseEventDates: _.get(edition, 'releaseEventSet.releaseEvents', []).map((event) => event.date), - editionFormat: _.get(edition, 'editioFormat.label', null), - weight: _.get(edition, 'waight', null), + editionFormat: _.get(edition, 'editionFormat.label', null), + weight: _.get(edition, 'weight', null), status: _.get(edition, 'editionStatus.label', null) } } @@ -102,11 +102,11 @@ export function getPublisherBasicInfo(publisher: object) { } } -export function getEntityAliases(work: object) { - return _.isNil(work) ? null : +export function getEntityAliases(entity: object) { + return _.isNil(entity) ? null : { - bbid: _.get(work, 'bbid', null), - aliases: _.get(work, 'aliasSet.aliases', []).map((alias) => { + bbid: _.get(entity, 'bbid', null), + aliases: _.get(entity, 'aliasSet.aliases', []).map((alias) => { return { name: alias.name, sortName: alias.sortName, @@ -117,11 +117,11 @@ export function getEntityAliases(work: object) { }; } -export function getEntityIdentifiers(work: object) { - return _.isNil(work) ? null : +export function getEntityIdentifiers(entity: object) { + return _.isNil(entity) ? null : { - bbid: _.get(work, 'bbid', null), - identifiers: _.get(work, 'identifierSet.identifiers', []).map((identifier) => { + bbid: _.get(entity, 'bbid', null), + identifiers: _.get(entity, 'identifierSet.identifiers', []).map((identifier) => { return { type: identifier.type.label, value: identifier.value From 07903ecdb19aadffe6f894bd229cf13505912c6e Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Fri, 14 Jun 2019 01:43:32 +0530 Subject: [PATCH 38/78] refactor: remove unnecessary file --- src/common/queries/work.js | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 src/common/queries/work.js diff --git a/src/common/queries/work.js b/src/common/queries/work.js deleted file mode 100644 index 952462d75..000000000 --- a/src/common/queries/work.js +++ /dev/null @@ -1,18 +0,0 @@ -/* eslint-disable */ - -import _ from 'lodash'; - - - - -export async function getWorkFromDB(req, relations) { - const {orm} = req.app.locals; - const {Work} = orm; - - const workPromise = Work.forge({bbid: req.params.bbid}) - .fetch({withRelated: relations}) - - const workData = await Promise.resolve(workPromise) - - return workData; -} From b61b831fd364e3dcf7f8c01f97f1fb3ac05bcb54 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Fri, 14 Jun 2019 01:48:47 +0530 Subject: [PATCH 39/78] refactor: move common relation to helpers/utils and update error on invalid url --- package.json | 2 +- src/api/app.js | 2 +- src/api/helpers/utils.js | 20 ++++++++++++++++++++ src/api/routes/author.js | 7 +++---- src/api/routes/edition-group.js | 7 +++---- src/api/routes/edition.js | 7 +++---- src/api/routes/publisher.js | 7 +++---- src/api/routes/work.js | 7 +++---- 8 files changed, 37 insertions(+), 22 deletions(-) create mode 100644 src/api/helpers/utils.js diff --git a/package.json b/package.json index 4ec87fa3a..1543c3dde 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "WIP-build-client-webpack": "cross-env NODE_ENV=production SSR=true webpack --progress --config webpack.client.js", "prestart": "npm run build-less & npm run build-client-js & npm run build-server-js", "start": "cross-env SSR=true node ./lib/server/app.js", - "start-api": "npm run build-api-js && cross-env SSR=true node ./lib/api/app.js", + "start-api": "npm run build-api-js && node ./lib/api/app.js", "debug": "cross-env DEBUG=bbsite NODE_ENV=development SSR=true babel-node src/server/app.js", "debug-watch-server": "cross-env DEBUG=bbsite NODE_ENV=development SSR=true nodemon src/server/app.js --watch src/server --exec babel-node", "lint": "eslint .", diff --git a/src/api/app.js b/src/api/app.js index fa3911a24..97055a3e2 100644 --- a/src/api/app.js +++ b/src/api/app.js @@ -82,7 +82,7 @@ routes(app); // Catch 404 and forward to error handler app.use((req, res, next) => { - next(new error.NotFoundError(null, req)); + res.status(404).send({message: `Incorrect endpoint ${req.path}`}); }); diff --git a/src/api/helpers/utils.js b/src/api/helpers/utils.js new file mode 100644 index 000000000..25706935f --- /dev/null +++ b/src/api/helpers/utils.js @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +export const aliasesRelation = ['aliasSet.aliases.language']; +export const identifiersRelation = ['identifierSet.identifiers.type']; diff --git a/src/api/routes/author.js b/src/api/routes/author.js index 97e90e815..26696af09 100644 --- a/src/api/routes/author.js +++ b/src/api/routes/author.js @@ -16,6 +16,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +import {aliasesRelation, identifiersRelation} from '../helpers/utils'; import {getAuthorBasicInfo, getEntityAliases, getEntityIdentifiers} from '../helpers/formatEntityData'; import _ from 'lodash'; import express from 'express'; @@ -42,19 +43,17 @@ router.get('/:bbid', return res.status(200).send(authorBasicInfo); }); -const authorAliasRelation = ['aliasSet.aliases.language']; router.get('/:bbid/aliases', - makeEntityLoader('Author', authorAliasRelation, authorError), + makeEntityLoader('Author', aliasesRelation, authorError), async (req, res, next) => { const authorAliasesList = await getEntityAliases(res.locals.entity); return res.status(200).send(authorAliasesList); }); -const authorIdentifierRelation = ['identifierSet.identifiers.type']; router.get('/:bbid/identifiers', - makeEntityLoader('Author', authorIdentifierRelation, authorError), + makeEntityLoader('Author', identifiersRelation, authorError), async (req, res, next) => { const authorIdentifiersList = await getEntityIdentifiers(res.locals.entity); return res.status(200).send(authorIdentifiersList); diff --git a/src/api/routes/edition-group.js b/src/api/routes/edition-group.js index d891f456a..e0ac3c10a 100644 --- a/src/api/routes/edition-group.js +++ b/src/api/routes/edition-group.js @@ -16,6 +16,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +import {aliasesRelation, identifiersRelation} from '../helpers/utils'; import {getEditionGroupBasicInfo, getEntityAliases, getEntityIdentifiers} from '../helpers/formatEntityData'; import _ from 'lodash'; import express from 'express'; @@ -39,19 +40,17 @@ router.get('/:bbid', return res.status(200).send(editionGroupBasicInfo); }); -const editionGroupAliasRelation = ['aliasSet.aliases.language']; router.get('/:bbid/aliases', - makeEntityLoader('EditionGroup', editionGroupAliasRelation, editionGroupError), + makeEntityLoader('EditionGroup', aliasesRelation, editionGroupError), async (req, res, next) => { const editionAliasesList = await getEntityAliases(res.locals.entity); return res.status(200).send(editionAliasesList); }); -const editionGroupIdentifierRelation = ['identifierSet.identifiers.type']; router.get('/:bbid/identifiers', - makeEntityLoader('EditionGroup', editionGroupIdentifierRelation, editionGroupError), + makeEntityLoader('EditionGroup', identifiersRelation, editionGroupError), async (req, res, next) => { const editionGroupIdentifiersList = await getEntityIdentifiers(res.locals.entity); return res.status(200).send(editionGroupIdentifiersList); diff --git a/src/api/routes/edition.js b/src/api/routes/edition.js index c53bc2903..9ff04d0e5 100644 --- a/src/api/routes/edition.js +++ b/src/api/routes/edition.js @@ -16,6 +16,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +import {aliasesRelation, identifiersRelation} from '../helpers/utils'; import {getEditionBasicInfo, getEntityAliases, getEntityIdentifiers} from '../helpers/formatEntityData'; import _ from 'lodash'; import express from 'express'; @@ -42,19 +43,17 @@ router.get('/:bbid', return res.status(200).send(editionBasicInfo); }); -const editionAliasRelation = ['aliasSet.aliases.language']; router.get('/:bbid/aliases', - makeEntityLoader('Edition', editionAliasRelation, editionError), + makeEntityLoader('Edition', aliasesRelation, editionError), async (req, res, next) => { const editionAliasesList = await getEntityAliases(res.locals.entity); return res.status(200).send(editionAliasesList); }); -const editionIdentifierRelation = ['identifierSet.identifiers.type']; router.get('/:bbid/identifiers', - makeEntityLoader('Edition', editionIdentifierRelation, editionError), + makeEntityLoader('Edition', identifiersRelation, editionError), async (req, res, next) => { const editionIdentifiersList = await getEntityIdentifiers(res.locals.entity); return res.status(200).send(editionIdentifiersList); diff --git a/src/api/routes/publisher.js b/src/api/routes/publisher.js index c3972a036..523bcbb03 100644 --- a/src/api/routes/publisher.js +++ b/src/api/routes/publisher.js @@ -16,6 +16,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +import {aliasesRelation, identifiersRelation} from '../helpers/utils'; import {getEntityAliases, getEntityIdentifiers, getPublisherBasicInfo} from '../helpers/formatEntityData'; import _ from 'lodash'; import express from 'express'; @@ -40,19 +41,17 @@ router.get('/:bbid', return res.status(200).send(publisherBasicInfo); }); -const publisherAliasRelation = ['aliasSet.aliases.language']; router.get('/:bbid/aliases', - makeEntityLoader('Publisher', publisherAliasRelation, publisherError), + makeEntityLoader('Publisher', aliasesRelation, publisherError), async (req, res, next) => { const publisherAliasesList = await getEntityAliases(res.locals.entity); return res.status(200).send(publisherAliasesList); }); -const publisherIdentifierRelation = ['identifierSet.identifiers.type']; router.get('/:bbid/identifiers', - makeEntityLoader('Publisher', publisherIdentifierRelation, publisherError), + makeEntityLoader('Publisher', identifiersRelation, publisherError), async (req, res, next) => { const publisherIdentifiersList = await getEntityIdentifiers(res.locals.entity); return res.status(200).send(publisherIdentifiersList); diff --git a/src/api/routes/work.js b/src/api/routes/work.js index d8be04e26..5b35a8ea0 100644 --- a/src/api/routes/work.js +++ b/src/api/routes/work.js @@ -16,6 +16,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +import {aliasesRelation, identifiersRelation} from '../helpers/utils'; import {getEntityAliases, getEntityIdentifiers, getWorkBasicInfo} from '../helpers/formatEntityData'; import _ from 'lodash'; import express from 'express'; @@ -40,19 +41,17 @@ router.get('/:bbid', return res.status(200).send(workBasicInfo); }); -const workAliasRelation = ['aliasSet.aliases.language']; router.get('/:bbid/aliases', - makeEntityLoader('Work', workAliasRelation, workError), + makeEntityLoader('Work', aliasesRelation, workError), async (req, res, next) => { const workAliasesList = await getEntityAliases(res.locals.entity); return res.status(200).send(workAliasesList); }); -const workIdentifierRelation = ['identifierSet.identifiers.type']; router.get('/:bbid/identifiers', - makeEntityLoader('Work', workIdentifierRelation, workError), + makeEntityLoader('Work', identifiersRelation, workError), async (req, res, next) => { const workIdentifiersList = await getEntityIdentifiers(res.locals.entity); return res.status(200).send(workIdentifiersList); From 76b6da0bf6487559c820859a8cc692badbab96fc Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Fri, 14 Jun 2019 11:04:45 +0200 Subject: [PATCH 40/78] chore: Fix security alerts - update packages --- package-lock.json | 16550 +++++++++++++++++++++----------------------- package.json | 12 +- 2 files changed, 7776 insertions(+), 8786 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0352af1a9..50d48d568 100644 --- a/package-lock.json +++ b/package-lock.json @@ -102,6 +102,12 @@ } } }, + "@babel/parser": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", + "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "dev": true + }, "@babel/polyfill": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.0.0.tgz", @@ -382,9 +388,9 @@ } }, "JSONStream": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.4.tgz", - "integrity": "sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "requires": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -407,12 +413,14 @@ "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==" + "integrity": "sha512-cJrKCNcr2kv8dlDnbw+JPUGjHZzo4myaxOLmpOX8a+rgX94YeTcTMv/LFJUSByRpc+i4GgVnnhLxvMu/2Y+rqw==", + "dev": true }, "acorn-dynamic-import": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, "requires": { "acorn": "^5.0.0" } @@ -435,15 +443,33 @@ } }, "acorn-node": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.5.2.tgz", - "integrity": "sha512-krFKvw/d1F17AN3XZbybIUzEY4YEPNiGo05AfP3dBlfVKrMHETKpgjpuZkSF8qDNt9UkQcqj7am8yJLseklCMg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.7.0.tgz", + "integrity": "sha512-XhahLSsCB6X6CJbe+uNu3Mn9sJBNFxtBN9NLgAOQovfS6Kh0lDUtmlclhjn9CvEK7A7YyRU13PXlNcpSiLI9Yw==", "requires": { - "acorn": "^5.7.1", - "acorn-dynamic-import": "^3.0.0", + "acorn": "^6.1.1", + "acorn-dynamic-import": "^4.0.0", + "acorn-walk": "^6.1.1", "xtend": "^4.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==" + }, + "acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==" + } } }, + "acorn-walk": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==" + }, "adjust-sourcemap-loader": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-1.2.0.tgz", @@ -587,12 +613,27 @@ "integrity": "sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo=", "dev": true }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -868,6950 +909,4534 @@ "is-glob": "^2.0.0", "path-is-absolute": "^1.0.0", "readdirp": "^2.0.0" + }, + "dependencies": { + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + } } }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "optional": 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, - "optional": 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, - "optional": true, - "requires": { - "is-glob": "^2.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, - "optional": 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, - "optional": 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" - } - }, - "v8flags": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", - "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true, - "requires": { - "user-home": "^1.1.1" - } - } - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "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": "http://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" - } - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.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": { - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "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" - } - } - } - }, - "babel-eslint": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.6.tgz", - "integrity": "sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.0.0-beta.44", - "@babel/traverse": "7.0.0-beta.44", - "@babel/types": "7.0.0-beta.44", - "babylon": "7.0.0-beta.44", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "^1.0.0" - }, - "dependencies": { - "babylon": { - "version": "7.0.0-beta.44", - "resolved": "http://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", - "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", - "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" - }, - "dependencies": { - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - } - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "dev": true, - "requires": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-builder-react-jsx": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "esutils": "^2.0.2" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "dev": true, - "requires": { - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, - "requires": { - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.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-loader": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz", - "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", - "dev": true, - "requires": { - "find-cache-dir": "^1.0.0", - "loader-utils": "^1.0.2", - "mkdirp": "^0.5.1" - } - }, - "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-array-includes": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-array-includes/-/babel-plugin-array-includes-2.0.3.tgz", - "integrity": "sha1-z1RS6Bx7gD+3lZ8QRayI4uwo/3Y=", - "dev": true - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-lodash": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz", - "integrity": "sha512-yDZLjK7TCkWl1gpBeBGmuaDIFhZKmkoL+Cu2MUUjv5VxUZx/z7tBGBCBcQs5RI1Bkz5LLmNdjx7paOyQtMovyg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.0.0-beta.49", - "@babel/types": "^7.0.0-beta.49", - "glob": "^7.1.1", - "lodash": "^4.17.10", - "require-package-name": "^2.0.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", - "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.10", - "to-fast-properties": "^2.0.0" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - } - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", - "dev": true - }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", - "dev": true - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", - "dev": true - }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", - "dev": true - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", - "dev": true - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "http://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-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "^6.24.1", - "babel-plugin-syntax-async-functions": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-plugin-syntax-class-properties": "^6.8.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "lodash": "^4.17.4" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "^6.24.1", - "babel-helper-function-name": "^6.24.1", - "babel-helper-optimise-call-expression": "^6.24.1", - "babel-helper-replace-supers": "^6.24.1", - "babel-messages": "^6.23.0", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "^6.24.1", - "babel-runtime": "^6.26.0", - "babel-template": "^6.26.0", - "babel-types": "^6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, - "requires": { - "babel-helper-replace-supers": "^6.24.1", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "dev": true, - "requires": { - "babel-helper-call-delegate": "^6.24.1", - "babel-helper-get-function-arity": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-template": "^6.24.1", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "^6.24.1", - "babel-runtime": "^6.22.0", - "regexpu-core": "^2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "dev": true, - "requires": { - "babel-plugin-syntax-flow": "^6.18.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "^6.8.0", - "babel-runtime": "^6.26.0" - } - }, - "babel-plugin-transform-react-display-name": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "dev": true, - "requires": { - "babel-helper-builder-react-jsx": "^6.24.1", - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx-self": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", - "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-react-jsx-source": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "requires": { - "regenerator-transform": "^0.10.0" - } - }, - "babel-plugin-transform-require-ignore": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-require-ignore/-/babel-plugin-transform-require-ignore-0.1.1.tgz", - "integrity": "sha512-A7EmlVd3ZYWJI3eg3dklAXn1yfq8Y5omHMQgAUo0FwGLYRuL5daLR6+LtCVHi4f9+fStr7HuPkW9rmKtcmY67w==" - }, - "babel-plugin-transform-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", - "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, - "requires": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - } - } - }, - "babel-preset-env": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", - "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "^6.22.0", - "babel-plugin-syntax-trailing-function-commas": "^6.22.0", - "babel-plugin-transform-async-to-generator": "^6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", - "babel-plugin-transform-es2015-block-scoping": "^6.23.0", - "babel-plugin-transform-es2015-classes": "^6.23.0", - "babel-plugin-transform-es2015-computed-properties": "^6.22.0", - "babel-plugin-transform-es2015-destructuring": "^6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", - "babel-plugin-transform-es2015-for-of": "^6.23.0", - "babel-plugin-transform-es2015-function-name": "^6.22.0", - "babel-plugin-transform-es2015-literals": "^6.22.0", - "babel-plugin-transform-es2015-modules-amd": "^6.22.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", - "babel-plugin-transform-es2015-modules-umd": "^6.23.0", - "babel-plugin-transform-es2015-object-super": "^6.22.0", - "babel-plugin-transform-es2015-parameters": "^6.23.0", - "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", - "babel-plugin-transform-es2015-spread": "^6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", - "babel-plugin-transform-es2015-template-literals": "^6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", - "babel-plugin-transform-exponentiation-operator": "^6.22.0", - "babel-plugin-transform-regenerator": "^6.22.0", - "browserslist": "^3.2.6", - "invariant": "^2.2.2", - "semver": "^5.3.0" - } - }, - "babel-preset-flow": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", - "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", - "dev": true, - "requires": { - "babel-plugin-transform-flow-strip-types": "^6.22.0" - } - }, - "babel-preset-react": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", - "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", - "dev": true, - "requires": { - "babel-plugin-syntax-jsx": "^6.3.13", - "babel-plugin-transform-react-display-name": "^6.23.0", - "babel-plugin-transform-react-jsx": "^6.24.1", - "babel-plugin-transform-react-jsx-self": "^6.22.0", - "babel-plugin-transform-react-jsx-source": "^6.22.0", - "babel-preset-flow": "^6.23.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": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "^2.4.0", - "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" - }, - "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" - } - } - } - }, - "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" - } - }, - "babelify": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-8.0.0.tgz", - "integrity": "sha512-xVr63fKEvMWUrrIbqlHYsMcc5Zdw4FSVesAHgkgajyCE1W8gbm9rbMakqavhxKvikGYMhEcqxTwB/gQmQ6lBtw==", - "dev": true - }, - "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", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" - }, - "basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "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, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bfj-node4": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/bfj-node4/-/bfj-node4-5.3.1.tgz", - "integrity": "sha512-SOmOsowQWfXc7ybFARsK3C4MCOWzERaOMV/Fl3Tgjs+5dJWyzo3oa127jL44eMbQiAN17J7SvAs2TRxEScTUmg==", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "check-types": "^7.3.0", - "tryer": "^1.0.0" - } - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" - }, - "bindings": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", - "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=" - }, - "bluebird": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", - "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==" - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, - "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", - "requires": { - "bytes": "3.0.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", - "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" - }, - "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" - } - } - } - }, - "bookbrainz-data": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bookbrainz-data/-/bookbrainz-data-2.1.1.tgz", - "integrity": "sha512-bCZUY13C9Vj0NratIFJN0O+MMq8/dtOVX009wms1SqrOFQnv8ofHduM1auX4JiAUt//joxb2UTxMkqGJkYYYdA==", - "requires": { - "bluebird": "^3.5.1", - "bookshelf": "^0.13.3", - "deep-diff": "^1.0.0", - "immutable": "^3.8.2", - "knex": "^0.15.0", - "lodash": "^4.17.10", - "moment": "^2.22.2", - "nodemon": "^1.18.3", - "pg": "^7.4.1", - "pg-native": "^3.0.0" - } - }, - "bookshelf": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/bookshelf/-/bookshelf-0.13.3.tgz", - "integrity": "sha512-QELg3tur8KWFmsYcMOvn0APl9tfov0bXqXAqLmDUcCf5oF0Aw/4w1iFR2ttuDhrdw7GjVyZWOnx/XiMZSx4vSQ==", - "requires": { - "babel-runtime": "^6.26.0", - "bluebird": "^3.4.3", - "chalk": "^2.3.0", - "create-error": "~0.3.1", - "inflection": "^1.5.1", - "inherits": "~2.0.1", - "lodash": "^4.13.1" - } - }, - "bootstrap": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", - "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==", - "dev": true - }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "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" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" - }, - "browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", - "requires": { - "JSONStream": "^1.0.3", - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - } - }, - "browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "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=" - } - } - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "browserify": { - "version": "14.5.0", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-14.5.0.tgz", - "integrity": "sha512-gKfOsNQv/toWz+60nSPfYzuwSEdzvV2WdxrVPUbPD/qui44rAkB3t3muNtmmGYHqrG56FGwX9SUEQmzNLAeS7g==", - "requires": { - "JSONStream": "^1.0.3", - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^1.11.0", - "browserify-zlib": "~0.2.0", - "buffer": "^5.0.2", - "cached-path-relative": "^1.0.0", - "concat-stream": "~1.5.1", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.0", - "domain-browser": "~1.1.0", - "duplexer2": "~0.1.2", - "events": "~1.1.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", - "labeled-stream-splicer": "^2.0.0", - "module-deps": "^4.0.8", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^2.0.0", - "string_decoder": "~1.0.0", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "~0.0.0", - "url": "~0.11.0", - "util": "~0.10.1", - "vm-browserify": "~0.0.1", - "xtend": "^4.0.0" - }, - "dependencies": { - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", - "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30000844", - "electron-to-chromium": "^1.3.47" - } - }, - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "buffer-writer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "cacache": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", - "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", - "dev": true, - "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cached-path-relative": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", - "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=" - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "caniuse-lite": { - "version": "1.0.30000884", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000884.tgz", - "integrity": "sha512-ibROerckpTH6U5zReSjbaitlH4gl5V4NWNCBzRNCa3GEDmzzkfStk+2k5mO4ZDM6pwtdjbZ3hjvsYhPGVLWgNw==", - "dev": true - }, - "capture-stack-trace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", - "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true, - "optional": true - }, - "catharsis": { - "version": "0.8.9", - "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.9.tgz", - "integrity": "sha1-mMyJDKZS3S7w5ws3klMQ/56Q/Is=", - "dev": true, - "requires": { - "underscore-contrib": "~0.3.0" - } - }, - "chai": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", - "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", - "dev": true, - "requires": { - "assertion-error": "^1.0.1", - "check-error": "^1.0.1", - "deep-eql": "^3.0.0", - "get-func-name": "^2.0.0", - "pathval": "^1.0.0", - "type-detect": "^4.0.0" - } - }, - "chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dev": true, - "requires": { - "check-error": "^1.0.2" - } - }, - "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" - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "check-types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", - "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==", - "dev": true - }, - "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" - }, - "dependencies": { - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "requires": { - "is-extglob": "^2.1.1" - } - } - } - }, - "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", - "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "ci-info": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.4.0.tgz", - "integrity": "sha512-Oqmw2pVfCl8sCL+1QgMywPfdxPJPkC51y4usw0iiE2S9qnEOAqXy8bwl1CpMpnoU39g4iKJTz6QZj+28FvOnjQ==" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "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 - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" - }, - "clean-webpack-plugin": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-0.1.19.tgz", - "integrity": "sha512-M1Li5yLHECcN2MahoreuODul5LkjohJGFxLPTjl3j1ttKrF5rgjZET1SJduuqxLAuT1gAPOdkhg03qcaaU1KeA==", - "dev": true, - "requires": { - "rimraf": "^2.6.1" - } - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-spinners": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", - "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", - "dev": true - }, - "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", - "dev": true, - "requires": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "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" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", - "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - } - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "compressible": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz", - "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=", - "requires": { - "mime-db": ">= 1.34.0 < 2" - } - }, - "compression": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", - "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.14", - "debug": "2.6.9", - "on-headers": "~1.0.1", - "safe-buffer": "5.1.2", - "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" - } - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", - "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", - "requires": { - "inherits": "~2.0.1", - "readable-stream": "~2.0.0", - "typedarray": "~0.0.5" - }, - "dependencies": { - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "connect-redis": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-3.3.3.tgz", - "integrity": "sha512-rpWsW2uk1uOe/ccY/JvW+RiLrhZm7auIx8z4yR+KXemFTIhJyD58jXiJbI0E/fZCnybawpdSqOZ+6/ah6aBeyg==", - "requires": { - "debug": "^3.1.0", - "redis": "^2.1.0" - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "requires": { - "date-now": "^0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" - }, - "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.1.3", - "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "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==" - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "dev": true, - "requires": { - "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "parse-json": "^4.0.0", - "require-from-string": "^2.0.1" - }, - "dependencies": { - "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" - } - } - } - }, - "crc": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", - "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=" - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-error": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/create-error/-/create-error-0.3.1.tgz", - "integrity": "sha1-aYECRaYp5lRDK/BDdzYAA6U1GiM=" - }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-env": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz", - "integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.5", - "is-windows": "^1.0.0" - }, - "dependencies": { - "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" - } - } - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.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 - } - } - }, - "css-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.0.tgz", - "integrity": "sha512-tMXlTYf3mIMt3b0dDCOQFJiVvxbocJ5Ho577WiGPYPZcqVEO218L2iU22pDXzkTZCLDE+9AmGSUkWxeh/nZReA==", - "dev": true, - "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash.camelcase": "^4.3.0", - "postcss": "^6.0.23", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" - } - }, - "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", - "dev": true, - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - }, - "dependencies": { - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - } - } - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", - "dev": true - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-fns": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", - "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", - "dev": true - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" - }, - "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" - } - }, - "decamelize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", - "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", - "dev": true, - "requires": { - "xregexp": "4.0.0" - } - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "deep-diff": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-1.0.2.tgz", - "integrity": "sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==" - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "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", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "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" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "deps-sort": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", - "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", - "requires": { - "JSONStream": "^1.0.3", - "shasum": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - } - }, - "deps-topo-sort": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/deps-topo-sort/-/deps-topo-sort-0.2.1.tgz", - "integrity": "sha1-S+ivB0dpcWSciwxIT9fUqHuLASo=", - "dev": true, - "requires": { - "JSONStream": "~0.7.1", - "minimist": "0.0.5", - "through": "~2.3.4" - }, - "dependencies": { - "JSONStream": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.7.4.tgz", - "integrity": "sha1-c0KQ5BUR7qfCz+FR+/mlY6l7l4Y=", - "dev": true, - "requires": { - "jsonparse": "0.0.5", - "through": ">=2.2.7 <3" - } - }, - "jsonparse": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", - "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", - "dev": true - }, - "minimist": { - "version": "0.0.5", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.5.tgz", - "integrity": "sha1-16oye87PUY+RBqxrjwA/o7zqhWY=", - "dev": true - } - } - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-file": { - "version": "1.0.0", - "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" - } - }, - "detective": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", - "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", - "requires": { - "acorn": "^5.2.1", - "defined": "^1.0.0" - } - }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-helpers": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.3.1.tgz", - "integrity": "sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg==" - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" - } - } - }, - "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", - "dev": true - }, - "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=" - }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "requires": { - "is-obj": "^1.0.0" - } - }, - "double-ended-queue": { - "version": "2.1.0-0", - "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", - "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=" - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "requires": { - "readable-stream": "^2.0.2" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "ejs": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", - "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", - "dev": true - }, - "elasticsearch": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/elasticsearch/-/elasticsearch-15.2.0.tgz", - "integrity": "sha512-jOFcBoEh3Sn3gjUTozInODZTLriJtfppAUC7jnQCUE+OUj8o7GoAyC+L4h/L3ZxmXNFbQCunqVR+nmSofHdo9A==", - "requires": { - "agentkeepalive": "^3.4.1", - "chalk": "^1.0.0", - "lodash": "^4.17.10" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "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=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "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" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.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=" - } - } - }, - "electron-to-chromium": { - "version": "1.3.62", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.62.tgz", - "integrity": "sha512-x09ndL/Gjnuk3unlAyoGyUg3wbs4w/bXurgL7wL913vXHAOWmMhrLf1VNGRaMLngmadd5Q8gsV9BFuIr6rP+Xg==", - "dev": true - }, - "elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", - "dev": true - }, - "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "~0.4.13" - } - }, - "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==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" - } - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" - } - }, - "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "dev": true, - "requires": { - "is-callable": "^1.1.1", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "eslint": { - "version": "4.19.1", - "resolved": "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", - "dev": true, - "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.4", - "esquery": "^1.0.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^1.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "4.0.2", - "text-table": "~0.2.0" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "globals": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", - "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", - "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==", - "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" - } - } - } - }, - "eslint-loader": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.0.tgz", - "integrity": "sha512-f4A/Yk7qF+HcFSz5Tck2QoKIwJVHlX0soJk5MkROYahb5uvspad5Ba60rrz4u/V2/MEj1dtp/uBi6LlLWVaY7Q==", - "dev": true, - "requires": { - "loader-fs-cache": "^1.0.0", - "loader-utils": "^1.0.2", - "object-assign": "^4.0.1", - "object-hash": "^1.1.4", - "rimraf": "^2.6.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=", - "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" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "^1.0.0" - } - } - } - }, - "eslint-plugin-babel": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-4.1.2.tgz", - "integrity": "sha1-eSAqDjV1fdkngJGbIzbx+i/lPB4=", - "dev": true - }, - "eslint-plugin-flowtype": { - "version": "2.50.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.0.tgz", - "integrity": "sha512-10FnBXCp8odYcpUFXGAh+Zko7py0hUWutTd3BN/R9riukH360qNPLYPR3/xV9eu9K7OJDjJrsflBnL6RwxFnlw==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "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==", - "dev": true, - "requires": { - "contains-path": "^0.1.0", - "debug": "^2.6.8", - "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", - "read-pkg-up": "^2.0.0", - "resolve": "^1.6.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", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - } - } - }, - "eslint-plugin-react": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", - "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", - "dev": true, - "requires": { - "array-includes": "^3.0.3", - "doctrine": "^2.1.0", - "has": "^1.0.3", - "jsx-ast-utils": "^2.0.1", - "prop-types": "^15.6.2" - } - }, - "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", - "dev": true - }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "dev": true, - "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "event-stream": { - "version": "3.3.4", - "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.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-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "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", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "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" - } - } - } - }, - "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, - "optional": 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, - "optional": 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, - "optional": 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, - "optional": 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, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "express": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", - "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", - "requires": { - "accepts": "~1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", - "content-type": "~1.0.4", - "cookie": "0.3.1", - "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", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "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", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", - "requires": { - "bytes": "3.0.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.1", - "http-errors": "~1.6.2", - "iconv-lite": "0.4.19", - "on-finished": "~2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "~1.6.15" - } - }, - "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" - } - }, - "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==" - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "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=" - } - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - } - } - }, - "express-session": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz", - "integrity": "sha512-r0nrHTCYtAMrFwZ0kBzZEXa1vtPVrw0dKvGSrKP4dahwBQ1BJpF2/y1Pp4sCD/0kvxV4zZeclyvfmw0B4RMJQA==", - "requires": { - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "crc": "3.4.4", - "debug": "2.6.9", - "depd": "~1.1.1", - "on-headers": "~1.0.1", - "parseurl": "~1.3.2", - "uid-safe": "~2.1.5", - "utils-merge": "1.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" - } - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, "requires": { - "is-extendable": "^0.1.0" + "safe-buffer": "~5.1.1" } }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "optional": true, "requires": { - "kind-of": "^6.0.0" + "is-posix-bracket": "^0.1.0" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "optional": true, "requires": { - "kind-of": "^6.0.0" + "is-extglob": "^1.0.0" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "optional": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-glob": "^2.0.0" } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "factor-bundle": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/factor-bundle/-/factor-bundle-2.5.0.tgz", - "integrity": "sha1-jqiVfaOddYYoPMPuNTzZkRpF53k=", - "dev": true, - "requires": { - "JSONStream": "~0.8.4", - "browser-pack": "^5.0.1", - "defined": "0.0.0", - "deps-topo-sort": "~0.2.1", - "inherits": "^2.0.1", - "isarray": "0.0.1", - "labeled-stream-splicer": "^1.0.0", - "minimist": "~0.2.0", - "nub": "0.0.0", - "outpipe": "^1.1.0", - "reversepoint": "~0.2.0", - "stream-combiner": "~0.2.1", - "through2": "^0.5.1", - "xtend": "^4.0.0" - }, - "dependencies": { - "JSONStream": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", - "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", + }, + "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": { - "jsonparse": "0.0.5", - "through": ">=2.2.7 <3" - }, - "dependencies": { - "jsonparse": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", - "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", - "dev": true - } + "is-extglob": "^1.0.0" } }, - "browser-pack": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-5.0.1.tgz", - "integrity": "sha1-QZdxmyDG4KqglFHFER5T77b7wY0=", + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, + "optional": true, "requires": { - "JSONStream": "^1.0.3", - "combine-source-map": "~0.6.1", - "defined": "^1.0.0", - "through2": "^1.0.0", - "umd": "^3.0.0" - }, - "dependencies": { - "JSONStream": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.4.tgz", - "integrity": "sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "through2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", - "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", - "dev": true, - "requires": { - "readable-stream": ">=1.1.13-1 <1.2.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } + "is-buffer": "^1.1.5" } }, - "combine-source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", - "integrity": "sha1-m0oJwxYDPXaODxHgKfonMOB5rZY=", + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, + "optional": true, "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.5.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.4.2" + "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" } }, - "defined": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", - "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=", - "dev": true - }, - "inline-source-map": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz", - "integrity": "sha1-Skxd2OT7Xps82mDIIt+tyu5m4K8=", + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", "dev": true, "requires": { - "source-map": "~0.4.0" + "user-home": "^1.1.1" } + } + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "labeled-stream-splicer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", - "integrity": "sha1-RhUzFTd4SYHo/SZOHzpDTE4N3WU=", + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "inherits": "^2.0.1", - "isarray": "~0.0.1", - "stream-splicer": "^1.1.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" } }, - "minimist": { - "version": "0.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", - "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", "dev": true }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "ansi-regex": "^2.0.0" } }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "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": { + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "dev": true, "requires": { - "amdefine": ">=0.0.4" + "safe-buffer": "~5.1.1" } }, - "stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "duplexer": "~0.1.1", - "through": "~2.3.4" + "ms": "2.0.0" } - }, - "stream-splicer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-1.3.2.tgz", - "integrity": "sha1-PARBvhW5v04iYnXm3IOWR0VUZmE=", + } + } + }, + "babel-eslint": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.6.tgz", + "integrity": "sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0-beta.44", + "@babel/traverse": "7.0.0-beta.44", + "@babel/types": "7.0.0-beta.44", + "babylon": "7.0.0-beta.44", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "^1.0.0" + }, + "dependencies": { + "babylon": { + "version": "7.0.0-beta.44", + "resolved": "http://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz", + "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==", + "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" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + } + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-builder-react-jsx": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", + "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.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-loader": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz", + "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", + "dev": true, + "requires": { + "find-cache-dir": "^1.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1" + } + }, + "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-array-includes": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/babel-plugin-array-includes/-/babel-plugin-array-includes-2.0.3.tgz", + "integrity": "sha1-z1RS6Bx7gD+3lZ8QRayI4uwo/3Y=", + "dev": true + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-lodash": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz", + "integrity": "sha512-yDZLjK7TCkWl1gpBeBGmuaDIFhZKmkoL+Cu2MUUjv5VxUZx/z7tBGBCBcQs5RI1Bkz5LLmNdjx7paOyQtMovyg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0-beta.49", + "@babel/types": "^7.0.0-beta.49", + "glob": "^7.1.1", + "lodash": "^4.17.10", + "require-package-name": "^2.0.1" + }, + "dependencies": { + "@babel/types": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0.tgz", + "integrity": "sha512-5tPDap4bGKTLPtci2SUl/B7Gv8RnuJFuQoWx26RJobS0fFrz4reUA3JnwIM+HVHEmWE0C1mzKhDtTp8NsWY02Q==", "dev": true, "requires": { - "indexof": "0.0.1", - "inherits": "^2.0.1", - "isarray": "~0.0.1", - "readable-stream": "^1.1.13-1", - "readable-wrap": "^1.0.0", - "through2": "^1.0.0" - }, - "dependencies": { - "through2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", - "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", - "dev": true, - "requires": { - "readable-stream": ">=1.1.13-1 <1.2.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true - }, - "through2": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", - "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", - "dev": true, - "requires": { - "readable-stream": "~1.0.17", - "xtend": "~3.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", - "dev": true - } - } } } }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", + "dev": true + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "http://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-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } }, - "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 + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } }, - "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", - "dev": true + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } }, - "fbjs": { - "version": "0.8.17", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", - "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.18" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" - } + "babel-runtime": "^6.22.0" } }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" + "babel-runtime": "^6.22.0" } }, - "file-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz", - "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==", + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "loader-utils": "^1.0.2", - "schema-utils": "^1.0.0" + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", "dev": true, - "optional": true + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } }, - "filepaths": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/filepaths/-/filepaths-0.3.0.tgz", - "integrity": "sha1-ocmkYBturn+4dvwayYR5zrVXwXc=", - "dev": true + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } }, - "filesize": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", - "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", - "dev": true + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "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" - } - } + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" } }, - "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, "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", - "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" - } - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - } + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" + "babel-runtime": "^6.22.0" } }, - "find-parent-dir": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", - "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "locate-path": "^2.0.0" + "babel-runtime": "^6.22.0" } }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" } }, - "fined": { - "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==", + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" } }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "dev": true, + "requires": { + "babel-plugin-syntax-flow": "^6.18.0", + "babel-runtime": "^6.22.0" + } }, - "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", "dev": true, "requires": { - "circular-json": "^0.3.1", - "del": "^2.0.2", - "graceful-fs": "^4.1.2", - "write": "^0.2.1" + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" } }, - "flow-bin": { - "version": "0.69.0", - "resolved": "http://registry.npmjs.org/flow-bin/-/flow-bin-0.69.0.tgz", - "integrity": "sha512-SC5kiOiMk+8o1N2ZQ1mBfi0qBDYM+r6ZFQS7s+zXtyKrkbtCP+6JRTVvO3KXOnv568SK1G+Kg8/LlJwgyR+8Ug==", - "dev": true + "babel-plugin-transform-react-display-name": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, - "flux-standard-action": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/flux-standard-action/-/flux-standard-action-0.6.1.tgz", - "integrity": "sha1-bzQhG5SDTqHDzDD056+tPQ+/caI=", + "babel-plugin-transform-react-jsx-self": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", + "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", + "dev": true, "requires": { - "lodash.isplainobject": "^3.2.0" + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "babel-plugin-transform-react-jsx-source": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, "requires": { - "for-in": "^1.0.1" + "regenerator-transform": "^0.10.0" } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "babel-plugin-transform-require-ignore": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-require-ignore/-/babel-plugin-transform-require-ignore-0.1.1.tgz", + "integrity": "sha512-A7EmlVd3ZYWJI3eg3dklAXn1yfq8Y5omHMQgAUo0FwGLYRuL5daLR6+LtCVHi4f9+fStr7HuPkW9rmKtcmY67w==" + }, + "babel-plugin-transform-runtime": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", + "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", "dev": true, - "optional": true + "requires": { + "babel-runtime": "^6.22.0" + } }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "1.0.6", - "mime-types": "^2.1.12" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, - "formidable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "dev": true + } + } }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "babel-preset-env": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", + "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^3.2.6", + "invariant": "^2.2.2", + "semver": "^5.3.0" + } }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "babel-preset-flow": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", + "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", + "dev": true, "requires": { - "map-cache": "^0.2.2" + "babel-plugin-transform-flow-strip-types": "^6.22.0" } }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" + "babel-preset-react": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", + "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "^6.3.13", + "babel-plugin-transform-react-display-name": "^6.23.0", + "babel-plugin-transform-react-jsx": "^6.24.1", + "babel-plugin-transform-react-jsx-self": "^6.22.0", + "babel-plugin-transform-react-jsx-source": "^6.22.0", + "babel-preset-flow": "^6.23.0" + } }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "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": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "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" } }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "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": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "optional": true, + "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": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" + "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" }, "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, "debug": { "version": "2.6.9", - "bundled": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.5.1", - "bundled": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "bundled": true, - "optional": true, - "requires": { - "safer-buffer": "^2.1.0" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "ms": "2.0.0" } - }, - "isarray": { + } + } + }, + "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" + } + }, + "babelify": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/babelify/-/babelify-8.0.0.tgz", + "integrity": "sha512-xVr63fKEvMWUrrIbqlHYsMcc5Zdw4FSVesAHgkgajyCE1W8gbm9rbMakqavhxKvikGYMhEcqxTwB/gQmQ6lBtw==", + "dev": true + }, + "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", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { "version": "1.0.0", - "bundled": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, - "minipass": { - "version": "2.2.4", - "bundled": true, - "requires": { - "safe-buffer": "^5.1.1", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "bundled": true, - "optional": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.0", - "bundled": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "optional": true - }, - "rc": { - "version": "1.2.7", - "bundled": true, - "optional": true, - "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "optional": true, + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "glob": "^7.0.5" + "is-descriptor": "^1.0.0" } }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "optional": true + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "optional": true + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } }, - "string-width": { + "is-descriptor": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "optional": true, + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "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, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bfj": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.1.tgz", + "integrity": "sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "check-types": "^7.3.0", + "hoopy": "^0.1.2", + "tryer": "^1.0.0" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" + }, + "bluebird": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz", + "integrity": "sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + }, + "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" + } + } + } + }, + "bookbrainz-data": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bookbrainz-data/-/bookbrainz-data-2.2.1.tgz", + "integrity": "sha512-L+dTsFZReBI1XzSv1ulZ+PEoxOMTAiMNSNW3FluB+fVRvbjjJBLy1GqF/MRi07cw1FV02gvnk5uGdb0gDppVWw==", + "requires": { + "bluebird": "^3.5.1", + "bookshelf": "^0.13.3", + "deep-diff": "^1.0.0", + "immutable": "^3.8.2", + "knex": "^0.15.0", + "lodash": "^4.17.11", + "moment": "^2.22.2", + "nodemon": "^1.18.3", + "pg": "^7.4.1" + } + }, + "bookshelf": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/bookshelf/-/bookshelf-0.13.3.tgz", + "integrity": "sha512-QELg3tur8KWFmsYcMOvn0APl9tfov0bXqXAqLmDUcCf5oF0Aw/4w1iFR2ttuDhrdw7GjVyZWOnx/XiMZSx4vSQ==", + "requires": { + "babel-runtime": "^6.26.0", + "bluebird": "^3.4.3", + "chalk": "^2.3.0", + "create-error": "~0.3.1", + "inflection": "^1.5.1", + "inherits": "~2.0.1", + "lodash": "^4.13.1" + } + }, + "bootstrap": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", + "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==", + "dev": true + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "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" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "requires": { + "JSONStream": "^1.0.3", + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + } + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "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=" + } + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "browserify": { + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", + "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", + "requires": { + "JSONStream": "^1.0.3", + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "^5.0.2", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "labeled-stream-splicer": "^2.0.0", + "mkdirp": "^0.5.0", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^2.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { - "safe-buffer": "~5.1.0" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "^2.0.0" - } + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "optional": true + "events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==" }, - "tar": { - "version": "4.4.1", - "bundled": true, - "optional": true, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==" + } + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + } + }, + "buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cached-path-relative": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", + "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==" + }, + "caching-transform": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", + "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", + "dev": true, + "requires": { + "hasha": "^3.0.0", + "make-dir": "^2.0.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.4.2" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", - "yallist": "^3.0.2" + "pify": "^4.0.1", + "semver": "^5.6.0" } }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "optional": true + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "optional": true, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "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": { - "string-width": "^1.0.2" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true } } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "caniuse-lite": { + "version": "1.0.30000884", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000884.tgz", + "integrity": "sha512-ibROerckpTH6U5zReSjbaitlH4gl5V4NWNCBzRNCa3GEDmzzkfStk+2k5mO4ZDM6pwtdjbZ3hjvsYhPGVLWgNw==", "dev": true }, - "get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true, + "optional": true + }, + "catharsis": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.10.tgz", + "integrity": "sha512-l2OUaz/3PU3MZylspVFJvwHCVfWyvcduPq4lv3AzZ2pJzZCo7kNKFNyatwujD7XgvGkNAE/Jhhbh2uARNwNkfw==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^3.0.0", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", + "type-detect": "^4.0.0" + } + }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "requires": { + "check-error": "^1.0.2" + } + }, + "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" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", "dev": true }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, - "get-own-enumerable-property-symbols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz", - "integrity": "sha512-TtY/sbOemiMKPRUDDanGCSgBYe7Mf0vbRsWnBZ+9yghpZ1MvcpSpuZFjHdEeY/LZjZy0vdLjS77L6HosisFiug==", + "check-types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", + "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==", "dev": true }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + }, + "dependencies": { + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "requires": { + "is-extglob": "^2.1.1" + } + } + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", "dev": true }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", + "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + "ci-info": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.4.0.tgz", + "integrity": "sha512-Oqmw2pVfCl8sCL+1QgMywPfdxPJPkC51y4usw0iiE2S9qnEOAqXy8bwl1CpMpnoU39g4iKJTz6QZj+28FvOnjQ==" }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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 + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "clean-webpack-plugin": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-0.1.19.tgz", + "integrity": "sha512-M1Li5yLHECcN2MahoreuODul5LkjohJGFxLPTjl3j1ttKrF5rgjZET1SJduuqxLAuT1gAPOdkhg03qcaaU1KeA==", "dev": true, - "optional": true, "requires": { - "assert-plus": "^1.0.0" + "rimraf": "^2.6.1" } }, - "git-rev": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/git-rev/-/git-rev-0.2.1.tgz", - "integrity": "sha1-jMvSCSs0W8LJFJVIOW31SWRspj8=" + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "restore-cursor": "^2.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "cli-spinners": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", + "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", + "dev": true + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", "dev": true, - "optional": true, "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" }, "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, - "optional": true, "requires": { - "is-glob": "^2.0.0" + "number-is-nan": "^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=", + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "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=", + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" } } } }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true }, - "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "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": { - "min-document": "^2.19.0", - "process": "~0.5.1" - }, - "dependencies": { - "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", - "dev": true - } + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" } }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "requires": { - "ini": "^1.3.4" - } + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true }, - "global-modules": { + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, - "global-modules-path": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz", - "integrity": "sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==", - "dev": true - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "color-name": "1.1.3" } }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", - "dev": true + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", "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" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" } }, - "got": { - "version": "6.7.1", - "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" + "delayed-stream": "~1.0.0" } }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "gzip-size": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-4.1.0.tgz", - "integrity": "sha1-iuCWJX6r59acRb4rZ8RIEk/7UXw=", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "pify": "^3.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true, - "optional": 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, - "optional": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - }, - "dependencies": { - "ajv": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", - "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", - "dev": true, - "optional": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true, - "optional": 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, - "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=" }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "compressible": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz", + "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=", "requires": { - "function-bind": "^1.1.1" + "mime-db": ">= 1.34.0 < 2" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "compression": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", + "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", "requires": { - "ansi-regex": "^2.0.0" + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.14", + "debug": "2.6.9", + "on-headers": "~1.0.1", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "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" + } } } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "concat-stream": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", + "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", + "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "inherits": "~2.0.1", + "readable-stream": "~2.0.0", + "typedarray": "~0.0.5" }, "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, "requires": { - "is-buffer": "^1.1.5" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true } } }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, - "hash.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", - "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "connect-redis": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-3.3.3.tgz", + "integrity": "sha512-rpWsW2uk1uOe/ccY/JvW+RiLrhZm7auIx8z4yR+KXemFTIhJyD58jXiJbI0E/fZCnybawpdSqOZ+6/ah6aBeyg==", "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "debug": "^3.1.0", + "redis": "^2.1.0" } }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "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.1.3", + "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" } }, - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, - "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=", + "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==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", + "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", "dev": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.1" + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0", + "require-from-string": "^2.0.1" + }, + "dependencies": { + "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" + } + } + } + }, + "cp-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", + "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "make-dir": "^2.0.0", + "nested-error-stacks": "^2.0.0", + "pify": "^4.0.1", + "safe-buffer": "^5.0.1" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } } }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "crc": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz", + "integrity": "sha1-naHpgOO9RPxck79as9ozeNheRms=" + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "requires": { - "parse-passwd": "^1.0.0" + "bn.js": "^4.1.0", + "elliptic": "^6.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==", - "dev": true - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + "create-error": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/create-error/-/create-error-0.3.1.tgz", + "integrity": "sha1-aYECRaYp5lRDK/BDdzYAA6U1GiM=" }, - "htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=" + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "requires": { + "capture-stack-trace": "^1.0.0" + } }, - "htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { - "domelementtype": "^1.3.0", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", + "cipher-base": "^1.0.1", "inherits": "^2.0.1", - "readable-stream": "^2.0.2" + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "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=", + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "cross-env": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz", + "integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==", "dev": true, - "optional": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "cross-spawn": "^6.0.5", + "is-windows": "^1.0.0" + }, + "dependencies": { + "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" + } + } } }, - "http-status": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-status/-/http-status-1.2.0.tgz", - "integrity": "sha512-cSX+i/g4Kj5lkfOqS9w0SrxQF4hX7gsfikBtSDm5PFrAy+8fjRKk9+JRCG5cEZ40b6q6GOJk3P0QyDB5JpE0Ig==" - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "requires": { - "ms": "^2.0.0" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, - "husky": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz", - "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==", + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", "dev": true, "requires": { - "is-ci": "^1.0.10", - "normalize-path": "^1.0.0", - "strip-indent": "^2.0.0" + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" }, "dependencies": { - "normalize-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", - "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", + "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 } } }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "css-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.0.tgz", + "integrity": "sha512-tMXlTYf3mIMt3b0dDCOQFJiVvxbocJ5Ho577WiGPYPZcqVEO218L2iU22pDXzkTZCLDE+9AmGSUkWxeh/nZReA==", + "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash.camelcase": "^4.3.0", + "postcss": "^6.0.23", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" } }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, - "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "css-selector-tokenizer": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", "dev": true, "requires": { - "postcss": "^6.0.1" + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + }, + "dependencies": { + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + } } }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true }, - "immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=" + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true }, - "import-local": { + "dash-ast": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, + "optional": true, "requires": { - "pkg-dir": "^2.0.0", - "resolve-cwd": "^2.0.0" + "assert-plus": "^1.0.0" } }, - "imurmurhash": { + "date-fns": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", + "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", + "dev": true + }, + "date-now": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "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" + } + }, + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", "dev": true, "requires": { - "repeating": "^2.0.0" + "xregexp": "4.0.0" } }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, - "inflection": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", - "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "deep-diff": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-1.0.2.tgz", + "integrity": "sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==" + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "type-detect": "^4.0.0" } }, - "influx": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/influx/-/influx-5.0.7.tgz", - "integrity": "sha1-NeZfa/E8uqF2MQi1WWqAanJ6Upo=" - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true }, - "inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, "requires": { - "source-map": "~0.5.3" + "strip-bom": "^3.0.0" } }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "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": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" + "object-keys": "^1.0.12" } }, - "insert-module-globals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", - "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "requires": { - "JSONStream": "^1.0.3", - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, "requires": { - "loose-envify": "^1.0.0" + "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" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } } }, - "invert-kv": { + "delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "deps-sort": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", + "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" + "JSONStream": "^1.0.3", + "shasum": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "deps-topo-sort": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/deps-topo-sort/-/deps-topo-sort-0.2.1.tgz", + "integrity": "sha1-S+ivB0dpcWSciwxIT9fUqHuLASo=", + "dev": true, "requires": { - "kind-of": "^3.0.2" + "JSONStream": "~0.7.1", + "minimist": "0.0.5", + "through": "~2.3.4" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "JSONStream": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.7.4.tgz", + "integrity": "sha1-c0KQ5BUR7qfCz+FR+/mlY6l7l4Y=", + "dev": true, "requires": { - "is-buffer": "^1.1.5" + "jsonparse": "0.0.5", + "through": ">=2.2.7 <3" } + }, + "jsonparse": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", + "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", + "dev": true + }, + "minimist": { + "version": "0.0.5", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.5.tgz", + "integrity": "sha1-16oye87PUY+RBqxrjwA/o7zqhWY=", + "dev": true } } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "requires": { - "binary-extensions": "^1.0.0" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "is-builtin-module": { + "detect-file": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "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": { - "builtin-modules": "^1.0.0" + "repeating": "^2.0.0" } }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "requires": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", "dev": true }, - "is-ci": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.0.tgz", - "integrity": "sha512-plgvKjQtalH2P3Gytb7L61Lmz95g2DlpzFiQyRSFew8WoJKxtKRzrZMeyRN2supblm3Psc8OQGy7Xjb6XG11jw==", + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { - "ci-info": "^1.3.0" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } + "esutils": "^2.0.2" } }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true + "dom-helpers": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.3.1.tgz", + "integrity": "sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg==" }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "domelementtype": "~1.1.1", + "entities": "~1.1.1" }, "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" } } }, - "is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", "dev": true }, - "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, - "optional": true + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "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, - "optional": true, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "requires": { - "is-primitive": "^2.0.0" + "domelementtype": "1" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "requires": { + "is-obj": "^1.0.0" + } }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, + "double-ended-queue": { + "version": "2.1.0-0", + "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", + "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=" + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "requires": { - "number-is-nan": "^1.0.0" + "readable-stream": "^2.0.2" } }, - "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=" + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "duplexify": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "dev": true, "requires": { - "is-extglob": "^2.1.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "optional": true, "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true + }, + "elasticsearch": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/elasticsearch/-/elasticsearch-15.2.0.tgz", + "integrity": "sha512-jOFcBoEh3Sn3gjUTozInODZTLriJtfppAUC7jnQCUE+OUj8o7GoAyC+L4h/L3ZxmXNFbQCunqVR+nmSofHdo9A==", "requires": { - "kind-of": "^3.0.2" + "agentkeepalive": "^3.4.1", + "chalk": "^1.0.0", + "lodash": "^4.17.10" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "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=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "is-buffer": "^1.1.5" + "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-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.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=" } } }, - "is-obj": { + "electron-to-chromium": { + "version": "1.3.62", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.62.tgz", + "integrity": "sha512-x09ndL/Gjnuk3unlAyoGyUg3wbs4w/bXurgL7wL913vXHAOWmMhrLf1VNGRaMLngmadd5Q8gsV9BFuIr6rP+Xg==", + "dev": true + }, + "elegant-spinner": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", + "dev": true }, - "is-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", - "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", - "dev": true, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", "requires": { - "symbol-observable": "^0.2.2" - }, - "dependencies": { - "symbol-observable": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", - "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=", - "dev": true - } + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, - "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=", + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, - "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" - } + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "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=", - "requires": { - "path-is-inside": "^1.0.1" - } + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, - "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==", + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "isobject": "^3.0.1" + "iconv-lite": "~0.4.13" } }, - "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, - "optional": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "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==", "dev": true, - "optional": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + "requires": { + "once": "^1.4.0" + } }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", "dev": true, "requires": { - "has": "^1.0.1" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" } }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", - "dev": true + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" }, - "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==", + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, "requires": { - "is-unc-path": "^1.0.0" + "prr": "~1.0.1" } }, - "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-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "optional": 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-arrayish": "^0.2.1" } }, - "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=" - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "dev": true, - "optional": true + "requires": { + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" + } }, - "jest-get-type": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-21.2.0.tgz", - "integrity": "sha512-y2fFw3C+D0yjNSDp7ab1kcd6NUYfy3waPTlD8yWkAtiocJdBRQqNoRqVfMNxgj+IjT0V5cBIHJO0z9vuSSZ43Q==", + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, - "jest-validate": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-21.2.1.tgz", - "integrity": "sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg==", + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "eslint": { + "version": "4.19.1", + "resolved": "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", + "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", "dev": true, "requires": { - "chalk": "^2.0.1", - "jest-get-type": "^21.2.0", - "leven": "^2.1.0", - "pretty-format": "^21.2.1" + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.1.0", + "doctrine": "^2.1.0", + "eslint-scope": "^3.7.1", + "eslint-visitor-keys": "^1.0.0", + "espree": "^3.5.4", + "esquery": "^1.0.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "regexpp": "^1.0.1", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "4.0.2", + "text-table": "~0.2.0" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "globals": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz", + "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==", + "dev": true + } } }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "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==", + "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==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "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" + } + } } }, - "js2xmlparser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz", - "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=", + "eslint-loader": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.1.0.tgz", + "integrity": "sha512-f4A/Yk7qF+HcFSz5Tck2QoKIwJVHlX0soJk5MkROYahb5uvspad5Ba60rrz4u/V2/MEj1dtp/uBi6LlLWVaY7Q==", "dev": true, "requires": { - "xmlcreate": "^1.0.1" + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdoc": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.5.tgz", - "integrity": "sha512-6PxB65TAU4WO0Wzyr/4/YhlGovXl0EVYfpKbpSroSj0qBxT4/xod/l40Opkm38dRHRdQgdeY836M0uVnJQG7kg==", - "dev": true, - "requires": { - "babylon": "7.0.0-beta.19", - "bluebird": "~3.5.0", - "catharsis": "~0.8.9", - "escape-string-regexp": "~1.0.5", - "js2xmlparser": "~3.0.0", - "klaw": "~2.0.0", - "marked": "~0.3.6", - "mkdirp": "~0.5.1", - "requizzle": "~0.2.1", - "strip-json-comments": "~2.0.1", - "taffydb": "2.6.2", - "underscore": "~1.8.3" + "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=", + "dev": true, + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^1.0.0" }, "dependencies": { - "babylon": { - "version": "7.0.0-beta.19", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.19.tgz", - "integrity": "sha512-Vg0C9s/REX6/WIXN37UKpv5ZhRi6A4pjHlpkE34+8/a6c2W1Q692n3hmc+SZG5lKRnaExLUbxtJ1SVT+KaCQ/A==", - "dev": true + "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" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } } } }, - "jsesc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", - "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=" + "eslint-plugin-babel": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-4.1.2.tgz", + "integrity": "sha1-eSAqDjV1fdkngJGbIzbx+i/lPB4=", + "dev": true }, - "jsinspect": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/jsinspect/-/jsinspect-0.12.7.tgz", - "integrity": "sha512-9pLr5r5moX3XhACEg/nhIlprBuqRDT+loYigZo7hidmfOj0EV2l6ZMk6gmaNMiX6o1YCMod1lWSH3JoX80QHLA==", + "eslint-plugin-flowtype": { + "version": "2.50.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.50.0.tgz", + "integrity": "sha512-10FnBXCp8odYcpUFXGAh+Zko7py0hUWutTd3BN/R9riukH360qNPLYPR3/xV9eu9K7OJDjJrsflBnL6RwxFnlw==", "dev": true, "requires": { - "babylon": "6.16.1", - "chalk": "^2.1.0", - "commander": "^2.11.0", - "filepaths": "0.3.0", - "stable": "^0.1.6", - "strip-indent": "^1.0.1", - "strip-json-comments": "1.0.2" + "lodash": "^4.17.10" + } + }, + "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==", + "dev": true, + "requires": { + "contains-path": "^0.1.0", + "debug": "^2.6.8", + "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", + "read-pkg-up": "^2.0.0", + "resolve": "^1.6.0" }, "dependencies": { - "babylon": { - "version": "6.16.1", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.16.1.tgz", - "integrity": "sha1-MMWiL0gZeKnn+M399JaxHZS0BNM=", - "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "get-stdin": "^4.0.1" + "ms": "2.0.0" } }, - "strip-json-comments": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.2.tgz", - "integrity": "sha1-WkirlgI9usG3uND/q/b2PxZ3vp8=", - "dev": true + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } } } }, - "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", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "eslint-plugin-react": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", + "integrity": "sha512-cVVyMadRyW7qsIUh3FHp3u6QHNhOgVrLQYdQEB1bPWBsgbNCHdFAeNMquBMCcZJu59eNthX053L70l7gRt4SCw==", "dev": true, - "optional": true - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true + "requires": { + "array-includes": "^3.0.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.0.1", + "prop-types": "^15.6.2" + } }, - "json-stable-stringify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", - "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, "requires": { - "jsonify": "~0.0.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", "dev": true }, - "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=", + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", "dev": true, - "optional": true + "requires": { + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + } }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "dev": true, - "optional": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "estraverse": "^4.0.0" } }, - "jsx-ast-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", - "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "array-includes": "^3.0.3" + "estraverse": "^4.1.0" } }, - "keycode": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", - "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true }, - "klaw": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-2.0.0.tgz", - "integrity": "sha1-WcEo4Nxc5BAgEVEZTuucv4WGUPY=", - "dev": true, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-stream": { + "version": "3.3.4", + "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "requires": { - "graceful-fs": "^4.1.9" + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" } }, - "knex": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/knex/-/knex-0.15.2.tgz", - "integrity": "sha1-YFm4dIlgX0zIdZmm0qnSZXCek0A=", + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "requires": { - "babel-runtime": "^6.26.0", - "bluebird": "^3.5.1", - "chalk": "2.3.2", - "commander": "^2.16.0", - "debug": "3.1.0", - "inherits": "~2.0.3", - "interpret": "^1.1.0", - "liftoff": "2.5.0", - "lodash": "^4.17.10", - "minimist": "1.2.0", - "mkdirp": "^0.5.1", - "pg-connection-string": "2.0.0", - "tarn": "^1.1.4", - "tildify": "1.2.0", - "uuid": "^3.3.2", - "v8flags": "^3.1.1" - }, - "dependencies": { - "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - } + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, - "labeled-stream-splicer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz", - "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==", + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "requires": { - "inherits": "^2.0.1", - "isarray": "^2.0.4", - "stream-splicer": "^2.0.0" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { - "isarray": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", - "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==" + "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", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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" + } } } }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "requires": { - "package-json": "^4.0.0" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "less": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/less/-/less-3.8.1.tgz", - "integrity": "sha512-8HFGuWmL3FhQR0aH89escFNBQH/nEiYPP2ltDFdQw2chE28Yx2E3lhAIq9Y2saYwLSwa699s4dBVEfCY8Drf7Q==", + "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, + "optional": true, "requires": { - "clone": "^2.1.2", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "mime": "^1.4.1", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "^2.83.0", - "source-map": "~0.6.0" + "fill-range": "^2.1.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==", + "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, - "optional": true + "optional": 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, + "optional": 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, + "optional": 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, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } } } }, - "less-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", - "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "loader-utils": "^1.1.0", - "pify": "^3.0.0" - } - }, - "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", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "libpq": { - "version": "1.8.8", - "resolved": "https://registry.npmjs.org/libpq/-/libpq-1.8.8.tgz", - "integrity": "sha512-0TVzqkbAZZiM8JJy5sagRyXOkvU9zTBlgGX6YdzuWECobc5F81Tp6uuS+djMZrnB5YN4O/ff52hsvXYBRW2gdQ==", + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "requires": { - "bindings": "1.2.1", - "nan": "^2.10.0" + "homedir-polyfill": "^1.0.1" } }, - "liftoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", - "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", "requires": { - "extend": "^3.0.0", - "findup-sync": "^2.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "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", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "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", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + } + }, + "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" + } + }, + "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==" + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "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=" + } + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } } }, - "lint-staged": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-6.1.1.tgz", - "integrity": "sha512-M/7bwLdXbeG7ZNLcasGeLMBDg60/w6obj3KOtINwJyxAxb53XGY0yH5FSZlWklEzuVbTtqtIfAajh6jYIN90AA==", - "dev": true, + "express-session": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz", + "integrity": "sha512-r0nrHTCYtAMrFwZ0kBzZEXa1vtPVrw0dKvGSrKP4dahwBQ1BJpF2/y1Pp4sCD/0kvxV4zZeclyvfmw0B4RMJQA==", "requires": { - "app-root-path": "^2.0.0", - "chalk": "^2.1.0", - "commander": "^2.11.0", - "cosmiconfig": "^4.0.0", - "debug": "^3.1.0", - "dedent": "^0.7.0", - "execa": "^0.8.0", - "find-parent-dir": "^0.3.0", - "is-glob": "^4.0.0", - "jest-validate": "^21.1.0", - "listr": "^0.13.0", - "lodash": "^4.17.4", - "log-symbols": "^2.0.0", - "minimatch": "^3.0.0", - "npm-which": "^3.0.1", - "p-map": "^1.1.1", - "path-is-inside": "^1.0.2", - "pify": "^3.0.0", - "staged-git-files": "1.0.0", - "stringify-object": "^3.2.0" + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "crc": "3.4.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "on-headers": "~1.0.1", + "parseurl": "~1.3.2", + "uid-safe": "~2.1.5", + "utils-merge": "1.0.1" }, "dependencies": { - "execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.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" - } - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "is-extglob": "^2.1.1" + "ms": "2.0.0" } } } }, - "listr": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.13.0.tgz", - "integrity": "sha1-ILsLowuuZg7oTMBQPfS+PVYjiH0=", - "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": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "requires": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "figures": "^1.7.0", - "indent-string": "^2.1.0", - "is-observable": "^0.2.0", - "is-promise": "^2.1.0", - "is-stream": "^1.1.0", - "listr-silent-renderer": "^1.1.1", - "listr-update-renderer": "^0.4.0", - "listr-verbose-renderer": "^0.4.0", - "log-symbols": "^1.0.2", - "log-update": "^1.0.2", - "ora": "^0.2.3", - "p-map": "^1.1.1", - "rxjs": "^5.4.2", - "stream-to-observable": "^0.2.0", - "strip-ansi": "^3.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "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": "http://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" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "^1.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { - "ansi-regex": "^2.0.0" + "is-plain-object": "^2.0.4" } - }, - "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 } } }, - "listr-silent-renderer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", - "dev": true - }, - "listr-update-renderer": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz", - "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=", + "external-editor": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", "dev": true, "requires": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "elegant-spinner": "^1.0.1", - "figures": "^1.7.0", - "indent-string": "^3.0.0", - "log-symbols": "^1.0.2", - "log-update": "^1.0.2", - "strip-ansi": "^3.0.1" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "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": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "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-descriptor": "^1.0.0" } }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "is-extendable": "^0.1.0" } }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "chalk": "^1.0.0" + "kind-of": "^6.0.0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "ansi-regex": "^2.0.0" + "kind-of": "^6.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 + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } } } }, - "listr-verbose-renderer": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", - "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "factor-bundle": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/factor-bundle/-/factor-bundle-2.5.0.tgz", + "integrity": "sha1-jqiVfaOddYYoPMPuNTzZkRpF53k=", "dev": true, "requires": { - "chalk": "^1.1.3", - "cli-cursor": "^1.0.2", - "date-fns": "^1.27.2", - "figures": "^1.7.0" + "JSONStream": "~0.8.4", + "browser-pack": "^5.0.1", + "defined": "0.0.0", + "deps-topo-sort": "~0.2.1", + "inherits": "^2.0.1", + "isarray": "0.0.1", + "labeled-stream-splicer": "^1.0.0", + "minimist": "~0.2.0", + "nub": "0.0.0", + "outpipe": "^1.1.0", + "reversepoint": "~0.2.0", + "stream-combiner": "~0.2.1", + "through2": "^0.5.1", + "xtend": "^4.0.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "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": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "JSONStream": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", + "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", "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" + "jsonparse": "0.0.5", + "through": ">=2.2.7 <3" + }, + "dependencies": { + "jsonparse": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", + "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", + "dev": true + } } }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "browser-pack": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-5.0.1.tgz", + "integrity": "sha1-QZdxmyDG4KqglFHFER5T77b7wY0=", "dev": true, "requires": { - "restore-cursor": "^1.0.1" + "JSONStream": "^1.0.3", + "combine-source-map": "~0.6.1", + "defined": "^1.0.0", + "through2": "^1.0.0", + "umd": "^3.0.0" + }, + "dependencies": { + "JSONStream": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.4.tgz", + "integrity": "sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "dev": true, + "requires": { + "readable-stream": ">=1.1.13-1 <1.2.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } } }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "combine-source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.6.1.tgz", + "integrity": "sha1-m0oJwxYDPXaODxHgKfonMOB5rZY=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.5.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.4.2" } }, - "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "defined": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-0.0.0.tgz", + "integrity": "sha1-817qfXBekzuvE7LwOz+D2SFAOz4=", "dev": true }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "inline-source-map": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.5.0.tgz", + "integrity": "sha1-Skxd2OT7Xps82mDIIt+tyu5m4K8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "source-map": "~0.4.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 - } - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true - } - } - }, - "loader-fs-cache": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", - "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", - "dev": true, - "requires": { - "find-cache-dir": "^0.1.1", - "mkdirp": "0.5.1" - }, - "dependencies": { - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + }, + "labeled-stream-splicer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz", + "integrity": "sha1-RhUzFTd4SYHo/SZOHzpDTE4N3WU=", "dev": true, "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" + "inherits": "^2.0.1", + "isarray": "~0.0.1", + "stream-splicer": "^1.1.0" } }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "minimist": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.2.0.tgz", + "integrity": "sha1-Tf/lJdriuGTGbC4jxicdev3s784=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "pinkie-promise": "^2.0.0" + "amdefine": ">=0.0.4" } }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", "dev": true, "requires": { - "find-up": "^1.0.0" + "duplexer": "~0.1.1", + "through": "~2.3.4" } - } - } - }, - "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", - "dev": true - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.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" - } - }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" - }, - "lodash-es": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.10.tgz", - "integrity": "sha512-iesFYPmxYYGTcmQK0sL8bX3TGHyM6b2qREaB4kamHfQyfPJP0xgoGxp19nsH16nsfquLdiyKyX3mQkfiSGV8Rg==" - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basefor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", - "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=" - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", - "dev": true - }, - "lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", - "dev": true, - "requires": { - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash.restparam": "^3.0.0" - } - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" - }, - "lodash.isplainobject": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-3.2.0.tgz", - "integrity": "sha1-moI4rhayAEMpYM1zRlEtASP79MU=", - "requires": { - "lodash._basefor": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.keysin": "^3.0.0" - } - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.keysin": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-3.0.8.tgz", - "integrity": "sha1-IsRJPrvtsUJ5YqVLRFssinZ/tH8=", - "requires": { - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.mapvalues": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=" - }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "log": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/log/-/log-1.4.0.tgz", - "integrity": "sha1-S6HYkP3iSbAx3KA7w36q8yVlbxw=" - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "log-update": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", - "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", - "dev": true, - "requires": { - "ansi-escapes": "^1.0.0", - "cli-cursor": "^1.0.2" - }, - "dependencies": { - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "stream-splicer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-1.3.2.tgz", + "integrity": "sha1-PARBvhW5v04iYnXm3IOWR0VUZmE=", "dev": true, "requires": { - "restore-cursor": "^1.0.1" + "indexof": "0.0.1", + "inherits": "^2.0.1", + "isarray": "~0.0.1", + "readable-stream": "^1.1.13-1", + "readable-wrap": "^1.0.0", + "through2": "^1.0.0" + }, + "dependencies": { + "through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha1-CEfLxESfNAVXTb3M2buEG4OsNUU=", + "dev": true, + "requires": { + "readable-stream": ">=1.1.13-1 <1.2.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } } }, - "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", "dev": true, "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "readable-stream": "~1.0.17", + "xtend": "~3.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true + } } } } }, - "long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", - "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==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" - }, - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "requires": { - "pify": "^3.0.0" - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "requires": { - "kind-of": "^6.0.2" - } - }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" - }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=" - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "requires": { - "object-visit": "^1.0.0" - } - }, - "marked": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", - "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", - "dev": true - }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true, - "optional": true - }, - "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "mem": { + "fast-deep-equal": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" - }, - "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==" - }, - "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", - "requires": { - "mime-db": "~1.36.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", "dev": true }, - "min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, - "requires": { - "dom-walk": "^0.1.0" - } - }, - "mini-css-extract-plugin": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.2.tgz", - "integrity": "sha512-ots7URQH4wccfJq9Ssrzu2+qupbncAce4TmTzunI9CIwlQMp2XI+WNUw6xWF6MMAGAm1cbUVINrSjATaVMyKXg==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - } + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "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 }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + "fastparse": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "dev": true }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", "requires": { - "brace-expansion": "^1.1.7" + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + } } }, - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "mississippi": { + "figures": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", - "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" + "escape-string-regexp": "^1.0.5" } }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - } + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "file-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz", + "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==", + "dev": true, "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" } }, - "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "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, + "optional": true + }, + "filepaths": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/filepaths/-/filepaths-0.3.0.tgz", + "integrity": "sha1-ocmkYBturn+4dvwayYR5zrVXwXc=", + "dev": true + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "has-flag": "^2.0.0" + "is-extendable": "^0.1.0" } } } }, - "module-deps": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz", - "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=", - "requires": { - "JSONStream": "^1.0.3", - "browser-resolve": "^1.7.0", - "cached-path-relative": "^1.0.0", - "concat-stream": "~1.5.0", - "defined": "^1.0.0", - "detective": "^4.0.0", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.3", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "moment": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", - "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" - }, - "morgan": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", - "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "requires": { - "basic-auth": "~2.0.0", "debug": "2.6.9", - "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", "on-finished": "~2.3.0", - "on-headers": "~1.0.1" + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" }, "dependencies": { "debug": { @@ -7821,2865 +5446,4089 @@ "requires": { "ms": "2.0.0" } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" } } }, - "move-concurrently": { + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-parent-dir": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.0.tgz", + "integrity": "sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ=", + "dev": true + }, + "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" + } + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "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", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "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=", "dev": true, "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "flow-bin": { + "version": "0.69.0", + "resolved": "http://registry.npmjs.org/flow-bin/-/flow-bin-0.69.0.tgz", + "integrity": "sha512-SC5kiOiMk+8o1N2ZQ1mBfi0qBDYM+r6ZFQS7s+zXtyKrkbtCP+6JRTVvO3KXOnv568SK1G+Kg8/LlJwgyR+8Ug==", "dev": true }, - "nan": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.0.tgz", - "integrity": "sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" } }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "negotiator": { + "flux-standard-action": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" - }, - "neo-async": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.2.tgz", - "integrity": "sha512-vdqTKI9GBIYcAEbFAcpKPErKINfPF5zIuz3/niBfq8WUZjpT2tytLlFVrBgWdOtqI4uaA/Rb6No0hux39XXDuw==", - "dev": true + "resolved": "https://registry.npmjs.org/flux-standard-action/-/flux-standard-action-0.6.1.tgz", + "integrity": "sha1-bzQhG5SDTqHDzDD056+tPQ+/caI=", + "requires": { + "lodash.isplainobject": "^3.2.0" + } }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" + "for-in": "^1.0.1" } }, - "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", "dev": true, "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^1.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.10.3", - "vm-browserify": "0.0.4" + "cross-spawn": "^4", + "signal-exit": "^3.0.0" }, "dependencies": { - "buffer": { - "version": "4.9.1", - "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", "dev": true, "requires": { - "setimmediate": "^1.0.4" + "lru-cache": "^4.0.1", + "which": "^1.2.9" } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true } } }, - "nodemon": { - "version": "1.18.4", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.18.4.tgz", - "integrity": "sha512-hyK6vl65IPnky/ee+D3IWvVGgJa/m3No2/Xc/3wanS6Ce1MWjCzH6NnhPJ/vZM+6JFym16jtHx51lmCMB9HDtg==", - "requires": { - "chokidar": "^2.0.2", - "debug": "^3.1.0", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.0", - "semver": "^5.5.0", - "supports-color": "^5.2.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.2", - "update-notifier": "^2.3.0" - } + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "optional": true }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "abbrev": "1" + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" } }, - "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==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } + "formidable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", + "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, - "npm-path": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", - "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", - "dev": true, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "requires": { - "which": "^1.2.10" + "map-cache": "^0.2.2" } }, - "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=", - "requires": { - "path-key": "^2.0.0" - } + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" }, - "npm-which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", - "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { - "commander": "^2.9.0", - "npm-path": "^2.0.2", - "which": "^1.2.10" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, - "nub": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/nub/-/nub-0.0.0.tgz", - "integrity": "sha1-s2m9Mr3eZq9ZYFw7BSC8IZ3MwE8=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", "dev": true }, - "nyc": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.9.0.tgz", - "integrity": "sha512-w8OdJAhXL5izerzZMdqzYKMj/pgHJyY3qEPYBjLLxrhcVoHEY9pU5ENIiZyCgG9OR7x3VcUMoD40o6PtVpfR4g==", + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "dev": true, "requires": { - "archy": "^1.0.0", - "arrify": "^1.0.1", - "caching-transform": "^1.0.0", - "convert-source-map": "^1.5.1", - "debug-log": "^1.0.1", - "default-require-extensions": "^1.0.0", - "find-cache-dir": "^0.1.1", - "find-up": "^2.1.0", - "foreground-child": "^1.5.3", - "glob": "^7.0.6", - "istanbul-lib-coverage": "^1.1.2", - "istanbul-lib-hook": "^1.1.0", - "istanbul-lib-instrument": "^1.10.0", - "istanbul-lib-report": "^1.1.3", - "istanbul-lib-source-maps": "^1.2.3", - "istanbul-reports": "^1.4.0", - "md5-hex": "^1.2.0", - "merge-source-map": "^1.1.0", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.0", - "resolve-from": "^2.0.0", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.1", - "spawn-wrap": "^1.4.2", - "test-exclude": "^4.2.0", - "yargs": "11.1.0", - "yargs-parser": "^8.0.0" + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" }, "dependencies": { - "align-text": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, - "amdefine": { - "version": "1.0.1", + "abbrev": { + "version": "1.1.1", "bundled": true, - "dev": true + "optional": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true, - "dev": true + "bundled": true }, - "ansi-styles": { - "version": "2.2.1", + "aproba": { + "version": "1.2.0", "bundled": true, - "dev": true + "optional": true }, - "append-transform": { - "version": "0.4.0", + "are-we-there-yet": { + "version": "1.1.5", "bundled": true, - "dev": true, + "optional": true, "requires": { - "default-require-extensions": "^1.0.0" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, - "archy": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "bundled": true, - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "bundled": true, - "dev": true - }, - "arrify": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "assign-symbols": { + "balanced-match": { "version": "1.0.0", - "bundled": true, - "dev": true - }, - "async": { - "version": "1.5.2", - "bundled": true, - "dev": true - }, - "atob": { - "version": "2.1.1", - "bundled": true, - "dev": true + "bundled": true }, - "babel-code-frame": { - "version": "6.26.0", + "brace-expansion": { + "version": "1.1.11", "bundled": true, - "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "babel-generator": { - "version": "6.26.1", + "chownr": { + "version": "1.1.1", "bundled": true, - "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" - } + "optional": true }, - "babel-messages": { - "version": "6.23.0", - "bundled": true, - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } + "code-point-at": { + "version": "1.1.0", + "bundled": true }, - "babel-runtime": { - "version": "6.26.0", - "bundled": true, - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } + "concat-map": { + "version": "0.0.1", + "bundled": true }, - "babel-template": { - "version": "6.26.0", - "bundled": true, - "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" - } + "console-control-strings": { + "version": "1.1.0", + "bundled": true }, - "babel-traverse": { - "version": "6.26.0", + "core-util-is": { + "version": "1.0.2", "bundled": true, - "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" - } + "optional": true }, - "babel-types": { - "version": "6.26.0", + "debug": { + "version": "4.1.1", "bundled": true, - "dev": true, + "optional": true, "requires": { - "babel-runtime": "^6.26.0", - "esutils": "^2.0.2", - "lodash": "^4.17.4", - "to-fast-properties": "^1.0.3" + "ms": "^2.1.1" } }, - "babylon": { - "version": "6.18.0", + "deep-extend": { + "version": "0.6.0", "bundled": true, - "dev": true + "optional": true }, - "balanced-match": { + "delegates": { "version": "1.0.0", "bundled": true, - "dev": true - }, - "base": { - "version": "0.11.2", - "bundled": true, - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } - } + "optional": true }, - "brace-expansion": { - "version": "1.1.11", + "detect-libc": { + "version": "1.0.3", "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "optional": true }, - "braces": { - "version": "2.3.2", + "fs-minipass": { + "version": "1.2.5", "bundled": true, - "dev": true, + "optional": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "minipass": "^2.2.1" } }, - "builtin-modules": { - "version": "1.1.1", + "fs.realpath": { + "version": "1.0.0", "bundled": true, - "dev": true + "optional": true }, - "cache-base": { - "version": "1.0.1", + "gauge": { + "version": "2.7.4", "bundled": true, - "dev": true, + "optional": true, "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, - "caching-transform": { - "version": "1.0.1", + "glob": { + "version": "7.1.3", "bundled": true, - "dev": true, + "optional": true, "requires": { - "md5-hex": "^1.2.0", - "mkdirp": "^0.5.1", - "write-file-atomic": "^1.1.4" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "camelcase": { - "version": "1.2.1", + "has-unicode": { + "version": "2.0.1", "bundled": true, - "dev": true, "optional": true }, - "center-align": { - "version": "0.1.3", + "iconv-lite": { + "version": "0.4.24", "bundled": true, - "dev": true, "optional": true, "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" + "safer-buffer": ">= 2.1.2 < 3" } }, - "chalk": { - "version": "1.1.3", + "ignore-walk": { + "version": "3.0.1", "bundled": true, - "dev": true, + "optional": 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" + "minimatch": "^3.0.4" } }, - "class-utils": { - "version": "0.3.6", + "inflight": { + "version": "1.0.6", "bundled": true, - "dev": true, + "optional": true, "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } + "once": "^1.3.0", + "wrappy": "1" } }, - "cliui": { - "version": "2.1.0", + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true, "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "bundled": true, - "dev": true, - "optional": true - } + "number-is-nan": "^1.0.0" } }, - "code-point-at": { - "version": "1.1.0", + "isarray": { + "version": "1.0.0", "bundled": true, - "dev": true + "optional": true }, - "collection-visit": { - "version": "1.0.0", + "minimatch": { + "version": "3.0.4", "bundled": true, - "dev": true, "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "brace-expansion": "^1.1.7" } }, - "commondir": { - "version": "1.0.1", + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "minipass": { + "version": "2.3.5", "bundled": true, - "dev": true + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } }, - "component-emitter": { + "minizlib": { "version": "1.2.1", "bundled": true, - "dev": true + "optional": true, + "requires": { + "minipass": "^2.2.1" + } }, - "concat-map": { - "version": "0.0.1", + "mkdirp": { + "version": "0.5.1", "bundled": true, - "dev": true + "requires": { + "minimist": "0.0.8" + } }, - "convert-source-map": { - "version": "1.5.1", + "ms": { + "version": "2.1.1", "bundled": true, - "dev": true + "optional": true }, - "copy-descriptor": { - "version": "0.1.1", + "needle": { + "version": "2.3.0", "bundled": true, - "dev": true + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } }, - "core-js": { - "version": "2.5.6", + "node-pre-gyp": { + "version": "0.12.0", "bundled": true, - "dev": true + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } }, - "cross-spawn": { - "version": "4.0.2", + "nopt": { + "version": "4.0.1", "bundled": true, - "dev": true, + "optional": true, "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" + "abbrev": "1", + "osenv": "^0.1.4" } }, - "debug": { - "version": "2.6.9", + "npm-bundled": { + "version": "1.0.6", "bundled": true, - "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "optional": true, "requires": { - "ms": "2.0.0" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, - "debug-log": { + "number-is-nan": { "version": "1.0.1", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", "bundled": true, - "dev": true + "optional": true }, - "decamelize": { - "version": "1.2.0", + "once": { + "version": "1.4.0", "bundled": true, - "dev": true + "requires": { + "wrappy": "1" + } }, - "decode-uri-component": { - "version": "0.2.0", + "os-homedir": { + "version": "1.0.2", "bundled": true, - "dev": true + "optional": true }, - "default-require-extensions": { - "version": "1.0.0", + "os-tmpdir": { + "version": "1.0.2", "bundled": true, - "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, "requires": { - "strip-bom": "^2.0.0" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, - "define-property": { - "version": "2.0.2", + "path-is-absolute": { + "version": "1.0.1", "bundled": true, - "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "kind-of": { - "version": "6.0.2", + "minimist": { + "version": "1.2.0", "bundled": true, - "dev": true + "optional": true } } }, - "detect-indent": { - "version": "4.0.0", + "readable-stream": { + "version": "2.3.6", "bundled": true, - "dev": true, + "optional": true, "requires": { - "repeating": "^2.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "error-ex": { - "version": "1.3.1", + "rimraf": { + "version": "2.6.3", "bundled": true, - "dev": true, + "optional": true, "requires": { - "is-arrayish": "^0.2.1" + "glob": "^7.1.3" } }, - "escape-string-regexp": { - "version": "1.0.5", + "safe-buffer": { + "version": "5.1.2", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", "bundled": true, - "dev": true + "optional": true }, - "esutils": { - "version": "2.0.2", + "sax": { + "version": "1.2.4", "bundled": true, - "dev": true + "optional": true }, - "execa": { - "version": "0.7.0", + "semver": { + "version": "5.7.0", "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.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" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } + "optional": true }, - "expand-brackets": { - "version": "2.1.4", + "set-blocking": { + "version": "2.0.0", "bundled": true, - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } + "optional": true }, - "extend-shallow": { + "signal-exit": { "version": "3.0.2", "bundled": true, - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } + "optional": true }, - "extglob": { - "version": "2.0.4", + "string-width": { + "version": "1.0.2", "bundled": true, - "dev": true, "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, - "fill-range": { - "version": "4.0.0", + "string_decoder": { + "version": "1.1.1", "bundled": true, - "dev": true, + "optional": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "safe-buffer": "~5.1.0" } }, - "find-cache-dir": { - "version": "0.1.1", + "strip-ansi": { + "version": "3.0.1", "bundled": true, - "dev": true, "requires": { - "commondir": "^1.0.1", - "mkdirp": "^0.5.1", - "pkg-dir": "^1.0.0" + "ansi-regex": "^2.0.0" } }, - "find-up": { - "version": "2.1.0", + "strip-json-comments": { + "version": "2.0.1", "bundled": true, - "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "optional": true, "requires": { - "locate-path": "^2.0.0" + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" } }, - "for-in": { + "util-deprecate": { "version": "1.0.2", "bundled": true, - "dev": true + "optional": true }, - "foreground-child": { - "version": "1.5.6", + "wide-align": { + "version": "1.1.3", "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-own-enumerable-property-symbols": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz", + "integrity": "sha512-TtY/sbOemiMKPRUDDanGCSgBYe7Mf0vbRsWnBZ+9yghpZ1MvcpSpuZFjHdEeY/LZjZy0vdLjS77L6HosisFiug==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "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, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "git-rev": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/git-rev/-/git-rev-0.2.1.tgz", + "integrity": "sha1-jMvSCSs0W8LJFJVIOW31SWRspj8=" + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "optional": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, + "optional": true, "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" + "is-glob": "^2.0.0" } }, - "fragment-cache": { - "version": "0.2.1", - "bundled": 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-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": { - "map-cache": "^0.2.2" + "is-extglob": "^1.0.0" } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "~0.5.1" + }, + "dependencies": { + "process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", "dev": true - }, - "get-caller-file": { - "version": "1.0.2", - "bundled": true, + } + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "requires": { + "ini": "^1.3.4" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-modules-path": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz", + "integrity": "sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==", + "dev": true + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "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" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true - }, - "get-stream": { - "version": "3.0.0", - "bundled": true, + } + } + }, + "got": { + "version": "6.7.1", + "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "handlebars": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, - "get-value": { - "version": "2.0.6", - "bundled": 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 + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "optional": 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, + "optional": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", + "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", + "dev": true, + "optional": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } }, - "glob": { - "version": "7.1.2", - "bundled": true, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true, + "optional": 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, + "optional": true + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "is-buffer": "^1.1.5" } - }, - "globals": { - "version": "9.18.0", - "bundled": true, - "dev": true - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", + "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hasha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", + "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", + "dev": true, + "requires": { + "is-stream": "^1.0.1" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", + "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" + }, + "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.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, + "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==", + "dev": true + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + }, + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=" + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "requires": { + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "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=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "http-status": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-status/-/http-status-1.2.0.tgz", + "integrity": "sha512-cSX+i/g4Kj5lkfOqS9w0SrxQF4hX7gsfikBtSDm5PFrAy+8fjRKk9+JRCG5cEZ40b6q6GOJk3P0QyDB5JpE0Ig==" + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "requires": { + "ms": "^2.0.0" + } + }, + "husky": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz", + "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==", + "dev": true, + "requires": { + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", + "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", "dev": true - }, - "handlebars": { - "version": "4.0.11", - "bundled": true, - "dev": true, - "requires": { - "async": "^1.4.0", - "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "bundled": true, - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "has-ansi": { - "version": "2.0.0", - "bundled": true, - "dev": true, + } + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", + "dev": true + }, + "icss-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "dev": true, + "requires": { + "postcss": "^6.0.1" + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=" + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "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": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflection": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "influx": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/influx/-/influx-5.0.7.tgz", + "integrity": "sha1-NeZfa/E8uqF2MQi1WWqAanJ6Upo=" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "requires": { + "source-map": "~0.5.3" + } + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "insert-module-globals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", + "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", + "requires": { + "JSONStream": "^1.0.3", + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { - "ansi-regex": "^2.0.0" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } - }, - "has-flag": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "has-value": { - "version": "1.0.0", - "bundled": true, - "dev": true, + } + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ipaddr.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } + "is-buffer": "^1.1.5" } - }, - "has-values": { - "version": "1.0.0", - "bundled": true, - "dev": true, + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "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=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.0.tgz", + "integrity": "sha512-plgvKjQtalH2P3Gytb7L61Lmz95g2DlpzFiQyRSFew8WoJKxtKRzrZMeyRN2supblm3Psc8OQGy7Xjb6XG11jw==", + "requires": { + "ci-info": "^1.3.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-buffer": "^1.1.5" } - }, - "hosted-git-info": { - "version": "2.6.0", - "bundled": true, - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "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, + "optional": 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, + "optional": 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", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.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", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-observable": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", + "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=", + "dev": true, + "requires": { + "symbol-observable": "^0.2.2" + }, + "dependencies": { + "symbol-observable": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", + "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=", "dev": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, + } + } + }, + "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-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=", + "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" + } + }, + "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, + "optional": 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, + "optional": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "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==", + "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-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true, + "optional": 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-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=" + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + } + }, + "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, + "optional": true + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "@babel/highlight": "^7.0.0" } }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "invariant": { - "version": "2.2.4", - "bundled": true, + "@babel/generator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", "dev": true, "requires": { - "loose-envify": "^1.0.0" + "@babel/types": "^7.4.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" } }, - "invert-kv": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "bundled": true, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "is-arrayish": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "bundled": true, - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "bundled": true, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", "dev": true, "requires": { - "builtin-modules": "^1.0.0" + "@babel/types": "^7.0.0" } }, - "is-data-descriptor": { - "version": "0.1.4", - "bundled": true, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "@babel/types": "^7.4.4" } }, - "is-descriptor": { - "version": "0.1.6", - "bundled": true, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "bundled": true, - "dev": true - } + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" } }, - "is-extendable": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "bundled": true, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" } }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-number": { - "version": "3.0.0", - "bundled": true, + "@babel/traverse": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", + "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.5", + "@babel/types": "^7.4.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" } }, - "is-odd": { - "version": "2.0.0", - "bundled": true, + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", "dev": true, "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "bundled": true, - "dev": true - } + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" } }, - "is-plain-object": { - "version": "2.0.4", - "bundled": true, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } + "ms": "^2.1.1" } }, - "is-stream": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "bundled": true, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "is-windows": { - "version": "1.0.2", - "bundled": true, + "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 }, - "isarray": { - "version": "1.0.0", - "bundled": true, + "semver": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", + "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", "dev": true }, - "isexe": { + "to-fast-properties": { "version": "2.0.0", - "bundled": true, - "dev": true - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "istanbul-lib-coverage": { - "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true - }, - "istanbul-lib-hook": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "append-transform": "^0.4.0" - } - }, - "istanbul-lib-instrument": { - "version": "1.10.1", - "bundled": true, - "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.0", - "semver": "^5.3.0" - } - }, - "istanbul-lib-report": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "requires": { - "istanbul-lib-coverage": "^1.1.2", - "mkdirp": "^0.5.1", - "path-parse": "^1.0.5", - "supports-color": "^3.1.2" - }, - "dependencies": { - "supports-color": { - "version": "3.2.3", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.3", - "bundled": true, - "dev": true, - "requires": { - "debug": "^3.1.0", - "istanbul-lib-coverage": "^1.1.2", - "mkdirp": "^0.5.1", - "rimraf": "^2.6.1", - "source-map": "^0.5.3" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "istanbul-reports": { - "version": "1.4.0", - "bundled": true, + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { - "handlebars": "^4.0.3" + "pify": "^4.0.1", + "semver": "^5.6.0" } }, - "js-tokens": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "jsesc": { - "version": "1.3.0", - "bundled": true, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, - "kind-of": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "1.0.4", - "bundled": true, - "dev": true, - "optional": true - }, - "lcid": { - "version": "1.0.0", - "bundled": true, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "invert-kv": "^1.0.0" + "has-flag": "^3.0.0" } - }, - "load-json-file": { - "version": "1.1.0", - "bundled": true, + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "ms": "^2.1.1" } }, - "locate-path": { - "version": "2.0.0", - "bundled": true, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "bundled": true, - "dev": true - } + "pify": "^4.0.1", + "semver": "^5.6.0" } }, - "lodash": { - "version": "4.17.10", - "bundled": true, + "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 }, - "longest": { - "version": "1.0.1", - "bundled": true, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, - "loose-envify": { - "version": "1.3.1", - "bundled": true, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "js-tokens": "^3.0.0" + "glob": "^7.1.3" } }, - "lru-cache": { - "version": "4.1.3", - "bundled": true, - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true }, - "map-cache": { - "version": "0.2.2", - "bundled": 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 + } + } + }, + "istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" + } + }, + "jest-get-type": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-21.2.0.tgz", + "integrity": "sha512-y2fFw3C+D0yjNSDp7ab1kcd6NUYfy3waPTlD8yWkAtiocJdBRQqNoRqVfMNxgj+IjT0V5cBIHJO0z9vuSSZ43Q==", + "dev": true + }, + "jest-validate": { + "version": "21.2.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-21.2.1.tgz", + "integrity": "sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^21.2.0", + "leven": "^2.1.0", + "pretty-format": "^21.2.1" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "js2xmlparser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.0.tgz", + "integrity": "sha512-WuNgdZOXVmBk5kUPMcTcVUpbGRzLfNkv7+7APq7WiDihpXVKrgxo6wwRpRl9OQeEBgKCVk9mR7RbzrnNWC8oBw==", + "dev": true, + "requires": { + "xmlcreate": "^2.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdoc": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.2.tgz", + "integrity": "sha512-S2vzg99C5+gb7FWlrK4TVdyzVPGGkdvpDkCEJH1JABi2PKzPeLu5/zZffcJUifgWUJqXWl41Hoc+MmuM2GukIg==", + "dev": true, + "requires": { + "@babel/parser": "^7.4.4", + "bluebird": "^3.5.4", + "catharsis": "^0.8.10", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.0", + "klaw": "^3.0.0", + "markdown-it": "^8.4.2", + "markdown-it-anchor": "^5.0.2", + "marked": "^0.6.2", + "mkdirp": "^0.5.1", + "requizzle": "^0.2.2", + "strip-json-comments": "^3.0.1", + "taffydb": "2.6.2", + "underscore": "~1.9.1" + }, + "dependencies": { + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", "dev": true }, - "map-visit": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true }, - "md5-hex": { - "version": "1.3.0", - "bundled": true, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + } + } + }, + "jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=" + }, + "jsinspect": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/jsinspect/-/jsinspect-0.12.7.tgz", + "integrity": "sha512-9pLr5r5moX3XhACEg/nhIlprBuqRDT+loYigZo7hidmfOj0EV2l6ZMk6gmaNMiX6o1YCMod1lWSH3JoX80QHLA==", + "dev": true, + "requires": { + "babylon": "6.16.1", + "chalk": "^2.1.0", + "commander": "^2.11.0", + "filepaths": "0.3.0", + "stable": "^0.1.6", + "strip-indent": "^1.0.1", + "strip-json-comments": "1.0.2" + }, + "dependencies": { + "babylon": { + "version": "6.16.1", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.16.1.tgz", + "integrity": "sha1-MMWiL0gZeKnn+M399JaxHZS0BNM=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, "requires": { - "md5-o-matic": "^0.1.1" + "get-stdin": "^4.0.1" } }, - "md5-o-matic": { - "version": "0.1.1", - "bundled": true, + "strip-json-comments": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.2.tgz", + "integrity": "sha1-WkirlgI9usG3uND/q/b2PxZ3vp8=", "dev": true - }, - "mem": { - "version": "1.1.0", - "bundled": true, - "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", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true, + "optional": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "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, + "optional": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jsx-ast-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz", + "integrity": "sha1-6AGxs5mF4g//yHtA43SAgOLcrH8=", + "dev": true, + "requires": { + "array-includes": "^3.0.3" + } + }, + "keycode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", + "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "knex": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/knex/-/knex-0.15.2.tgz", + "integrity": "sha1-YFm4dIlgX0zIdZmm0qnSZXCek0A=", + "requires": { + "babel-runtime": "^6.26.0", + "bluebird": "^3.5.1", + "chalk": "2.3.2", + "commander": "^2.16.0", + "debug": "3.1.0", + "inherits": "~2.0.3", + "interpret": "^1.1.0", + "liftoff": "2.5.0", + "lodash": "^4.17.10", + "minimist": "1.2.0", + "mkdirp": "^0.5.1", + "pg-connection-string": "2.0.0", + "tarn": "^1.1.4", + "tildify": "1.2.0", + "uuid": "^3.3.2", + "v8flags": "^3.1.1" + }, + "dependencies": { + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "requires": { - "mimic-fn": "^1.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } - }, - "merge-source-map": { - "version": "1.1.0", - "bundled": true, + } + } + }, + "labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "requires": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "requires": { + "package-json": "^4.0.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "less": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/less/-/less-3.8.1.tgz", + "integrity": "sha512-8HFGuWmL3FhQR0aH89escFNBQH/nEiYPP2ltDFdQw2chE28Yx2E3lhAIq9Y2saYwLSwa699s4dBVEfCY8Drf7Q==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.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, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "micromatch": { - "version": "3.1.10", - "bundled": true, + "optional": true + } + } + }, + "less-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", + "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^3.0.0" + } + }, + "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", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "liftoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "requires": { + "extend": "^3.0.0", + "findup-sync": "^2.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + } + }, + "linkify-it": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.1.0.tgz", + "integrity": "sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, + "lint-staged": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-6.1.1.tgz", + "integrity": "sha512-M/7bwLdXbeG7ZNLcasGeLMBDg60/w6obj3KOtINwJyxAxb53XGY0yH5FSZlWklEzuVbTtqtIfAajh6jYIN90AA==", + "dev": true, + "requires": { + "app-root-path": "^2.0.0", + "chalk": "^2.1.0", + "commander": "^2.11.0", + "cosmiconfig": "^4.0.0", + "debug": "^3.1.0", + "dedent": "^0.7.0", + "execa": "^0.8.0", + "find-parent-dir": "^0.3.0", + "is-glob": "^4.0.0", + "jest-validate": "^21.1.0", + "listr": "^0.13.0", + "lodash": "^4.17.4", + "log-symbols": "^2.0.0", + "minimatch": "^3.0.0", + "npm-which": "^3.0.1", + "p-map": "^1.1.1", + "path-is-inside": "^1.0.2", + "pify": "^3.0.0", + "staged-git-files": "1.0.0", + "stringify-object": "^3.2.0" + }, + "dependencies": { + "execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" } }, - "mimic-fn": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "is-extglob": "^2.1.1" } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, + } + } + }, + "listr": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.13.0.tgz", + "integrity": "sha1-ILsLowuuZg7oTMBQPfS+PVYjiH0=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "figures": "^1.7.0", + "indent-string": "^2.1.0", + "is-observable": "^0.2.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.4.0", + "listr-verbose-renderer": "^0.4.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "ora": "^0.2.3", + "p-map": "^1.1.1", + "rxjs": "^5.4.2", + "stream-to-observable": "^0.2.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, - "mixin-deep": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "minimist": "0.0.8" + "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" } }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "nanomatch": { - "version": "1.2.9", - "bundled": true, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-odd": "^2.0.0", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "bundled": true, - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, - "normalize-package-data": { - "version": "2.4.0", - "bundled": true, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "chalk": "^1.0.0" } }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "path-key": "^2.0.0" + "ansi-regex": "^2.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "bundled": 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 + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "dev": true + }, + "listr-update-renderer": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz", + "integrity": "sha1-NE2YDaLKLosUW6MFkI8yrj9MyKc=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, - "object-assign": { - "version": "4.1.1", - "bundled": 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 }, - "object-copy": { - "version": "0.1.0", - "bundled": true, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^0.1.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" } }, - "object-visit": { - "version": "1.0.1", - "bundled": true, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, - "object.pick": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } - } + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true }, - "once": { - "version": "1.4.0", - "bundled": true, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", "dev": true, "requires": { - "wrappy": "1" + "chalk": "^1.0.0" } }, - "optimist": { - "version": "0.6.1", - "bundled": true, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" + "ansi-regex": "^2.0.0" } }, - "os-homedir": { - "version": "1.0.2", - "bundled": 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 + } + } + }, + "listr-verbose-renderer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", + "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-cursor": "^1.0.2", + "date-fns": "^1.27.2", + "figures": "^1.7.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, - "os-locale": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "bundled": 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 }, - "p-limit": { - "version": "1.2.0", - "bundled": true, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "p-try": "^1.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" } }, - "p-locate": { - "version": "2.0.0", - "bundled": true, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "p-limit": "^1.1.0" + "restore-cursor": "^1.0.1" } }, - "p-try": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "bundled": true, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "error-ex": "^1.2.0" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, - "pascalcase": { - "version": "0.1.1", - "bundled": true, + "onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, - "path-exists": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-is-absolute": { + "restore-cursor": { "version": "1.0.1", - "bundled": true, - "dev": true - }, - "path-key": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "bundled": true, - "dev": true + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } }, - "path-type": { - "version": "1.1.0", - "bundled": true, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "ansi-regex": "^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 + } + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { "pify": { "version": "2.3.0", - "bundled": true, - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "bundled": true, + } + } + }, + "loader-fs-cache": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz", + "integrity": "sha1-VuC/CL2XCLJqdltoUJhAyN7J/bw=", + "dev": true, + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", "dev": true, "requires": { - "pinkie": "^2.0.0" + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" } }, - "pkg-dir": { - "version": "1.0.0", - "bundled": true, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "find-up": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - } + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, - "posix-character-classes": { - "version": "0.1.1", - "bundled": true, - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "bundled": true, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "pinkie-promise": "^2.0.0" } }, - "read-pkg-up": { - "version": "1.0.1", - "bundled": true, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - } + "find-up": "^1.0.0" } - }, - "regenerator-runtime": { - "version": "0.11.1", - "bundled": true, + } + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.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" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "lodash-es": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.10.tgz", + "integrity": "sha512-iesFYPmxYYGTcmQK0sL8bX3TGHyM6b2qREaB4kamHfQyfPJP0xgoGxp19nsH16nsfquLdiyKyX3mQkfiSGV8Rg==" + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basefor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", + "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=" + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "dev": true + }, + "lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "dev": true, + "requires": { + "lodash._bindcallback": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash.restparam": "^3.0.0" + } + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.isplainobject": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-3.2.0.tgz", + "integrity": "sha1-moI4rhayAEMpYM1zRlEtASP79MU=", + "requires": { + "lodash._basefor": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.keysin": "^3.0.0" + } + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.keysin": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-3.0.8.tgz", + "integrity": "sha1-IsRJPrvtsUJ5YqVLRFssinZ/tH8=", + "requires": { + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=" + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "log": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/log/-/log-1.4.0.tgz", + "integrity": "sha1-S6HYkP3iSbAx3KA7w36q8yVlbxw=" + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "log-update": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", + "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", + "dev": true, + "requires": { + "ansi-escapes": "^1.0.0", + "cli-cursor": "^1.0.2" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", "dev": true }, - "regex-not": { + "cli-cursor": { "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "repeat-element": { - "version": "1.1.2", - "bundled": true, - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "bundled": true, - "dev": true - }, - "repeating": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "resolve-from": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "ret": { - "version": "0.1.15", - "bundled": true, - "dev": true - }, - "right-align": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "glob": "^7.0.5" + "restore-cursor": "^1.0.1" } }, - "safe-regex": { + "onetime": { "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "set-value": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "slide": { - "version": "1.1.6", - "bundled": true, + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, - "snapdragon": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "bundled": true, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "kind-of": "^3.2.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } - }, + } + } + }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", + "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==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "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", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-it": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", + "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, + "markdown-it-anchor": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.2.4.tgz", + "integrity": "sha512-n8zCGjxA3T+Mx1pG8HEgbJbkB8JFUuRkeTZQuIM8iPY6oQ8sWOPRZJDFC9a/pNg2QkHEjjGkhBEl/RSyzaDZ3A==", + "dev": true + }, + "marked": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.2.tgz", + "integrity": "sha512-LqxwVH3P/rqKX4EKGz7+c2G9r98WeM/SW34ybhgNGhUQNKtf1GmmSkJ6cDGJ/t6tiyae49qRkpyTw2B9HOrgUA==", + "dev": true + }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true, + "optional": true + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { "source-map": { - "version": "0.5.7", - "bundled": true, + "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-resolve": { - "version": "0.5.1", - "bundled": true, - "dev": true, + } + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "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==" + }, + "mime-types": { + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", + "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "requires": { + "mime-db": "~1.36.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "requires": { + "dom-walk": "^0.1.0" + } + }, + "mini-css-extract-plugin": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.2.tgz", + "integrity": "sha512-ots7URQH4wccfJq9Ssrzu2+qupbncAce4TmTzunI9CIwlQMp2XI+WNUw6xWF6MMAGAm1cbUVINrSjATaVMyKXg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.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==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { - "atob": "^2.0.0", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "is-plain-object": "^2.0.4" } - }, - "source-map-url": { - "version": "0.4.0", - "bundled": true, + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "mocha": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", "dev": true }, - "spawn-wrap": { - "version": "1.4.2", - "bundled": true, - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "spdx-correct": { - "version": "3.0.0", - "bundled": true, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "spdx-exceptions": { - "version": "2.1.0", - "bundled": true, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, - "spdx-expression-parse": { - "version": "3.0.0", - "bundled": true, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "dev": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "has-flag": "^2.0.0" } - }, - "spdx-license-ids": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "split-string": { - "version": "3.1.0", - "bundled": true, - "dev": true, + } + } + }, + "module-deps": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.1.tgz", + "integrity": "sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A==", + "requires": { + "JSONStream": "^1.0.3", + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.0.2", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { - "extend-shallow": "^3.0.0" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } - }, - "static-extend": { - "version": "0.1.2", - "bundled": true, - "dev": true, + } + } + }, + "moment": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + }, + "morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "requires": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.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": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "ms": "2.0.0" } - }, - "string-width": { - "version": "2.1.1", - "bundled": true, + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "neo-async": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.2.tgz", + "integrity": "sha512-vdqTKI9GBIYcAEbFAcpKPErKINfPF5zIuz3/niBfq8WUZjpT2tytLlFVrBgWdOtqI4uaA/Rb6No0hux39XXDuw==", + "dev": true + }, + "nested-error-stacks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", + "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", + "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-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "buffer": { + "version": "4.9.1", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true }, - "strip-bom": { - "version": "2.0.0", - "bundled": true, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "dev": true, "requires": { - "is-utf8": "^0.2.0" + "setimmediate": "^1.0.4" } }, - "strip-eof": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "bundled": true, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true - }, - "test-exclude": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "requires": { - "arrify": "^1.0.1", - "micromatch": "^3.1.8", - "object-assign": "^4.1.0", - "read-pkg-up": "^1.0.1", - "require-main-filename": "^1.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "bundled": true, - "dev": true - }, - "braces": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "bundled": true, - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "bundled": true, - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - } + } + } + }, + "nodemon": { + "version": "1.18.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.18.4.tgz", + "integrity": "sha512-hyK6vl65IPnky/ee+D3IWvVGgJa/m3No2/Xc/3wanS6Ce1MWjCzH6NnhPJ/vZM+6JFym16jtHx51lmCMB9HDtg==", + "requires": { + "chokidar": "^2.0.2", + "debug": "^3.1.0", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.0", + "semver": "^5.5.0", + "supports-color": "^5.2.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^2.3.0" + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "requires": { + "abbrev": "1" + } + }, + "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==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.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=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-path": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", + "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", + "dev": true, + "requires": { + "which": "^1.2.10" + } + }, + "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=", + "requires": { + "path-key": "^2.0.0" + } + }, + "npm-which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", + "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", + "dev": true, + "requires": { + "commander": "^2.9.0", + "npm-path": "^2.0.2", + "which": "^1.2.10" + } + }, + "nub": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/nub/-/nub-0.0.0.tgz", + "integrity": "sha1-s2m9Mr3eZq9ZYFw7BSC8IZ3MwE8=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nyc": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", + "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "caching-transform": "^3.0.2", + "convert-source-map": "^1.6.0", + "cp-file": "^6.2.0", + "find-cache-dir": "^2.1.0", + "find-up": "^3.0.0", + "foreground-child": "^1.5.6", + "glob": "^7.1.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "merge-source-map": "^1.1.0", + "resolve-from": "^4.0.0", + "rimraf": "^2.6.3", + "signal-exit": "^3.0.2", + "spawn-wrap": "^1.4.2", + "test-exclude": "^5.2.3", + "uuid": "^3.3.2", + "yargs": "^13.2.2", + "yargs-parser": "^13.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, - "to-fast-properties": { - "version": "1.0.3", - "bundled": true, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "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" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, - "to-object-path": { - "version": "0.3.0", - "bundled": true, + "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": { - "kind-of": "^3.0.2" + "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" } }, - "to-regex": { - "version": "3.0.2", - "bundled": true, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" } }, - "to-regex-range": { - "version": "2.1.1", - "bundled": true, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - } + "locate-path": "^3.0.0" } }, - "trim-right": { - "version": "1.0.1", - "bundled": true, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "uglify-js": { - "version": "2.8.29", - "bundled": true, + "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, - "optional": true, "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "yargs": { - "version": "3.10.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } + "pump": "^3.0.0" } }, - "uglify-to-browserify": { - "version": "1.0.2", - "bundled": true, + "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 + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, - "optional": true + "requires": { + "invert-kv": "^2.0.0" + } }, - "union-value": { - "version": "1.0.0", - "bundled": true, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "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", - "bundled": true, - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "bundled": true, - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "unset-value": { - "version": "1.0.0", - "bundled": true, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "bundled": true, - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "isobject": { - "version": "3.0.1", - "bundled": true, - "dev": true - } + "pify": "^4.0.1", + "semver": "^5.6.0" } }, - "urix": { - "version": "0.1.0", - "bundled": true, + "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" + } + }, + "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 }, - "use": { + "os-locale": { "version": "3.1.0", - "bundled": true, + "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": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "bundled": true, - "dev": true - } + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, - "validate-npm-package-license": { - "version": "3.0.3", - "bundled": true, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "p-try": "^2.0.0" } }, - "which": { - "version": "1.3.0", - "bundled": true, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "isexe": "^2.0.0" + "p-limit": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "bundled": true, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "window-size": { - "version": "0.1.0", - "bundled": true, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, - "optional": true + "requires": { + "find-up": "^3.0.0" + } }, - "wordwrap": { - "version": "0.0.3", - "bundled": true, + "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" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "wrap-ansi": { - "version": "2.1.0", - "bundled": true, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } + "glob": "^7.1.3" } }, - "wrappy": { - "version": "1.0.2", - "bundled": true, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, - "write-file-atomic": { - "version": "1.3.4", - "bundled": true, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, - "y18n": { - "version": "3.2.1", - "bundled": true, - "dev": true + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } }, - "yallist": { - "version": "2.1.2", - "bundled": true, - "dev": true + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } }, "yargs": { - "version": "11.1.0", - "bundled": true, + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "bundled": true, - "dev": true - }, - "cliui": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "yargs-parser": { - "version": "9.0.2", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "^4.1.0" - } - } + "y18n": "^4.0.0", + "yargs-parser": "^13.1.0" } }, "yargs-parser": { - "version": "8.1.0", - "bundled": true, + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", "dev": true, "requires": { - "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "bundled": true, - "dev": true - } + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -10842,6 +9691,24 @@ "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", "dev": true }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", @@ -10990,11 +9857,23 @@ "object-assign": "^4.1.0" } }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, + "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", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -11025,6 +9904,26 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, + "package-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", + "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + } + } + }, "package-json": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", @@ -11289,9 +10188,9 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pg": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-7.10.0.tgz", - "integrity": "sha512-aE6FZomsyn3OeGv1oM50v7Xu5zR75c15LXdOCwA9GGrfjXsQjzwYpbcTS6OwEMhYfZQS6m/FVU/ilPLiPzJDCw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-7.11.0.tgz", + "integrity": "sha512-YO4V7vCmEMGoF390LJaFaohWNKaA2ayoQOEZmiHVcAUF+YsRThpf/TaKCgSvsSE7cDm37Q/Cy3Gz41xiX/XjTw==", "requires": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", @@ -11324,56 +10223,6 @@ "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" }, - "pg-native": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pg-native/-/pg-native-3.0.0.tgz", - "integrity": "sha512-qZZyywXJ8O4lbiIN7mn6vXIow1fd3QZFqzRe+uET/SZIXvCa3HBooXQA4ZU8EQX8Ae6SmaYtDGLp5DwU+8vrfg==", - "requires": { - "libpq": "^1.7.0", - "pg-types": "^1.12.1", - "readable-stream": "1.0.31" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "pg-types": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-1.13.0.tgz", - "integrity": "sha512-lfKli0Gkl/+za/+b6lzENajczwZHc7D5kiUCZfgm914jipD2kIOIvEkAhZ8GrW3/TUoP9w8FHjwpPObBye5KQQ==", - "requires": { - "pg-int8": "1.0.1", - "postgres-array": "~1.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.0", - "postgres-interval": "^1.1.0" - } - }, - "postgres-array": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-1.0.3.tgz", - "integrity": "sha512-5wClXrAP0+78mcsNX3/ithQ5exKvCyK5lr5NEEEeGwwM6NJdQgzIJBVxLvRW+huFpX92F2QnZ5CcokH0VhK2qQ==" - }, - "readable-stream": { - "version": "1.0.31", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.31.tgz", - "integrity": "sha1-jyUC4LyeOw2huUUgqrtOJgPsr64=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, "pg-pool": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.6.tgz", @@ -12250,6 +11099,15 @@ } } }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -12338,20 +11196,12 @@ } }, "requizzle": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.1.tgz", - "integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.2.tgz", + "integrity": "sha512-oJ6y7JcUJkblRGhMByGNcszeLgU0qDxNKFCiUZR1XyzHyVsev+Mxb1tyygxLd1ORsKee1SA5BInFdUwY64GE/A==", "dev": true, "requires": { - "underscore": "~1.6.0" - }, - "dependencies": { - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true - } + "lodash": "^4.17.11" } }, "resolve": { @@ -12967,6 +11817,20 @@ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, + "spawn-wrap": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", + "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", + "dev": true, + "requires": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, "spdx-correct": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", @@ -13139,9 +12003,9 @@ "dev": true }, "stream-splicer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", - "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.2" @@ -13386,6 +12250,121 @@ "execa": "^0.7.0" } }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.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": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "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-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" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + } + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -13577,6 +12556,12 @@ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz", "integrity": "sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA==" }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, "uglify-js": { "version": "3.4.9", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", @@ -13705,11 +12690,12 @@ } }, "undeclared-identifiers": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz", - "integrity": "sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", "requires": { "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", "get-assigned-identifiers": "^1.2.0", "simple-concat": "^1.0.0", "xtend": "^4.0.1" @@ -13734,28 +12720,11 @@ } }, "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", "dev": true }, - "underscore-contrib": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz", - "integrity": "sha1-ZltmwkeD+PorGMn4y7Dix9SMJsc=", - "dev": true, - "requires": { - "underscore": "1.6.0" - }, - "dependencies": { - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", - "dev": true - } - } - }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -13975,9 +12944,9 @@ "dev": true }, "v8flags": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.2.tgz", - "integrity": "sha512-MtivA7GF24yMPte9Rp/BWGCYQNaUj86zeYxV/x2RRJMKagImbbv3u8iJC57lNhWLPcGLJmHcHmFWkNsplbbLWw==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", + "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", "requires": { "homedir-polyfill": "^1.0.1" } @@ -14018,6 +12987,7 @@ "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, "requires": { "indexof": "0.0.1" } @@ -14127,23 +13097,38 @@ } }, "webpack-bundle-analyzer": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.13.1.tgz", - "integrity": "sha512-rwxyfecTAxoarCC9VlHlIpfQCmmJ/qWD5bpbjkof+7HrNhTNZIwZITxN6CdlYL2axGmwNUQ+tFgcSOiNXMf/sQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz", + "integrity": "sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA==", "dev": true, "requires": { - "acorn": "^5.3.0", - "bfj-node4": "^5.2.0", - "chalk": "^2.3.0", - "commander": "^2.13.0", - "ejs": "^2.5.7", - "express": "^4.16.2", - "filesize": "^3.5.11", - "gzip-size": "^4.1.0", - "lodash": "^4.17.4", + "acorn": "^6.0.7", + "acorn-walk": "^6.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.10", "mkdirp": "^0.5.1", - "opener": "^1.4.3", - "ws": "^4.0.0" + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + } } }, "webpack-cli": { @@ -14346,6 +13331,12 @@ "string-width": "^2.1.1" } }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, "worker-farm": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", @@ -14448,13 +13439,12 @@ } }, "ws": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", - "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", "dev": true, "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0" + "async-limiter": "~1.0.0" } }, "xdg-basedir": { @@ -14463,9 +13453,9 @@ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" }, "xmlcreate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", - "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.1.tgz", + "integrity": "sha512-MjGsXhKG8YjTKrDCXseFo3ClbMGvUD4en29H2Cev1dv4P/chlpw6KdYmlCWDkhosBVKRDjM836+3e3pm1cBNJA==", "dev": true }, "xregexp": { diff --git a/package.json b/package.json index 1ed9842d0..7709e3fe9 100644 --- a/package.json +++ b/package.json @@ -41,8 +41,8 @@ "babel-runtime": "^6.23.0", "bluebird": "^3.5.1", "body-parser": "^1.14.1", - "bookbrainz-data": "^2.1.1", - "browserify": "^14.5.0", + "bookbrainz-data": "^2.2.1", + "browserify": "^16.2.3", "classnames": "^2.2.5", "compression": "^1.7.1", "connect-redis": "^3.0.1", @@ -55,7 +55,7 @@ "immutable": "^3.8.2", "influx": "^5.0.7", "jsesc": "^2.5.1", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "log": "^1.4.0", "moment": "^2.19.3", "morgan": "^1.9.1", @@ -118,7 +118,7 @@ "file-loader": "^2.0.0", "flow-bin": "^0.69.0", "husky": "^0.14.3", - "jsdoc": "^3.4.0", + "jsdoc": "^3.6.2", "jsinspect": "^0.12.7", "less": "^3.8.1", "less-loader": "^4.1.0", @@ -126,7 +126,7 @@ "mini-css-extract-plugin": "^0.4.1", "mocha": "^4.1.0", "nodemon": "^1.18.4", - "nyc": "^11.4.0", + "nyc": "^14.1.1", "react-hot-loader": "^4.3.4", "resolve-url-loader": "^2.3.0", "rewire": "^3.0.2", @@ -134,7 +134,7 @@ "supertest": "^3.0.0", "uuid": "^3.3.2", "webpack": "^4.16.4", - "webpack-bundle-analyzer": "^2.13.1", + "webpack-bundle-analyzer": "^3.3.2", "webpack-cli": "^3.1.0", "webpack-dev-middleware": "^3.1.3", "webpack-node-externals": "^1.7.2", From e82d013beab3c092ab31f4015f754c85266fcd1f Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Fri, 14 Jun 2019 11:42:32 +0200 Subject: [PATCH 41/78] chore: Fix SEC-16 Update Mocha for a sub-dependency security risk (diff package) --- package-lock.json | 22 +++++++++++----------- package.json | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 50d48d568..6f4e70bda 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2736,9 +2736,9 @@ } }, "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, "browserify": { @@ -4080,9 +4080,9 @@ } }, "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "diffie-hellman": { @@ -8845,15 +8845,15 @@ } }, "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.3.tgz", + "integrity": "sha512-oi0ylWkmIR+IG8OcQkLGPMWhxu/Gfz9EBW7Mztr6FY4JbrPDDi5y9rb2ncNnajZtr2XHfBP+G5pzS6gEzdAcVQ==", "dev": true, "requires": { - "browser-stdout": "1.3.0", + "browser-stdout": "1.3.1", "commander": "2.11.0", "debug": "3.1.0", - "diff": "3.3.1", + "diff": "3.5.0", "escape-string-regexp": "1.0.5", "glob": "7.1.2", "growl": "1.10.3", diff --git a/package.json b/package.json index 7709e3fe9..33e6e4cd6 100644 --- a/package.json +++ b/package.json @@ -124,7 +124,7 @@ "less-loader": "^4.1.0", "lint-staged": "^6.0.0", "mini-css-extract-plugin": "^0.4.1", - "mocha": "^4.1.0", + "mocha": "^5.0.3", "nodemon": "^1.18.4", "nyc": "^14.1.1", "react-hot-loader": "^4.3.4", From 6a9794ba3a8d44044fd983b8ec5051c351168187 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Mon, 17 Jun 2019 15:09:38 +0530 Subject: [PATCH 42/78] feat: add tests for envalid endpoints and allow only get requests --- src/api/app.js | 6 ++- src/api/helpers/utils.js | 9 ++++ test/src/api/common-tests.js | 86 ++++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 test/src/api/common-tests.js diff --git a/src/api/app.js b/src/api/app.js index 97055a3e2..f69420f3d 100644 --- a/src/api/app.js +++ b/src/api/app.js @@ -20,12 +20,11 @@ /* eslint global-require: 'warn' */ -import * as error from '../common/helpers/error'; - import BookBrainzData from 'bookbrainz-data'; import Debug from 'debug'; import Promise from 'bluebird'; import {get as _get} from 'lodash'; +import {allowOnlyGetMethod} from './helpers/utils'; import appCleanup from '../common/helpers/appCleanup'; import bodyParser from 'body-parser'; import compression from 'compression'; @@ -80,6 +79,9 @@ app.use(session({ // Set up routes routes(app); +// Allow only get requests for now throw error for any other type of requests +app.all('/*', allowOnlyGetMethod); + // Catch 404 and forward to error handler app.use((req, res, next) => { res.status(404).send({message: `Incorrect endpoint ${req.path}`}); diff --git a/src/api/helpers/utils.js b/src/api/helpers/utils.js index 25706935f..4674db645 100644 --- a/src/api/helpers/utils.js +++ b/src/api/helpers/utils.js @@ -18,3 +18,12 @@ export const aliasesRelation = ['aliasSet.aliases.language']; export const identifiersRelation = ['identifierSet.identifiers.type']; + +export function allowOnlyGetMethod(req, res, next) { + if (req.method === 'GET') { + return next(); + } + return res.set('Allow', 'GET') + .status(405) + .send({message: `${req.method} method for the "${req.path}" route is not supported. Only GET method is allowed`}); +} diff --git a/test/src/api/common-tests.js b/test/src/api/common-tests.js new file mode 100644 index 000000000..68b886726 --- /dev/null +++ b/test/src/api/common-tests.js @@ -0,0 +1,86 @@ +/* eslint-disable prefer-arrow-callback,func-names */ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import app from '../../../src/api/app'; +import chai from 'chai'; +import chaiHttp from 'chai-http'; +import {getRandomUUID} from '../../test-helpers/create-entities'; + + +chai.use(chaiHttp); +const {expect} = chai; + + +const aBBID = getRandomUUID(); +const bBBID = getRandomUUID(); +const inValidBBID = 'akjd-adjjk-23123'; + +describe('Common test of API', () => { + // Test API for envalid requests + it('should throw a 405 error if send post request', function (done) { + chai.request(app) + .post(`/work/${bBBID}`) + .end(function (err, res) { + if (err) { return done(err); } + expect(res).to.have.status(405); + expect(res.ok).to.be.false; + expect(res.body).to.be.an('object'); + expect(res.body).to.have.all.keys('message'); + return done(); + }); + }); + it('should throw a 405 error if send put request', function (done) { + chai.request(app) + .put(`/work/${bBBID}`) + .end(function (err, res) { + if (err) { return done(err); } + expect(res).to.have.status(405); + expect(res.ok).to.be.false; + expect(res.body).to.be.an('object'); + expect(res.body).to.have.all.keys('message'); + return done(); + }); + }); + it('should throw a 405 error if send delete request', function (done) { + chai.request(app) + .delete(`/work/${bBBID}`) + .end(function (err, res) { + if (err) { return done(err); } + expect(res).to.have.status(405); + expect(res.ok).to.be.false; + expect(res.body).to.be.an('object'); + expect(res.body).to.have.all.keys('message'); + return done(); + }); + }); + + it('should throw a 404 error if endpoint is not valid', function (done) { + chai.request(app) + .get(`/work/${bBBID}/not-valid`) + .end(function (err, res) { + if (err) { return done(err); } + expect(res).to.have.status(404); + expect(res.ok).to.be.false; + expect(res.body).to.be.an('object'); + expect(res.body).to.have.all.keys('message'); + return done(); + }); + }); +}); + From 6c5aac9dde64d9163652933410180c2623c4b89f Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Wed, 29 May 2019 02:50:08 +0530 Subject: [PATCH 43/78] feat: add initial api endpoint for work with test --- package.json | 1 + src/api/endpoints/work.js | 22 +++++++++++++++++++ src/common/queries/work.js | 19 +++++++++++++++++ src/server/routes.js | 8 ++++++- test/src/api/endpoints/test-work.js | 33 +++++++++++++++++++++++++++++ 5 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 src/api/endpoints/work.js create mode 100644 src/common/queries/work.js create mode 100644 test/src/api/endpoints/test-work.js diff --git a/package.json b/package.json index 33e6e4cd6..8f81c673e 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "body-parser": "^1.14.1", "bookbrainz-data": "^2.2.1", "browserify": "^16.2.3", + "chai-http": "^4.3.0", "classnames": "^2.2.5", "compression": "^1.7.1", "connect-redis": "^3.0.1", diff --git a/src/api/endpoints/work.js b/src/api/endpoints/work.js new file mode 100644 index 000000000..2aa925969 --- /dev/null +++ b/src/api/endpoints/work.js @@ -0,0 +1,22 @@ +/* eslint-disable */ + + +import express from 'express'; +import {getEntityBasicInfo} from '../../common/queries/work'; + + +const router = express.Router(); + + +function middleware(req, res, next) { + //console.log('middleware called'); + next(); +} + +router.get('/:bbid', middleware, async (req, res) => { + //console.log(req.params.bbid); + const work = await getEntityBasicInfo('entityTpye', 'bbid'); // example params + return res.send(work); +}); + +export default router; diff --git a/src/common/queries/work.js b/src/common/queries/work.js new file mode 100644 index 000000000..23ec337ba --- /dev/null +++ b/src/common/queries/work.js @@ -0,0 +1,19 @@ +/* eslint-disable */ + +// Stastic data is temporary +const work = { + "bbid": "ba446064-90a5-447b-abe5-139be547da2e", + "default-alias": { + "name": "Harry Potter", + "sort-name": "Harry Potter", + "alias-language": "English" + }, + "languages": ["English"], + "disambiguation": "Harry Potter", + "type": "Epic" +}; + +export function getEntityBasicInfo(entityTpye, bbid) { + // write query here to fetch entity detail + return work; +} diff --git a/src/server/routes.js b/src/server/routes.js index 021960aab..ccce628d0 100644 --- a/src/server/routes.js +++ b/src/server/routes.js @@ -28,8 +28,10 @@ import registerRouter from './routes/register'; import revisionRouter from './routes/revision'; import searchRouter from './routes/search'; import statisticsRouter from './routes/statistics'; +import workEndpoints from '../api/endpoints/work'; import workRouter from './routes/entity/work'; + function initRootRoutes(app) { app.use('/', indexRouter); app.use('/', authRouter); @@ -38,6 +40,10 @@ function initRootRoutes(app) { app.use('/statistics', statisticsRouter); } +function apiEndpoints(app) { + app.use('/v1/work', workEndpoints); +} + function initEditionGroupRoutes(app) { /* Retro-compatibility for /publication links */ app.use(['/edition-group', '/publication'], editionGroupRouter); @@ -70,7 +76,7 @@ function initEditorRoutes(app) { function initRoutes(app) { initRootRoutes(app); - + apiEndpoints(app); initEditionGroupRoutes(app); initAuthorRoutes(app); initEditionRoutes(app); diff --git a/test/src/api/endpoints/test-work.js b/test/src/api/endpoints/test-work.js new file mode 100644 index 000000000..d5ac1b9a8 --- /dev/null +++ b/test/src/api/endpoints/test-work.js @@ -0,0 +1,33 @@ +/* eslint-disable */ + +process.env.NODE_ENV = 'test'; + + +/// Import the dependencies for testing +import chai from 'chai'; +import chaiHttp from 'chai-http'; +import app from '../../../../src/server/app'; +// Configure chai +chai.use(chaiHttp); +chai.should(); + +describe("Work", () => { + describe("GET /work", () => { + // Test to get basic information of a work + it("should get basic information of work", (done) => { + chai.request(app) + .get('/v1/work/bbid') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('bbid'); + res.body.should.have.property('default-alias'); + res.body.should.have.property('languages'); + res.body.should.have.property('disambiguation'); + res.body.should.have.property('type'); + done(); + }); + }); + + }); +}); From fcc757a4053bd774de3908b5ad852585c6e81294 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Wed, 29 May 2019 14:45:51 +0530 Subject: [PATCH 44/78] fix: push lock file to update dependencies in CI. --- package-lock.json | 51 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/package-lock.json b/package-lock.json index 6f4e70bda..88becfc9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -194,6 +194,30 @@ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.4.0.tgz", "integrity": "sha512-yOvY4vhouiTXMNHMlxdgjjC6rdmspQTFCMaRDcxzOK+LP9YfoIccXpOK9boyUgvA1U/pgzHlVZDHrWs6r3sRcA==" }, + "@types/chai": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz", + "integrity": "sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==" + }, + "@types/cookiejar": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.1.tgz", + "integrity": "sha512-aRnpPa7ysx3aNW60hTiCtLHlQaIFsXFCgQlpakNgDNVFzbtusSY8PwjAQgRWfSk0ekNoBjO51eQRB6upA9uuyw==" + }, + "@types/node": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.3.tgz", + "integrity": "sha512-zkOxCS/fA+3SsdA+9Yun0iANxzhQRiNwTvJSr6N95JhuJ/x27z9G2URx1Jpt3zYFfCGUXZGL5UDxt5eyLE7wgw==" + }, + "@types/superagent": { + "version": "3.8.7", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.7.tgz", + "integrity": "sha512-9KhCkyXv268A2nZ1Wvu7rQWM+BmdYUVkycFeNnYrUL5Zwu7o8wPQ3wBfW59dDP+wuoxw0ww8YKgTNv8j/cgscA==", + "requires": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, "@webassemblyjs/ast": { "version": "1.5.13", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.13.tgz", @@ -3098,6 +3122,20 @@ "check-error": "^1.0.2" } }, + "chai-http": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-4.3.0.tgz", + "integrity": "sha512-zFTxlN7HLMv+7+SPXZdkd5wUlK+KxH6Q7bIEMiEx0FK3zuuMqL7cwICAQ0V1+yYRozBburYuxN1qZstgHpFZQg==", + "requires": { + "@types/chai": "4", + "@types/superagent": "^3.8.3", + "cookiejar": "^2.1.1", + "is-ip": "^2.0.0", + "methods": "^1.1.2", + "qs": "^6.5.1", + "superagent": "^3.7.0" + } + }, "chalk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", @@ -6864,6 +6902,11 @@ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", "dev": true }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, "ipaddr.js": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", @@ -7043,6 +7086,14 @@ "is-path-inside": "^1.0.0" } }, + "is-ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz", + "integrity": "sha1-aO6gfooKCpTC0IDdZ0xzGrKkYas=", + "requires": { + "ip-regex": "^2.0.0" + } + }, "is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", From 7d0617c0d03333d33dc5540cee7aaa140b6465b9 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Wed, 29 May 2019 21:20:21 +0530 Subject: [PATCH 45/78] refactor: fetch work data from database --- src/api/endpoints/work.js | 2 +- src/common/queries/work.js | 39 ++++++++++++++++++----------- test/src/api/endpoints/test-work.js | 6 ++--- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/api/endpoints/work.js b/src/api/endpoints/work.js index 2aa925969..9178ea152 100644 --- a/src/api/endpoints/work.js +++ b/src/api/endpoints/work.js @@ -15,7 +15,7 @@ function middleware(req, res, next) { router.get('/:bbid', middleware, async (req, res) => { //console.log(req.params.bbid); - const work = await getEntityBasicInfo('entityTpye', 'bbid'); // example params + const work = await getEntityBasicInfo(req); // example params return res.send(work); }); diff --git a/src/common/queries/work.js b/src/common/queries/work.js index 23ec337ba..2916f148b 100644 --- a/src/common/queries/work.js +++ b/src/common/queries/work.js @@ -1,19 +1,28 @@ /* eslint-disable */ -// Stastic data is temporary -const work = { - "bbid": "ba446064-90a5-447b-abe5-139be547da2e", - "default-alias": { - "name": "Harry Potter", - "sort-name": "Harry Potter", - "alias-language": "English" - }, - "languages": ["English"], - "disambiguation": "Harry Potter", - "type": "Epic" -}; +import _ from 'lodash'; -export function getEntityBasicInfo(entityTpye, bbid) { - // write query here to fetch entity detail - return work; + +function filterData(entity) { + + return _.isNil(entity) ? null : + { + bbid: entity.bbid, + defaultAlias: entity.defaultAlias, + disambiguation: entity.disambiguation ? + entity.disambiguation.comment : null, + languages: entity.languageSet ? entity.languageSet : null, + entityType: entity.type ? entity.type : null + }; +} + +export async function getEntityBasicInfo(req) { + const {orm} = req.app.locals; + const {Work} = orm; + const workPromise = Work.forge({bbid: req.params.bbid}) + .fetch({withRelated: ['defaultAlias', 'languageSet']}) + .then((data) => filterData(data.toJSON())); + + const workData = await Promise.resolve(workPromise) + return workData; } diff --git a/test/src/api/endpoints/test-work.js b/test/src/api/endpoints/test-work.js index d5ac1b9a8..10e5ba432 100644 --- a/test/src/api/endpoints/test-work.js +++ b/test/src/api/endpoints/test-work.js @@ -16,15 +16,15 @@ describe("Work", () => { // Test to get basic information of a work it("should get basic information of work", (done) => { chai.request(app) - .get('/v1/work/bbid') + .get('/v1/work/13ab71b4-908f-4c72-88a9-4b94a56c7d3e') .end((err, res) => { res.should.have.status(200); res.body.should.be.a('object'); res.body.should.have.property('bbid'); - res.body.should.have.property('default-alias'); + res.body.should.have.property('defaultAlias'); res.body.should.have.property('languages'); res.body.should.have.property('disambiguation'); - res.body.should.have.property('type'); + res.body.should.have.property('entityType'); done(); }); }); From f245246e36fc15966777751b52c3aa8713b30c1f Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Wed, 29 May 2019 23:13:28 +0530 Subject: [PATCH 46/78] fix: test passed for work endpoint --- src/common/queries/work.js | 1 - test/src/api/endpoints/test-work.js | 134 ++++++++++++++++++++++++---- 2 files changed, 115 insertions(+), 20 deletions(-) diff --git a/src/common/queries/work.js b/src/common/queries/work.js index 2916f148b..330ba243e 100644 --- a/src/common/queries/work.js +++ b/src/common/queries/work.js @@ -4,7 +4,6 @@ import _ from 'lodash'; function filterData(entity) { - return _.isNil(entity) ? null : { bbid: entity.bbid, diff --git a/test/src/api/endpoints/test-work.js b/test/src/api/endpoints/test-work.js index 10e5ba432..282a5d87a 100644 --- a/test/src/api/endpoints/test-work.js +++ b/test/src/api/endpoints/test-work.js @@ -2,32 +2,128 @@ process.env.NODE_ENV = 'test'; - +import app from '../../../../src/server/app'; /// Import the dependencies for testing import chai from 'chai'; import chaiHttp from 'chai-http'; -import app from '../../../../src/server/app'; +import orm from '../../../bookbrainz-data'; // Configure chai chai.use(chaiHttp); chai.should(); -describe("Work", () => { - describe("GET /work", () => { - // Test to get basic information of a work - it("should get basic information of work", (done) => { - chai.request(app) - .get('/v1/work/13ab71b4-908f-4c72-88a9-4b94a56c7d3e') - .end((err, res) => { - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.should.have.property('bbid'); - res.body.should.have.property('defaultAlias'); - res.body.should.have.property('languages'); - res.body.should.have.property('disambiguation'); - res.body.should.have.property('entityType'); - done(); - }); - }); +const { + Alias, AliasSet, Annotation, Disambiguation, Editor, EditorType, Entity, Gender, + IdentifierSet, RelationshipSet, Revision, Work, bookshelf, util +} = orm; + +const genderData = { + id: 1, + name: 'test' +}; +const editorTypeData = { + id: 1, + label: 'test_type' +}; +const editorData = { + genderId: 1, + id: 1, + name: 'bob', + typeId: 1 +}; +const setData = {id: 1}; + +const aliasData = { + id: 1, + name: 'work name', + sortName: 'Work sort name' +}; + +const revisionAttribs = { + authorId: 1, + id: 1 +}; +const aBBID = '13ab71b4-908f-4c72-88a9-4b94a56c7d3e'; +const workAttribs = { + aliasSetId: 1, + annotationId: 1, + bbid: aBBID, + disambiguationId: 1, + identifierSetId: 1, + relationshipSetId: 1, + revisionId: 1 +}; + + +describe("GET /work", () => { + before( + async () =>{ + await new Gender(genderData) + .save(null, {method: 'insert'}); + await new EditorType(editorTypeData) + .save(null, {method: 'insert'}) + await new Editor(editorData) + .save(null, {method: 'insert'}) + await new Alias(aliasData) + .save(null, {method: 'insert'}) + await new AliasSet({...setData, default_alias_id: 1}) + .save(null, {method: 'insert'}); + await new IdentifierSet(setData) + .save(null, {method: 'insert'}); + await new RelationshipSet(setData) + .save(null, {method: 'insert'}); + await new Disambiguation({ + comment: 'Test Disambiguation', + id: 1 + }) + .save(null, {method: 'insert'}); + await new Entity({bbid: aBBID, type: 'Work'}) + .save(null, {method: 'insert'}); + await new Revision(revisionAttribs) + .save(null, {method: 'insert'}); + new Annotation({ + content: 'Test Annotation', + id: 1, + lastRevisionId: 1 + }) + .save(null, {method: 'insert'}); + await new Work(workAttribs) + .save(null, {method: 'insert'}); + }); + + after(function truncate() { + this.timeout(0); // eslint-disable-line babel/no-invalid-this + + return util.truncateTables(bookshelf, [ + 'bookbrainz.entity', + 'bookbrainz.revision', + 'bookbrainz.relationship_set', + 'bookbrainz.identifier_set', + 'bookbrainz.alias', + 'bookbrainz.alias_set', + 'bookbrainz.annotation', + 'bookbrainz.disambiguation', + 'bookbrainz.editor', + 'bookbrainz.editor_type', + 'bookbrainz.work_header', + 'musicbrainz.gender' + ]); }); + + // Test to get basic information of a work + it("should get basic information of work", (done) => { + chai.request(app) + .get('/v1/work/13ab71b4-908f-4c72-88a9-4b94a56c7d3e') + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.property('bbid'); + res.body.should.have.property('defaultAlias'); + res.body.should.have.property('languages'); + res.body.should.have.property('disambiguation'); + res.body.should.have.property('entityType'); + done(); + }); + }); + }); From b79ebda16a1269a65841db26498cd3c7cfd3b05c Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Sat, 1 Jun 2019 00:12:10 +0530 Subject: [PATCH 47/78] refactor: restrucure api section --- package.json | 2 + src/api/app.js | 186 ++++++++++++++++++++++++++ src/api/routes.js | 32 +++++ src/api/{endpoints => routes}/work.js | 2 - 4 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 src/api/app.js create mode 100644 src/api/routes.js rename src/api/{endpoints => routes}/work.js (84%) diff --git a/package.json b/package.json index 8f81c673e..44a819b40 100644 --- a/package.json +++ b/package.json @@ -9,12 +9,14 @@ "prepublishOnly": "npm run clean && npm run mkdirs && npm run copy-client-scripts", "postinstall": "npm run prepublishOnly", "build-server-js": "babel src --out-dir lib", + "build-api-js": "babel src/api --out-dir lib", "build-client-js": "./scripts/build-client-js.sh", "build-less": "./scripts/build-less.sh", "build": "npm run build-less && npm run build-client-js && npm run build-server-js", "WIP-build-client-webpack": "cross-env NODE_ENV=production SSR=true webpack --progress --config webpack.client.js", "prestart": "npm run build-less & npm run build-client-js & npm run build-server-js", "start": "cross-env SSR=true node ./lib/server/app.js", + "start-api": "npm run build-api-js && cross-env SSR=true node ./lib/api/app.js", "debug": "cross-env DEBUG=bbsite NODE_ENV=development SSR=true babel-node src/server/app.js", "debug-watch-server": "cross-env DEBUG=bbsite NODE_ENV=development SSR=true nodemon src/server/app.js --watch src/server --exec babel-node", "lint": "eslint .", diff --git a/src/api/app.js b/src/api/app.js new file mode 100644 index 000000000..992ef45c7 --- /dev/null +++ b/src/api/app.js @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2014-2015 Ben Ockmore + * 2015-2017 Sean Burke + * 2015 Leo Verto + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* eslint global-require: 'warn' */ + + +import * as error from '../server/helpers/error'; + +import BookBrainzData from 'bookbrainz-data'; +import Debug from 'debug'; +import Promise from 'bluebird'; +import {get as _get} from 'lodash'; +import appCleanup from '../server/helpers/appCleanup'; +import bodyParser from 'body-parser'; +import compression from 'compression'; +import config from '../server/helpers/config'; +import express from 'express'; +import favicon from 'serve-favicon'; +import git from 'git-rev'; +import logger from 'morgan'; +import path from 'path'; +import redis from 'connect-redis'; +import routes from './routes'; +import serveStatic from 'serve-static'; +import session from 'express-session'; + + +Promise.config({ + longStackTraces: true, + warnings: true +}); + +// Initialize application +const app = express(); +app.locals.orm = BookBrainzData(config.database); + +const rootDir = path.join(__dirname, '../../'); + +app.set('trust proxy', config.site.proxyTrust); + +app.use(favicon(path.join(rootDir, 'static/images/icons/favicon.ico'))); + +if (app.get('env') !== 'testing') { + app.use(logger('dev')); +} + +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ + extended: false +})); +app.use(compression()); + +// Set up serving of static assets +if (process.env.NODE_ENV === 'development') { + const webpack = require('webpack'); + const webpackDevMiddleware = require('webpack-dev-middleware'); + const webpackHotMiddleware = require('webpack-hot-middleware'); + + const webpackConfig = require(path.resolve(rootDir, './webpack.client')); + const compiler = webpack(webpackConfig); + + app.use(webpackDevMiddleware(compiler, { + // lazy: false, + logTime: true, + noInfo: false, + publicPath: webpackConfig.output.publicPath + // serverSideRender: false + })); + + app.use(webpackHotMiddleware(compiler)); +} +else { + app.use(serveStatic(path.join(rootDir, 'static/js'))); +} +app.use(express.static(path.join(rootDir, 'static'))); + +const RedisStore = redis(session); +app.use(session({ + cookie: { + maxAge: _get(config, 'session.maxAge', 2592000000), + secure: _get(config, 'session.secure', false) + }, + resave: false, + saveUninitialized: false, + secret: config.session.secret, + store: new RedisStore({ + host: _get(config, 'session.redis.host', 'localhost'), + port: _get(config, 'session.redis.port', 6379) + }) +})); + + +// Set up constants that will remain valid for the life of the app +let siteRevision = 'unknown'; +git.short((revision) => { + siteRevision = revision; +}); + +const repositoryUrl = 'https://github.com/bookbrainz/bookbrainz-site/'; + +app.use((req, res, next) => { + // Set up globally-used properties + res.locals.siteRevision = siteRevision; + res.locals.repositoryUrl = repositoryUrl; + res.locals.alerts = []; + + if (!req.session) { + res.locals.alerts.push({ + level: 'danger', + message: 'We are currently experiencing technical difficulties; ' + + 'signing in will not work until this is resolved.' + }); + } + + // Add user data to every rendered route + res.locals.user = req.user; + + next(); +}); + +// Set up routes +routes(app); + +// Catch 404 and forward to error handler +app.use((req, res, next) => { + next(new error.NotFoundError(null, req)); +}); + +// Error handler; arity MUST be 4 or express doesn't treat it as such +app.use((err, req, res, next) => { // eslint-disable-line no-unused-vars + error.renderError(req, res, err); +}); + +const debug = Debug('bbsite'); + +const DEFAULT_PORT = 9099; +app.set('port', process.env.PORT || DEFAULT_PORT); // eslint-disable-line no-process-env,max-len + +const server = app.listen(app.get('port'), () => { + debug(`Express server listening on port ${server.address().port}`); +}); + +/* eslint-disable no-console */ +function cleanupFunction() { + return new Promise((resolve, reject) => { + console.log('Cleaning up before closing'); + server.close((err) => { + if (err) { + console.log('Error while closing server connections'); + reject(err); + } + else { + console.log('Closed all server connections. Bye bye!'); + resolve(); + } + }); + // force-kill after X milliseconds. + if (config.site.forceExitAfterMs) { + setTimeout(() => { + reject(new Error(`Cleanup function timed out after ${config.site.forceExitAfterMs} ms`)); + }, config.site.forceExitAfterMs); + } + }); +} +/* eslint-enable no-console */ + +// Run cleanup function +appCleanup(cleanupFunction); + +export default server; diff --git a/src/api/routes.js b/src/api/routes.js new file mode 100644 index 000000000..cd87c9fe2 --- /dev/null +++ b/src/api/routes.js @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + + +import workRouter from './routes/work'; + + +function initWorkRoute(app) { + app.use('/work', workRouter); +} + + +function initRoutes(app) { + initWorkRoute(app); +} + +export default initRoutes; diff --git a/src/api/endpoints/work.js b/src/api/routes/work.js similarity index 84% rename from src/api/endpoints/work.js rename to src/api/routes/work.js index 9178ea152..a0a93e7b8 100644 --- a/src/api/endpoints/work.js +++ b/src/api/routes/work.js @@ -9,12 +9,10 @@ const router = express.Router(); function middleware(req, res, next) { - //console.log('middleware called'); next(); } router.get('/:bbid', middleware, async (req, res) => { - //console.log(req.params.bbid); const work = await getEntityBasicInfo(req); // example params return res.send(work); }); From 3571584b1baf8b622f393472ecaaeea41280f063 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Sat, 1 Jun 2019 00:21:49 +0530 Subject: [PATCH 48/78] fix: separate build for api and website and remove api routes from website app.js --- package.json | 2 +- src/server/routes.js | 6 ------ test/src/api/{endpoints => routes}/test-work.js | 2 +- 3 files changed, 2 insertions(+), 8 deletions(-) rename test/src/api/{endpoints => routes}/test-work.js (98%) diff --git a/package.json b/package.json index 44a819b40..5e21afaab 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "clean": "./scripts/clean.sh", "prepublishOnly": "npm run clean && npm run mkdirs && npm run copy-client-scripts", "postinstall": "npm run prepublishOnly", - "build-server-js": "babel src --out-dir lib", + "build-server-js": "babel src --ignore src/api --out-dir lib", "build-api-js": "babel src/api --out-dir lib", "build-client-js": "./scripts/build-client-js.sh", "build-less": "./scripts/build-less.sh", diff --git a/src/server/routes.js b/src/server/routes.js index ccce628d0..25d0a456a 100644 --- a/src/server/routes.js +++ b/src/server/routes.js @@ -28,7 +28,6 @@ import registerRouter from './routes/register'; import revisionRouter from './routes/revision'; import searchRouter from './routes/search'; import statisticsRouter from './routes/statistics'; -import workEndpoints from '../api/endpoints/work'; import workRouter from './routes/entity/work'; @@ -40,10 +39,6 @@ function initRootRoutes(app) { app.use('/statistics', statisticsRouter); } -function apiEndpoints(app) { - app.use('/v1/work', workEndpoints); -} - function initEditionGroupRoutes(app) { /* Retro-compatibility for /publication links */ app.use(['/edition-group', '/publication'], editionGroupRouter); @@ -76,7 +71,6 @@ function initEditorRoutes(app) { function initRoutes(app) { initRootRoutes(app); - apiEndpoints(app); initEditionGroupRoutes(app); initAuthorRoutes(app); initEditionRoutes(app); diff --git a/test/src/api/endpoints/test-work.js b/test/src/api/routes/test-work.js similarity index 98% rename from test/src/api/endpoints/test-work.js rename to test/src/api/routes/test-work.js index 282a5d87a..6f36c757f 100644 --- a/test/src/api/endpoints/test-work.js +++ b/test/src/api/routes/test-work.js @@ -113,7 +113,7 @@ describe("GET /work", () => { // Test to get basic information of a work it("should get basic information of work", (done) => { chai.request(app) - .get('/v1/work/13ab71b4-908f-4c72-88a9-4b94a56c7d3e') + .get('/work/13ab71b4-908f-4c72-88a9-4b94a56c7d3e') .end((err, res) => { res.should.have.status(200); res.body.should.be.a('object'); From b9facf3270700a5d7e29252089dd7a1ca84b96e8 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Sat, 1 Jun 2019 01:08:50 +0530 Subject: [PATCH 49/78] fix: update app for api in test file --- test/src/api/routes/test-work.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index 6f36c757f..7cbb117d6 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -1,8 +1,8 @@ /* eslint-disable */ -process.env.NODE_ENV = 'test'; +process.env.NODE_ENV = 'testing'; -import app from '../../../../src/server/app'; +import app from '../../../../src/api/app'; /// Import the dependencies for testing import chai from 'chai'; import chaiHttp from 'chai-http'; From a8bccb61ea1c8e888a18750ed67d94dc70a5b376 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Sat, 1 Jun 2019 01:56:07 +0530 Subject: [PATCH 50/78] fix: work test --- package-lock.json | 5 +++++ package.json | 1 + src/api/app.js | 4 ++-- test/src/api/routes/test-work.js | 9 ++++----- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 88becfc9b..86c2b366d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5349,6 +5349,11 @@ } } }, + "faker": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/faker/-/faker-4.1.0.tgz", + "integrity": "sha1-HkW7vsxndLPBlfrSg1EJxtdIzD8=" + }, "fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", diff --git a/package.json b/package.json index 5e21afaab..4681f34e1 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "elasticsearch": "^15.2.0", "express": "^4.16.2", "express-session": "^1.10.1", + "faker": "^4.1.0", "git-rev": "^0.2.1", "http-status": "^1.0.0", "immutable": "^3.8.2", diff --git a/src/api/app.js b/src/api/app.js index 992ef45c7..31db94c92 100644 --- a/src/api/app.js +++ b/src/api/app.js @@ -149,8 +149,8 @@ app.use((err, req, res, next) => { // eslint-disable-line no-unused-vars const debug = Debug('bbsite'); -const DEFAULT_PORT = 9099; -app.set('port', process.env.PORT || DEFAULT_PORT); // eslint-disable-line no-process-env,max-len +const DEFAULT_API_PORT = 9098; +app.set('port', process.env.PORT || DEFAULT_API_PORT); // eslint-disable-line no-process-env,max-len const server = app.listen(app.get('port'), () => { debug(`Express server listening on port ${server.address().port}`); diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index 7cbb117d6..e66a92d33 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -1,12 +1,11 @@ /* eslint-disable */ -process.env.NODE_ENV = 'testing'; - import app from '../../../../src/api/app'; +import orm from '../../../bookbrainz-data'; /// Import the dependencies for testing import chai from 'chai'; import chaiHttp from 'chai-http'; -import orm from '../../../bookbrainz-data'; +import faker from 'faker'; // Configure chai chai.use(chaiHttp); chai.should(); @@ -42,7 +41,7 @@ const revisionAttribs = { authorId: 1, id: 1 }; -const aBBID = '13ab71b4-908f-4c72-88a9-4b94a56c7d3e'; +const aBBID = faker.random.uuid(); const workAttribs = { aliasSetId: 1, annotationId: 1, @@ -113,7 +112,7 @@ describe("GET /work", () => { // Test to get basic information of a work it("should get basic information of work", (done) => { chai.request(app) - .get('/work/13ab71b4-908f-4c72-88a9-4b94a56c7d3e') + .get(`/work/${aBBID}`) .end((err, res) => { res.should.have.status(200); res.body.should.be.a('object'); From a0fee51900d7520ad7ae7b520b7595edb68768aa Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Sat, 1 Jun 2019 02:36:17 +0530 Subject: [PATCH 51/78] refactor: check keys on object via .all in work test --- test/src/api/routes/test-work.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index e66a92d33..1b61640d3 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -65,7 +65,7 @@ describe("GET /work", () => { .save(null, {method: 'insert'}) await new Alias(aliasData) .save(null, {method: 'insert'}) - await new AliasSet({...setData, default_alias_id: 1}) + await new AliasSet({...setData, defaultAliasId: 1}) .save(null, {method: 'insert'}); await new IdentifierSet(setData) .save(null, {method: 'insert'}); @@ -80,11 +80,10 @@ describe("GET /work", () => { .save(null, {method: 'insert'}); await new Revision(revisionAttribs) .save(null, {method: 'insert'}); - new Annotation({ + await new Annotation({ content: 'Test Annotation', id: 1, - lastRevisionId: 1 - }) + lastRevisionId: 1}) .save(null, {method: 'insert'}); await new Work(workAttribs) .save(null, {method: 'insert'}); @@ -116,11 +115,13 @@ describe("GET /work", () => { .end((err, res) => { res.should.have.status(200); res.body.should.be.a('object'); - res.body.should.have.property('bbid'); - res.body.should.have.property('defaultAlias'); - res.body.should.have.property('languages'); - res.body.should.have.property('disambiguation'); - res.body.should.have.property('entityType'); + res.body.should.all.keys( + 'bbid', + 'defaultAlias', + 'languages', + 'disambiguation', + 'entityType' + ); done(); }); }); From dcaa746a7a3964878ec37b769266fe2a54ff225e Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Sun, 2 Jun 2019 02:43:18 +0530 Subject: [PATCH 52/78] fix: handle request if work is not founded and add test for same --- package.json | 4 ++-- src/api/helpers/formatWorkData.js | 15 +++++++++++++++ src/api/routes/work.js | 20 +++++++++++--------- src/common/queries/work.js | 17 ++++------------- test/src/api/routes/test-work.js | 14 ++++++++++++++ 5 files changed, 46 insertions(+), 24 deletions(-) create mode 100644 src/api/helpers/formatWorkData.js diff --git a/package.json b/package.json index 4681f34e1..98619209a 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ "clean": "./scripts/clean.sh", "prepublishOnly": "npm run clean && npm run mkdirs && npm run copy-client-scripts", "postinstall": "npm run prepublishOnly", - "build-server-js": "babel src --ignore src/api --out-dir lib", - "build-api-js": "babel src/api --out-dir lib", + "build-server-js": "babel src --out-dir lib --ignore src/api", + "build-api-js": "babel src --out-dir lib --ignore src/client", "build-client-js": "./scripts/build-client-js.sh", "build-less": "./scripts/build-less.sh", "build": "npm run build-less && npm run build-client-js && npm run build-server-js", diff --git a/src/api/helpers/formatWorkData.js b/src/api/helpers/formatWorkData.js new file mode 100644 index 000000000..4baab80ef --- /dev/null +++ b/src/api/helpers/formatWorkData.js @@ -0,0 +1,15 @@ +/* eslint-disable */ + +import _ from 'lodash'; + +export function getWorkBasicInfo(entity) { + return _.isNil(entity) ? null : + { + bbid: entity.bbid, + defaultAlias: entity.defaultAlias, + disambiguation: entity.disambiguation ? + entity.disambiguation.comment : null, + languages: entity.languageSet ? entity.languageSet : null, + entityType: entity.type ? entity.type : null + }; +} \ No newline at end of file diff --git a/src/api/routes/work.js b/src/api/routes/work.js index a0a93e7b8..f4453dba6 100644 --- a/src/api/routes/work.js +++ b/src/api/routes/work.js @@ -2,19 +2,21 @@ import express from 'express'; -import {getEntityBasicInfo} from '../../common/queries/work'; - +import {getWorkFromDB} from '../../common/queries/work'; +import {getWorkBasicInfo} from '../helpers/formatWorkData'; +import _ from 'lodash'; const router = express.Router(); -function middleware(req, res, next) { - next(); -} - -router.get('/:bbid', middleware, async (req, res) => { - const work = await getEntityBasicInfo(req); // example params - return res.send(work); +router.get('/:bbid', async (req, res, next) => { + const work = await getWorkFromDB(req); // example params + if(_.isNil(work)) { + return res.status(404).send({message: 'This Work is not founded'}); + } else { + const workBasicInfo = getWorkBasicInfo(work.toJSON()); + return res.status(200).send(workBasicInfo); + } }); export default router; diff --git a/src/common/queries/work.js b/src/common/queries/work.js index 330ba243e..97ccbcf59 100644 --- a/src/common/queries/work.js +++ b/src/common/queries/work.js @@ -3,25 +3,16 @@ import _ from 'lodash'; -function filterData(entity) { - return _.isNil(entity) ? null : - { - bbid: entity.bbid, - defaultAlias: entity.defaultAlias, - disambiguation: entity.disambiguation ? - entity.disambiguation.comment : null, - languages: entity.languageSet ? entity.languageSet : null, - entityType: entity.type ? entity.type : null - }; -} -export async function getEntityBasicInfo(req) { + +export async function getWorkFromDB(req) { const {orm} = req.app.locals; const {Work} = orm; + const workPromise = Work.forge({bbid: req.params.bbid}) .fetch({withRelated: ['defaultAlias', 'languageSet']}) - .then((data) => filterData(data.toJSON())); const workData = await Promise.resolve(workPromise) + return workData; } diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index 1b61640d3..a667ef817 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -42,6 +42,7 @@ const revisionAttribs = { id: 1 }; const aBBID = faker.random.uuid(); +const bBBID = faker.random.uuid(); const workAttribs = { aliasSetId: 1, annotationId: 1, @@ -126,4 +127,17 @@ describe("GET /work", () => { }); }); + it("should return status 404, if work is not founded", (done) => { + chai.request(app) + .get(`/work/${bBBID}`) + .end((err, res) => { + res.should.have.status(404); + res.body.should.be.a('object'); + res.body.message.should.equal( + 'This Work is not founded' + ); + done(); + }); + }); + }); From a2c26bfbfd37c601a838671bb68c59cd02ccf243 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Mon, 3 Jun 2019 02:21:27 +0530 Subject: [PATCH 53/78] feat: add more lookup endpoint for work like aliases and identifiers with tests --- src/api/helpers/formatWorkData.js | 48 +++++++++++++++++++++++++------ src/api/routes/work.js | 27 +++++++++++++++-- src/common/queries/work.js | 6 ++-- test/src/api/routes/test-work.js | 40 +++++++++++++++++++++++++- 4 files changed, 107 insertions(+), 14 deletions(-) diff --git a/src/api/helpers/formatWorkData.js b/src/api/helpers/formatWorkData.js index 4baab80ef..1c6bf20b0 100644 --- a/src/api/helpers/formatWorkData.js +++ b/src/api/helpers/formatWorkData.js @@ -2,14 +2,46 @@ import _ from 'lodash'; -export function getWorkBasicInfo(entity) { - return _.isNil(entity) ? null : +export function getWorkBasicInfo(work: object) { + return _.isNil(work) ? null : { - bbid: entity.bbid, - defaultAlias: entity.defaultAlias, - disambiguation: entity.disambiguation ? - entity.disambiguation.comment : null, - languages: entity.languageSet ? entity.languageSet : null, - entityType: entity.type ? entity.type : null + bbid: work.bbid, + defaultAlias: work.defaultAlias, + disambiguation: work.disambiguation ? + work.disambiguation.comment : null, + languages: work.languageSet ? + work.languageSet.languages.map((language) => language.name) : null, + workType: work.typeId, + entityType: work.type ? work.type : null }; +} + +export function getWorkAliases(work: object) { + + return _.isNil(work) ? null : + { + bbid: work.bbid, + aliases: work.aliasSet.aliases.map( (alias) => { + return { + name: alias.name, + sortName: alias.sortName, + aliasLanguage: alias.languageId, + primary: alias.primary + } + }) + } +} + +export function getWorkIdentifiers(work: object) { + return _.isNil(work) ? null : + { + bbid: work.bbid, + identifires: work.identifierSet.identifiers.map( (identifier) => { + return { + type: identifier.typeId, + value: identifier.value + } + }) + } + } \ No newline at end of file diff --git a/src/api/routes/work.js b/src/api/routes/work.js index f4453dba6..3e51621fe 100644 --- a/src/api/routes/work.js +++ b/src/api/routes/work.js @@ -3,14 +3,15 @@ import express from 'express'; import {getWorkFromDB} from '../../common/queries/work'; -import {getWorkBasicInfo} from '../helpers/formatWorkData'; +import {getWorkBasicInfo, getWorkAliases, getWorkIdentifiers} from '../helpers/formatWorkData'; import _ from 'lodash'; const router = express.Router(); router.get('/:bbid', async (req, res, next) => { - const work = await getWorkFromDB(req); // example params + const params = ['defaultAlias', 'languageSet.languages', 'disambiguation']; + const work = await getWorkFromDB(req, params); // example params if(_.isNil(work)) { return res.status(404).send({message: 'This Work is not founded'}); } else { @@ -19,4 +20,26 @@ router.get('/:bbid', async (req, res, next) => { } }); +router.get('/:bbid/aliases', async (req, res, next) => { + const params = ['aliasSet.aliases']; + const workWithAliases = await getWorkFromDB(req, params) + if(_.isNil(workWithAliases.aliasSet)) { + return res.status(404).send({message: 'This Work is not founded'}); + } else { + const workAliasesList = getWorkAliases(workWithAliases.toJSON()); + return res.status(200).send(workAliasesList); + } +}) + +router.get('/:bbid/identifiers', async (req, res, next) => { + const params = ['identifierSet.identifiers']; + const workWithIdentifiers = await getWorkFromDB(req, params) + if(_.isNil(workWithIdentifiers.identifierSet)) { + return res.status(404).send({message: 'No identifiers are founded for this work'}); + } else { + const workIdentifiersList = getWorkIdentifiers(workWithIdentifiers.toJSON()); + return res.status(200).send(workIdentifiersList); + } +}) + export default router; diff --git a/src/common/queries/work.js b/src/common/queries/work.js index 97ccbcf59..c6f85f6a1 100644 --- a/src/common/queries/work.js +++ b/src/common/queries/work.js @@ -5,14 +5,14 @@ import _ from 'lodash'; -export async function getWorkFromDB(req) { +export async function getWorkFromDB(req, params) { const {orm} = req.app.locals; const {Work} = orm; const workPromise = Work.forge({bbid: req.params.bbid}) - .fetch({withRelated: ['defaultAlias', 'languageSet']}) + .fetch({withRelated: params}) const workData = await Promise.resolve(workPromise) - + return workData; } diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index a667ef817..112edc7ac 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -12,7 +12,7 @@ chai.should(); const { Alias, AliasSet, Annotation, Disambiguation, Editor, EditorType, Entity, Gender, - IdentifierSet, RelationshipSet, Revision, Work, bookshelf, util + IdentifierSet, Identifier, RelationshipSet, Revision, Work, bookshelf, util } = orm; const genderData = { @@ -37,6 +37,12 @@ const aliasData = { sortName: 'Work sort name' }; +const identifierData = { + id: 1, + typeId: 1, + value: 'Q123456' +} + const revisionAttribs = { authorId: 1, id: 1 @@ -70,6 +76,8 @@ describe("GET /work", () => { .save(null, {method: 'insert'}); await new IdentifierSet(setData) .save(null, {method: 'insert'}); + await new Identifier(identifierData) + .save(null, {method: 'insert'}); await new RelationshipSet(setData) .save(null, {method: 'insert'}); await new Disambiguation({ @@ -97,6 +105,7 @@ describe("GET /work", () => { 'bookbrainz.entity', 'bookbrainz.revision', 'bookbrainz.relationship_set', + 'bookbrainz.identifier', 'bookbrainz.identifier_set', 'bookbrainz.alias', 'bookbrainz.alias_set', @@ -121,6 +130,7 @@ describe("GET /work", () => { 'defaultAlias', 'languages', 'disambiguation', + 'workType', 'entityType' ); done(); @@ -140,4 +150,32 @@ describe("GET /work", () => { }); }); + it("should return list of aliases of work", (done) => { + chai.request(app) + .get(`/work/${aBBID}/aliases`) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.all.keys( + 'bbid', + 'aliases' + ); + done(); + }); + }); + + it("should return list of identifiers of work", (done) => { + chai.request(app) + .get(`/work/${aBBID}/identifiers`) + .end((err, res) => { + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.all.keys( + 'bbid', + 'identifiers' + ); + done(); + }); + }); + }); From a23c2c690c6cea27c40f32582c8ad5b2b1e403a7 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Mon, 3 Jun 2019 16:37:25 +0530 Subject: [PATCH 54/78] fix: insert identifier in testing --- src/api/helpers/formatWorkData.js | 2 +- test/src/api/routes/test-work.js | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/api/helpers/formatWorkData.js b/src/api/helpers/formatWorkData.js index 1c6bf20b0..935c0379c 100644 --- a/src/api/helpers/formatWorkData.js +++ b/src/api/helpers/formatWorkData.js @@ -36,7 +36,7 @@ export function getWorkIdentifiers(work: object) { return _.isNil(work) ? null : { bbid: work.bbid, - identifires: work.identifierSet.identifiers.map( (identifier) => { + identifiers: work.identifierSet.identifiers.map( (identifier) => { return { type: identifier.typeId, value: identifier.value diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index 112edc7ac..a8a910ba3 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -12,7 +12,7 @@ chai.should(); const { Alias, AliasSet, Annotation, Disambiguation, Editor, EditorType, Entity, Gender, - IdentifierSet, Identifier, RelationshipSet, Revision, Work, bookshelf, util + IdentifierSet, Identifier, IdentifierType, RelationshipSet, Revision, Work, bookshelf, util } = orm; const genderData = { @@ -37,6 +37,15 @@ const aliasData = { sortName: 'Work sort name' }; +const identifierTypeData = { + id: 1, + label: 'test label', + description: 'test description', + validationRegex: 'test regex', + displayTemplate: 'test template', + entityType: 'Work' +} + const identifierData = { id: 1, typeId: 1, @@ -76,6 +85,8 @@ describe("GET /work", () => { .save(null, {method: 'insert'}); await new IdentifierSet(setData) .save(null, {method: 'insert'}); + await new IdentifierType(identifierTypeData) + .save(null, {method: 'insert'}); await new Identifier(identifierData) .save(null, {method: 'insert'}); await new RelationshipSet(setData) @@ -105,6 +116,7 @@ describe("GET /work", () => { 'bookbrainz.entity', 'bookbrainz.revision', 'bookbrainz.relationship_set', + 'bookbrainz.identifier_type', 'bookbrainz.identifier', 'bookbrainz.identifier_set', 'bookbrainz.alias', From 7624e8c93d006a55acadac5e024fe23ac8c69382 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Mon, 3 Jun 2019 18:37:33 +0530 Subject: [PATCH 55/78] refactor: move config to common section --- src/api/app.js | 2 +- src/{server => common}/helpers/config.js | 0 src/server/app.js | 2 +- src/server/helpers/achievement.js | 2 +- src/server/helpers/auth.js | 2 +- src/server/helpers/error.js | 2 +- src/server/routes/entity/entity.js | 2 +- src/server/routes/register.js | 2 +- 8 files changed, 7 insertions(+), 7 deletions(-) rename src/{server => common}/helpers/config.js (100%) diff --git a/src/api/app.js b/src/api/app.js index 31db94c92..c4e6a440d 100644 --- a/src/api/app.js +++ b/src/api/app.js @@ -29,7 +29,7 @@ import {get as _get} from 'lodash'; import appCleanup from '../server/helpers/appCleanup'; import bodyParser from 'body-parser'; import compression from 'compression'; -import config from '../server/helpers/config'; +import config from '../common/helpers/config'; import express from 'express'; import favicon from 'serve-favicon'; import git from 'git-rev'; diff --git a/src/server/helpers/config.js b/src/common/helpers/config.js similarity index 100% rename from src/server/helpers/config.js rename to src/common/helpers/config.js diff --git a/src/server/app.js b/src/server/app.js index fbb887d9e..592e7ff29 100644 --- a/src/server/app.js +++ b/src/server/app.js @@ -30,7 +30,7 @@ import {get as _get} from 'lodash'; import appCleanup from './helpers/appCleanup'; import bodyParser from 'body-parser'; import compression from 'compression'; -import config from './helpers/config'; +import config from '../common/helpers/config'; import express from 'express'; import favicon from 'serve-favicon'; import git from 'git-rev'; diff --git a/src/server/helpers/achievement.js b/src/server/helpers/achievement.js index 730399e64..7c037e917 100644 --- a/src/server/helpers/achievement.js +++ b/src/server/helpers/achievement.js @@ -26,7 +26,7 @@ import * as error from './error'; import Log from 'log'; import Promise from 'bluebird'; -import config from './config'; +import config from '../../common/helpers/config'; const log = new Log(config.site.log); diff --git a/src/server/helpers/auth.js b/src/server/helpers/auth.js index 7b09987c4..a9a9efa26 100644 --- a/src/server/helpers/auth.js +++ b/src/server/helpers/auth.js @@ -22,7 +22,7 @@ import * as error from '../helpers/error'; import Log from 'log'; import _ from 'lodash'; -import config from './config'; +import config from '../../common/helpers/config'; import passport from 'passport'; import status from 'http-status'; diff --git a/src/server/helpers/error.js b/src/server/helpers/error.js index 82784dad5..ff7d3b973 100644 --- a/src/server/helpers/error.js +++ b/src/server/helpers/error.js @@ -22,7 +22,7 @@ import Layout from '../../client/containers/layout'; import Log from 'log'; import React from 'react'; import ReactDOMServer from 'react-dom/server'; -import config from './config'; +import config from '../../common/helpers/config'; import {generateProps} from './props'; import status from 'http-status'; import target from '../templates/target'; diff --git a/src/server/routes/entity/entity.js b/src/server/routes/entity/entity.js index 6fd9d109e..84778db29 100644 --- a/src/server/routes/entity/entity.js +++ b/src/server/routes/entity/entity.js @@ -49,7 +49,7 @@ import React from 'react'; import ReactDOMServer from 'react-dom/server'; import WorkPage from '../../../client/components/pages/entities/work'; import _ from 'lodash'; -import config from '../../helpers/config'; +import config from '../../../common/helpers/config'; import target from '../../templates/target'; type PassportRequest = $Request & {user: any, session: any}; diff --git a/src/server/routes/register.js b/src/server/routes/register.js index b9b1e6987..25d40415d 100644 --- a/src/server/routes/register.js +++ b/src/server/routes/register.js @@ -31,7 +31,7 @@ import RegisterAuthPage from '../../client/components/pages/registration-auth'; import RegisterDetailPage from '../../client/components/forms/registration-details'; import _ from 'lodash'; -import config from '../helpers/config'; +import config from '../../common/helpers/config'; import express from 'express'; import target from '../templates/target'; From 493f8b1bc1c2c7cf1b756b5c6fc9dcf07956c7bd Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Mon, 3 Jun 2019 19:44:56 +0530 Subject: [PATCH 56/78] refactor: create entity using test-helper --- test/src/api/routes/test-work.js | 151 ++++++------------------------- 1 file changed, 28 insertions(+), 123 deletions(-) diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index a8a910ba3..8783701cf 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -1,137 +1,42 @@ -/* eslint-disable */ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {createWork, getRandomUUID, truncateEntities} from '../../../test-helpers/create-entities'; import app from '../../../../src/api/app'; -import orm from '../../../bookbrainz-data'; -/// Import the dependencies for testing import chai from 'chai'; import chaiHttp from 'chai-http'; -import faker from 'faker'; -// Configure chai -chai.use(chaiHttp); -chai.should(); - -const { - Alias, AliasSet, Annotation, Disambiguation, Editor, EditorType, Entity, Gender, - IdentifierSet, Identifier, IdentifierType, RelationshipSet, Revision, Work, bookshelf, util -} = orm; - -const genderData = { - id: 1, - name: 'test' -}; -const editorTypeData = { - id: 1, - label: 'test_type' -}; -const editorData = { - genderId: 1, - id: 1, - name: 'bob', - typeId: 1 -}; -const setData = {id: 1}; - -const aliasData = { - id: 1, - name: 'work name', - sortName: 'Work sort name' -}; - -const identifierTypeData = { - id: 1, - label: 'test label', - description: 'test description', - validationRegex: 'test regex', - displayTemplate: 'test template', - entityType: 'Work' -} - -const identifierData = { - id: 1, - typeId: 1, - value: 'Q123456' -} - -const revisionAttribs = { - authorId: 1, - id: 1 -}; -const aBBID = faker.random.uuid(); -const bBBID = faker.random.uuid(); -const workAttribs = { - aliasSetId: 1, - annotationId: 1, - bbid: aBBID, - disambiguationId: 1, - identifierSetId: 1, - relationshipSetId: 1, - revisionId: 1 -}; +chai.use(chaiHttp); +chai.should(); -describe("GET /work", () => { - before( - async () =>{ - await new Gender(genderData) - .save(null, {method: 'insert'}); - await new EditorType(editorTypeData) - .save(null, {method: 'insert'}) - await new Editor(editorData) - .save(null, {method: 'insert'}) - await new Alias(aliasData) - .save(null, {method: 'insert'}) - await new AliasSet({...setData, defaultAliasId: 1}) - .save(null, {method: 'insert'}); - await new IdentifierSet(setData) - .save(null, {method: 'insert'}); - await new IdentifierType(identifierTypeData) - .save(null, {method: 'insert'}); - await new Identifier(identifierData) - .save(null, {method: 'insert'}); - await new RelationshipSet(setData) - .save(null, {method: 'insert'}); - await new Disambiguation({ - comment: 'Test Disambiguation', - id: 1 - }) - .save(null, {method: 'insert'}); - await new Entity({bbid: aBBID, type: 'Work'}) - .save(null, {method: 'insert'}); - await new Revision(revisionAttribs) - .save(null, {method: 'insert'}); - await new Annotation({ - content: 'Test Annotation', - id: 1, - lastRevisionId: 1}) - .save(null, {method: 'insert'}); - await new Work(workAttribs) - .save(null, {method: 'insert'}); - }); +/* eslint-disable */ - after(function truncate() { - this.timeout(0); // eslint-disable-line babel/no-invalid-this - return util.truncateTables(bookshelf, [ - 'bookbrainz.entity', - 'bookbrainz.revision', - 'bookbrainz.relationship_set', - 'bookbrainz.identifier_type', - 'bookbrainz.identifier', - 'bookbrainz.identifier_set', - 'bookbrainz.alias', - 'bookbrainz.alias_set', - 'bookbrainz.annotation', - 'bookbrainz.disambiguation', - 'bookbrainz.editor', - 'bookbrainz.editor_type', - 'bookbrainz.work_header', - 'musicbrainz.gender' - ]); - }); +const aBBID = getRandomUUID(); +const bBBID = getRandomUUID(); +describe('GET /work', () => { + beforeEach(() => createWork(aBBID)); + afterEach(truncateEntities); // Test to get basic information of a work - it("should get basic information of work", (done) => { + it('should get basic information of work', (done) => { chai.request(app) .get(`/work/${aBBID}`) .end((err, res) => { From 471e943b52995f788d9d0525cb72d8ebf31fb25b Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Mon, 3 Jun 2019 23:31:10 +0530 Subject: [PATCH 57/78] fix: remove linting errors and handle errors for tests --- src/api/routes/work.js | 58 +++++++++++++++++++------------- test/src/api/routes/test-work.js | 21 ++++++++---- 2 files changed, 50 insertions(+), 29 deletions(-) diff --git a/src/api/routes/work.js b/src/api/routes/work.js index 3e51621fe..def7990d5 100644 --- a/src/api/routes/work.js +++ b/src/api/routes/work.js @@ -1,45 +1,57 @@ -/* eslint-disable */ - - +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {getWorkAliases, getWorkBasicInfo, getWorkIdentifiers} from '../helpers/formatWorkData'; +import _ from 'lodash'; import express from 'express'; import {getWorkFromDB} from '../../common/queries/work'; -import {getWorkBasicInfo, getWorkAliases, getWorkIdentifiers} from '../helpers/formatWorkData'; -import _ from 'lodash'; -const router = express.Router(); +const router = express.Router(); router.get('/:bbid', async (req, res, next) => { const params = ['defaultAlias', 'languageSet.languages', 'disambiguation']; - const work = await getWorkFromDB(req, params); // example params - if(_.isNil(work)) { + const work = await getWorkFromDB(req, params); + if (_.isNil(work)) { return res.status(404).send({message: 'This Work is not founded'}); - } else { - const workBasicInfo = getWorkBasicInfo(work.toJSON()); - return res.status(200).send(workBasicInfo); } + const workBasicInfo = getWorkBasicInfo(work.toJSON()); + return res.status(200).send(workBasicInfo); }); router.get('/:bbid/aliases', async (req, res, next) => { const params = ['aliasSet.aliases']; - const workWithAliases = await getWorkFromDB(req, params) - if(_.isNil(workWithAliases.aliasSet)) { + const workWithAliases = await getWorkFromDB(req, params); + if (_.isNil(workWithAliases.aliasSet)) { return res.status(404).send({message: 'This Work is not founded'}); - } else { - const workAliasesList = getWorkAliases(workWithAliases.toJSON()); - return res.status(200).send(workAliasesList); } -}) + const workAliasesList = getWorkAliases(workWithAliases.toJSON()); + return res.status(200).send(workAliasesList); +}); router.get('/:bbid/identifiers', async (req, res, next) => { const params = ['identifierSet.identifiers']; - const workWithIdentifiers = await getWorkFromDB(req, params) - if(_.isNil(workWithIdentifiers.identifierSet)) { + const workWithIdentifiers = await getWorkFromDB(req, params); + if (_.isNil(workWithIdentifiers.identifierSet)) { return res.status(404).send({message: 'No identifiers are founded for this work'}); - } else { - const workIdentifiersList = getWorkIdentifiers(workWithIdentifiers.toJSON()); - return res.status(200).send(workIdentifiersList); } -}) + const workIdentifiersList = getWorkIdentifiers(workWithIdentifiers.toJSON()); + return res.status(200).send(workIdentifiersList); +}); export default router; diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index 8783701cf..035b40765 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -26,8 +26,6 @@ import chaiHttp from 'chai-http'; chai.use(chaiHttp); chai.should(); -/* eslint-disable */ - const aBBID = getRandomUUID(); const bBBID = getRandomUUID(); @@ -40,6 +38,9 @@ describe('GET /work', () => { chai.request(app) .get(`/work/${aBBID}`) .end((err, res) => { + if (err) { + throw err; + } res.should.have.status(200); res.body.should.be.a('object'); res.body.should.all.keys( @@ -54,10 +55,13 @@ describe('GET /work', () => { }); }); - it("should return status 404, if work is not founded", (done) => { + it('should return status 404, if work is not founded', (done) => { chai.request(app) .get(`/work/${bBBID}`) .end((err, res) => { + if (err) { + throw err; + } res.should.have.status(404); res.body.should.be.a('object'); res.body.message.should.equal( @@ -67,10 +71,13 @@ describe('GET /work', () => { }); }); - it("should return list of aliases of work", (done) => { + it('should return list of aliases of work', (done) => { chai.request(app) .get(`/work/${aBBID}/aliases`) .end((err, res) => { + if (err) { + throw err; + } res.should.have.status(200); res.body.should.be.a('object'); res.body.should.all.keys( @@ -81,10 +88,13 @@ describe('GET /work', () => { }); }); - it("should return list of identifiers of work", (done) => { + it('should return list of identifiers of work', (done) => { chai.request(app) .get(`/work/${aBBID}/identifiers`) .end((err, res) => { + if (err) { + throw err; + } res.should.have.status(200); res.body.should.be.a('object'); res.body.should.all.keys( @@ -94,5 +104,4 @@ describe('GET /work', () => { done(); }); }); - }); From 6cd3bbada60b44533ebd6dcbc93b0f8fae236e81 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Mon, 3 Jun 2019 23:33:01 +0530 Subject: [PATCH 58/78] refaxtor: clean api app.js --- src/api/app.js | 57 -------------------------------------------------- 1 file changed, 57 deletions(-) diff --git a/src/api/app.js b/src/api/app.js index c4e6a440d..50ac363a6 100644 --- a/src/api/app.js +++ b/src/api/app.js @@ -31,13 +31,10 @@ import bodyParser from 'body-parser'; import compression from 'compression'; import config from '../common/helpers/config'; import express from 'express'; -import favicon from 'serve-favicon'; -import git from 'git-rev'; import logger from 'morgan'; import path from 'path'; import redis from 'connect-redis'; import routes from './routes'; -import serveStatic from 'serve-static'; import session from 'express-session'; @@ -50,12 +47,9 @@ Promise.config({ const app = express(); app.locals.orm = BookBrainzData(config.database); -const rootDir = path.join(__dirname, '../../'); app.set('trust proxy', config.site.proxyTrust); -app.use(favicon(path.join(rootDir, 'static/images/icons/favicon.ico'))); - if (app.get('env') !== 'testing') { app.use(logger('dev')); } @@ -66,29 +60,6 @@ app.use(bodyParser.urlencoded({ })); app.use(compression()); -// Set up serving of static assets -if (process.env.NODE_ENV === 'development') { - const webpack = require('webpack'); - const webpackDevMiddleware = require('webpack-dev-middleware'); - const webpackHotMiddleware = require('webpack-hot-middleware'); - - const webpackConfig = require(path.resolve(rootDir, './webpack.client')); - const compiler = webpack(webpackConfig); - - app.use(webpackDevMiddleware(compiler, { - // lazy: false, - logTime: true, - noInfo: false, - publicPath: webpackConfig.output.publicPath - // serverSideRender: false - })); - - app.use(webpackHotMiddleware(compiler)); -} -else { - app.use(serveStatic(path.join(rootDir, 'static/js'))); -} -app.use(express.static(path.join(rootDir, 'static'))); const RedisStore = redis(session); app.use(session({ @@ -106,34 +77,6 @@ app.use(session({ })); -// Set up constants that will remain valid for the life of the app -let siteRevision = 'unknown'; -git.short((revision) => { - siteRevision = revision; -}); - -const repositoryUrl = 'https://github.com/bookbrainz/bookbrainz-site/'; - -app.use((req, res, next) => { - // Set up globally-used properties - res.locals.siteRevision = siteRevision; - res.locals.repositoryUrl = repositoryUrl; - res.locals.alerts = []; - - if (!req.session) { - res.locals.alerts.push({ - level: 'danger', - message: 'We are currently experiencing technical difficulties; ' + - 'signing in will not work until this is resolved.' - }); - } - - // Add user data to every rendered route - res.locals.user = req.user; - - next(); -}); - // Set up routes routes(app); From 864b648fd48794cb0bd1d848d5e8552198e62330 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Tue, 4 Jun 2019 03:30:08 +0530 Subject: [PATCH 59/78] refactor: add work type, replace langauge in place of languageId and linting errors --- src/api/helpers/formatWorkData.js | 79 +++++++++++++++++++------------ src/api/routes/work.js | 12 ++--- src/common/queries/work.js | 4 +- 3 files changed, 57 insertions(+), 38 deletions(-) diff --git a/src/api/helpers/formatWorkData.js b/src/api/helpers/formatWorkData.js index 935c0379c..aae5f319d 100644 --- a/src/api/helpers/formatWorkData.js +++ b/src/api/helpers/formatWorkData.js @@ -1,47 +1,66 @@ -/* eslint-disable */ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ +/* eslint-disable */ import _ from 'lodash'; export function getWorkBasicInfo(work: object) { return _.isNil(work) ? null : { bbid: work.bbid, - defaultAlias: work.defaultAlias, + defaultAlias: { + name: work.defaultAlias.name, + sortName: work.defaultAlias.sortName, + aliasLanguage: work.defaultAlias.language.name + }, disambiguation: work.disambiguation ? work.disambiguation.comment : null, languages: work.languageSet ? - work.languageSet.languages.map((language) => language.name) : null, - workType: work.typeId, + work.languageSet.languages.map((language) => language.name) : null, + workType: work.workType.label, entityType: work.type ? work.type : null }; } -export function getWorkAliases(work: object) { - - return _.isNil(work) ? null : - { - bbid: work.bbid, - aliases: work.aliasSet.aliases.map( (alias) => { - return { - name: alias.name, - sortName: alias.sortName, - aliasLanguage: alias.languageId, - primary: alias.primary - } - }) - } +export function getWorkAliases(work: object) { + return _.isNil(work) ? null : + { + bbid: work.bbid, + aliases: work.aliasSet.aliases.map((alias) => { + return { + name: alias.name, + sortName: alias.sortName, + aliasLanguage: alias.language.name, + primary: alias.primary + }; + }) + }; } export function getWorkIdentifiers(work: object) { - return _.isNil(work) ? null : - { - bbid: work.bbid, - identifiers: work.identifierSet.identifiers.map( (identifier) => { - return { - type: identifier.typeId, - value: identifier.value - } - }) - } - -} \ No newline at end of file + return _.isNil(work) ? null : + { + bbid: work.bbid, + identifiers: work.identifierSet.identifiers.map((identifier) => { + return { + type: identifier.type.label, + value: identifier.value + }; + }) + }; +} diff --git a/src/api/routes/work.js b/src/api/routes/work.js index def7990d5..6d856d7fc 100644 --- a/src/api/routes/work.js +++ b/src/api/routes/work.js @@ -25,8 +25,8 @@ import {getWorkFromDB} from '../../common/queries/work'; const router = express.Router(); router.get('/:bbid', async (req, res, next) => { - const params = ['defaultAlias', 'languageSet.languages', 'disambiguation']; - const work = await getWorkFromDB(req, params); + const relations = ['defaultAlias.language', 'languageSet.languages', 'disambiguation', 'workType']; + const work = await getWorkFromDB(req, relations); if (_.isNil(work)) { return res.status(404).send({message: 'This Work is not founded'}); } @@ -35,8 +35,8 @@ router.get('/:bbid', async (req, res, next) => { }); router.get('/:bbid/aliases', async (req, res, next) => { - const params = ['aliasSet.aliases']; - const workWithAliases = await getWorkFromDB(req, params); + const relations = ['aliasSet.aliases.language']; + const workWithAliases = await getWorkFromDB(req, relations); if (_.isNil(workWithAliases.aliasSet)) { return res.status(404).send({message: 'This Work is not founded'}); } @@ -45,8 +45,8 @@ router.get('/:bbid/aliases', async (req, res, next) => { }); router.get('/:bbid/identifiers', async (req, res, next) => { - const params = ['identifierSet.identifiers']; - const workWithIdentifiers = await getWorkFromDB(req, params); + const relations = ['identifierSet.identifiers.type']; + const workWithIdentifiers = await getWorkFromDB(req, relations); if (_.isNil(workWithIdentifiers.identifierSet)) { return res.status(404).send({message: 'No identifiers are founded for this work'}); } diff --git a/src/common/queries/work.js b/src/common/queries/work.js index c6f85f6a1..952462d75 100644 --- a/src/common/queries/work.js +++ b/src/common/queries/work.js @@ -5,12 +5,12 @@ import _ from 'lodash'; -export async function getWorkFromDB(req, params) { +export async function getWorkFromDB(req, relations) { const {orm} = req.app.locals; const {Work} = orm; const workPromise = Work.forge({bbid: req.params.bbid}) - .fetch({withRelated: params}) + .fetch({withRelated: relations}) const workData = await Promise.resolve(workPromise) From 4d3e9671c3b28c5afdb03943b8696be95ed725dd Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Wed, 5 Jun 2019 15:34:36 +0200 Subject: [PATCH 60/78] test: Refactor API work tests to use async/await Solving an issue with uncaught exceptions that would break the test harness --- test/src/api/routes/test-work.js | 101 ++++++++++++------------------- 1 file changed, 38 insertions(+), 63 deletions(-) diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index 035b40765..fde947278 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -1,3 +1,4 @@ +/* eslint-disable prefer-arrow-callback,func-names */ /* * Copyright (C) 2019 Akhilesh Kumar * @@ -34,74 +35,48 @@ describe('GET /work', () => { beforeEach(() => createWork(aBBID)); afterEach(truncateEntities); // Test to get basic information of a work - it('should get basic information of work', (done) => { - chai.request(app) - .get(`/work/${aBBID}`) - .end((err, res) => { - if (err) { - throw err; - } - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.should.all.keys( - 'bbid', - 'defaultAlias', - 'languages', - 'disambiguation', - 'workType', - 'entityType' - ); - done(); - }); + it('should get basic information of work', async function () { + const res = await chai.request(app).get(`/work/${aBBID}`); + + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.have.all.keys( + 'bbid', + 'defaultAlias', + 'languages', + 'disambiguation', + 'workType', + 'entityType' + ); }); - it('should return status 404, if work is not founded', (done) => { - chai.request(app) - .get(`/work/${bBBID}`) - .end((err, res) => { - if (err) { - throw err; - } - res.should.have.status(404); - res.body.should.be.a('object'); - res.body.message.should.equal( - 'This Work is not founded' - ); - done(); - }); + it('should return status 404, if work is not founded', async function () { + const res = await chai.request(app).get(`/work/${bBBID}`); + + res.should.have.status(404); + res.body.should.be.a('object'); + res.body.message.should.equal('This Work is not founded'); }); - it('should return list of aliases of work', (done) => { - chai.request(app) - .get(`/work/${aBBID}/aliases`) - .end((err, res) => { - if (err) { - throw err; - } - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.should.all.keys( - 'bbid', - 'aliases' - ); - done(); - }); + it('should return list of aliases of work', async function () { + const res = await chai.request(app).get(`/work/${aBBID}/aliases`); + + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.all.keys( + 'bbid', + 'aliases' + ); }); - it('should return list of identifiers of work', (done) => { - chai.request(app) - .get(`/work/${aBBID}/identifiers`) - .end((err, res) => { - if (err) { - throw err; - } - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.should.all.keys( - 'bbid', - 'identifiers' - ); - done(); - }); + it('should return list of identifiers of work', async function () { + const res = await chai.request(app).get(`/work/${aBBID}/identifiers`); + + res.should.have.status(200); + res.body.should.be.a('object'); + res.body.should.all.keys( + 'bbid', + 'identifiers' + ); }); }); From b79e2d6ff67be3b30592a8375e5ff90deaed1b4b Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Wed, 5 Jun 2019 16:32:36 +0200 Subject: [PATCH 61/78] test: Added WorkType and LanguageSet to entity creation test utility --- test/test-helpers/create-entities.js | 41 ++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/test/test-helpers/create-entities.js b/test/test-helpers/create-entities.js index badf4f4fa..a406d4725 100644 --- a/test/test-helpers/create-entities.js +++ b/test/test-helpers/create-entities.js @@ -25,8 +25,11 @@ const { bookshelf, util, Editor, EditorType, Revision, RelationshipSet, Alias, AliasSet, Identifier, IdentifierType, IdentifierSet, Disambiguation, Entity, Annotation, Gender, - Author, Edition, EditionGroup, Publisher, Work + Author, Edition, EditionGroup, Publisher, Work, + Language, WorkType } = orm; +const {updateLanguageSet} = orm.func.language; + const setData = {id: 1}; @@ -110,6 +113,30 @@ async function createRelationshipSet() { await new RelationshipSet(setData) .save(null, {method: 'insert'}); } +const languageAttribs = { + frequency: 1, + id: 1, + isoCode1: 'en', + isoCode2b: 'eng', + isoCode2t: 'eng', + isoCode3: 'eng', + name: 'English' +}; + +async function createLanguageSet() { + // Create relationships here if you need them + await new Language(languageAttribs) + .save(null, {method: 'insert'}); + await new Language({...languageAttribs, id: 2}) + .save(null, {method: 'insert'}); + const languageSet = await updateLanguageSet( + orm, + null, + null, + [{id: 1}, {id: 2}] + ); + return languageSet.get('id'); +} export function getRandomUUID() { return uuidv4(); @@ -151,10 +178,18 @@ export async function createWork(optionalBBID) { const bbid = optionalBBID || uuidv4(); await createEntityPrerequisites(); + const languageSetId = await createLanguageSet(); + const workAttribs = { + bbid, + languageSetId, + typeId: setData.id + }; + await new WorkType({...setData, label: 'Work Type 1'}) + .save(null, {method: 'insert'}); await new Entity({bbid, type: 'Work'}) .save(null, {method: 'insert'}); - await new Work({...entityAttribs, bbid}) + await new Work({...entityAttribs, ...workAttribs}) .save(null, {method: 'insert'}); } @@ -173,6 +208,8 @@ export function truncateEntities() { 'bookbrainz.entity', 'bookbrainz.revision', 'bookbrainz.annotation', + 'bookbrainz.work_type', + 'musicbrainz.language', 'musicbrainz.gender' ]); } From a2d736ac76889a319bf3158095f600eba9965227 Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Wed, 5 Jun 2019 17:41:38 +0200 Subject: [PATCH 62/78] refactor: Move some helpers to common code To make sure no code in src/api or src/common depends on any code in src/server or src/client --- src/api/app.js | 4 +- src/{server => common}/helpers/appCleanup.js | 0 src/common/helpers/error.js | 163 +++++++++++++++++++ src/server/app.js | 8 +- src/server/helpers/entityRouteUtils.js | 2 +- src/server/helpers/error.js | 147 +---------------- src/server/routes/editor.js | 2 +- src/server/routes/register.js | 2 +- src/server/routes/search.js | 2 +- 9 files changed, 175 insertions(+), 155 deletions(-) rename src/{server => common}/helpers/appCleanup.js (100%) create mode 100644 src/common/helpers/error.js diff --git a/src/api/app.js b/src/api/app.js index 50ac363a6..f21fefd30 100644 --- a/src/api/app.js +++ b/src/api/app.js @@ -20,13 +20,13 @@ /* eslint global-require: 'warn' */ -import * as error from '../server/helpers/error'; +import * as error from '../common/helpers/error'; import BookBrainzData from 'bookbrainz-data'; import Debug from 'debug'; import Promise from 'bluebird'; import {get as _get} from 'lodash'; -import appCleanup from '../server/helpers/appCleanup'; +import appCleanup from '../common/helpers/appCleanup'; import bodyParser from 'body-parser'; import compression from 'compression'; import config from '../common/helpers/config'; diff --git a/src/server/helpers/appCleanup.js b/src/common/helpers/appCleanup.js similarity index 100% rename from src/server/helpers/appCleanup.js rename to src/common/helpers/appCleanup.js diff --git a/src/common/helpers/error.js b/src/common/helpers/error.js new file mode 100644 index 000000000..f901d8ba9 --- /dev/null +++ b/src/common/helpers/error.js @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2015-2016 Sean Burke + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import Log from 'log'; +import config from '../../common/helpers/config'; +import status from 'http-status'; + + +const log = new Log(config.site.log); + +export class SiteError extends Error { + constructor(message) { + super(); + + /* + * We can't access the subclass's default message before calling super, + * so we set it manually here + */ + this.message = message || this.constructor.defaultMessage; + + this.name = this.constructor.name; + this.status = this.constructor.status; + } + + static get defaultMessage() { + return 'An unhandled error occurred'; + } + + static get status() { + return status.INTERNAL_SERVER_ERROR; + } +} + +class PathError extends SiteError { + constructor(message, req) { + super(message); + this.detailedMessage = this.constructor.detailedMessage && + this.constructor.detailedMessage(req); + } +} + +class _AuthenticationError extends SiteError { + static get status() { + return status.UNAUTHORIZED; + } +} + +export class AuthenticationFailedError extends _AuthenticationError { + static get defaultMessage() { + return 'Invalid authentication credentials'; + } +} + +// For use when something slips past client-side validation +export class FormSubmissionError extends SiteError { + static get defaultMessage() { + return 'Form contained invalid data'; + } + + static get status() { + return status.BAD_REQUEST; + } +} + +export class NotAuthenticatedError extends _AuthenticationError { + static get defaultMessage() { + return 'You are not currently authenticated'; + } +} + +export class NotFoundError extends PathError { + static get defaultMessage() { + return 'Page not found'; + } + + static get status() { + return status.NOT_FOUND; + } + + static detailedMessage(req) { + return [ + `No content exists at the path requested: ${req.path}`, + 'Please make sure you have entered in the correct address!' + ]; + } +} + +export class PermissionDeniedError extends PathError { + static get defaultMessage() { + return 'You do not have permission to access this page'; + } + + static get status() { + return status.FORBIDDEN; + } + + static detailedMessage(req) { + return [ + `You do not have permission to access the following path: + ${req.path}`, + `Please make sure you have entered in the correct credentials and + address!` + ]; + } +} + +function _logError(err) { + log.error(err); +} + +export function getErrorToSend(err) { + if (err instanceof SiteError) { + return err; + } + + /* + * If we haven't generated the error ourselves with display in mind, log + * instead and return a new generic SiteError + */ + _logError(err); + return new SiteError(); +} + +export function sendErrorAsJSON(res, err) { + const errorToSend = getErrorToSend(err); + + res.status( + errorToSend.status || status.INTERNAL_SERVER_ERROR + ).send({error: errorToSend.message}); +} + +export class AwardNotUnlockedError extends Error { + constructor(message) { + super(); + + /* + * We can't access the subclass's default message before calling super, + * so we set it manually here + */ + this.message = message || this.constructor.defaultMessage; + + this.name = this.constructor.name; + } + + static get defaultMessage() { + return 'An award was not unlocked'; + } +} diff --git a/src/server/app.js b/src/server/app.js index 592e7ff29..b7f97c3fc 100644 --- a/src/server/app.js +++ b/src/server/app.js @@ -20,14 +20,14 @@ /* eslint global-require: 'warn' */ import * as auth from './helpers/auth'; -import * as error from './helpers/error'; +import * as error from '../common/helpers/error'; import * as search from './helpers/search'; - +import * as serverErrorHelper from './helpers/error'; import BookBrainzData from 'bookbrainz-data'; import Debug from 'debug'; import Promise from 'bluebird'; import {get as _get} from 'lodash'; -import appCleanup from './helpers/appCleanup'; +import appCleanup from '../common/helpers/appCleanup'; import bodyParser from 'body-parser'; import compression from 'compression'; import config from '../common/helpers/config'; @@ -155,7 +155,7 @@ app.use((req, res, next) => { // Error handler; arity MUST be 4 or express doesn't treat it as such app.use((err, req, res, next) => { // eslint-disable-line no-unused-vars - error.renderError(req, res, err); + serverErrorHelper.renderError(req, res, err); }); const debug = Debug('bbsite'); diff --git a/src/server/helpers/entityRouteUtils.js b/src/server/helpers/entityRouteUtils.js index cb068a30a..2d5cd9e70 100644 --- a/src/server/helpers/entityRouteUtils.js +++ b/src/server/helpers/entityRouteUtils.js @@ -21,7 +21,7 @@ import * as Immutable from 'immutable'; import * as entityEditorHelpers from '../../client/entity-editor/helpers'; import * as entityRoutes from '../routes/entity/entity'; -import * as error from './error'; +import * as error from '../../common/helpers/error'; import * as propHelpers from '../../client/helpers/props'; import * as utils from './utils'; diff --git a/src/server/helpers/error.js b/src/server/helpers/error.js index ff7d3b973..7ec60cfd1 100644 --- a/src/server/helpers/error.js +++ b/src/server/helpers/error.js @@ -16,135 +16,18 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +import * as error from '../../common/helpers/error'; import * as propHelpers from '../../client/helpers/props'; import ErrorPage from '../../client/components/pages/error'; import Layout from '../../client/containers/layout'; -import Log from 'log'; import React from 'react'; import ReactDOMServer from 'react-dom/server'; -import config from '../../common/helpers/config'; import {generateProps} from './props'; import status from 'http-status'; import target from '../templates/target'; - -const log = new Log(config.site.log); - -export class SiteError extends Error { - constructor(message) { - super(); - - /* - * We can't access the subclass's default message before calling super, - * so we set it manually here - */ - this.message = message || this.constructor.defaultMessage; - - this.name = this.constructor.name; - this.status = this.constructor.status; - } - - static get defaultMessage() { - return 'An unhandled error occurred'; - } - - static get status() { - return status.INTERNAL_SERVER_ERROR; - } -} - -class PathError extends SiteError { - constructor(message, req) { - super(message); - this.detailedMessage = this.constructor.detailedMessage && - this.constructor.detailedMessage(req); - } -} - -class _AuthenticationError extends SiteError { - static get status() { - return status.UNAUTHORIZED; - } -} - -export class AuthenticationFailedError extends _AuthenticationError { - static get defaultMessage() { - return 'Invalid authentication credentials'; - } -} - -// For use when something slips past client-side validation -export class FormSubmissionError extends SiteError { - static get defaultMessage() { - return 'Form contained invalid data'; - } - - static get status() { - return status.BAD_REQUEST; - } -} - -export class NotAuthenticatedError extends _AuthenticationError { - static get defaultMessage() { - return 'You are not currently authenticated'; - } -} - -export class NotFoundError extends PathError { - static get defaultMessage() { - return 'Page not found'; - } - - static get status() { - return status.NOT_FOUND; - } - - static detailedMessage(req) { - return [ - `No content exists at the path requested: ${req.path}`, - 'Please make sure you have entered in the correct address!' - ]; - } -} - -export class PermissionDeniedError extends PathError { - static get defaultMessage() { - return 'You do not have permission to access this page'; - } - - static get status() { - return status.FORBIDDEN; - } - - static detailedMessage(req) { - return [ - `You do not have permission to access the following path: - ${req.path}`, - `Please make sure you have entered in the correct credentials and - address!` - ]; - } -} - -function _logError(err) { - log.error(err); -} - -function _getErrorToSend(err) { - if (err instanceof SiteError) { - return err; - } - - /* - * If we haven't generated the error ourselves with display in mind, log - * instead and return a new generic SiteError - */ - _logError(err); - return new SiteError(); -} - export function renderError(req, res, err) { - const errorToSend = _getErrorToSend(err); + const errorToSend = error.getErrorToSend(err); const props = generateProps(req, res, { error: errorToSend }); @@ -159,29 +42,3 @@ export function renderError(req, res, err) { errorToSend.status || status.INTERNAL_SERVER_ERROR ).send(target({markup})); } - -export function sendErrorAsJSON(res, err) { - const errorToSend = _getErrorToSend(err); - - res.status( - errorToSend.status || status.INTERNAL_SERVER_ERROR - ).send({error: errorToSend.message}); -} - -export class AwardNotUnlockedError extends Error { - constructor(message) { - super(); - - /* - * We can't access the subclass's default message before calling super, - * so we set it manually here - */ - this.message = message || this.constructor.defaultMessage; - - this.name = this.constructor.name; - } - - static get defaultMessage() { - return 'An award was not unlocked'; - } -} diff --git a/src/server/routes/editor.js b/src/server/routes/editor.js index eb97084e4..83dae86d9 100644 --- a/src/server/routes/editor.js +++ b/src/server/routes/editor.js @@ -18,7 +18,7 @@ */ import * as auth from '../helpers/auth'; -import * as error from '../helpers/error'; +import * as error from '../../common/helpers/error'; import * as handler from '../helpers/handler'; import * as propHelpers from '../../client/helpers/props'; import {escapeProps, generateProps} from '../helpers/props'; diff --git a/src/server/routes/register.js b/src/server/routes/register.js index 25d40415d..a620bc656 100644 --- a/src/server/routes/register.js +++ b/src/server/routes/register.js @@ -18,7 +18,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -import * as error from '../helpers/error'; +import * as error from '../../common/helpers/error'; import * as handler from '../helpers/handler'; import * as middleware from '../helpers/middleware'; import * as propHelpers from '../../client/helpers/props'; diff --git a/src/server/routes/search.js b/src/server/routes/search.js index f9ad29449..cd86c86a9 100644 --- a/src/server/routes/search.js +++ b/src/server/routes/search.js @@ -18,7 +18,7 @@ */ import * as auth from '../helpers/auth'; -import * as error from '../helpers/error'; +import * as error from '../../common/helpers/error'; import * as handler from '../helpers/handler'; import * as propHelpers from '../../client/helpers/props'; import * as search from '../helpers/search'; From 815810077d962906394d71277ab224954812cc62 Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Wed, 5 Jun 2019 17:42:17 +0200 Subject: [PATCH 63/78] refactor: Don't render HTML page for API error --- src/api/app.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/api/app.js b/src/api/app.js index f21fefd30..fa3911a24 100644 --- a/src/api/app.js +++ b/src/api/app.js @@ -85,12 +85,8 @@ app.use((req, res, next) => { next(new error.NotFoundError(null, req)); }); -// Error handler; arity MUST be 4 or express doesn't treat it as such -app.use((err, req, res, next) => { // eslint-disable-line no-unused-vars - error.renderError(req, res, err); -}); -const debug = Debug('bbsite'); +const debug = Debug('bbapi'); const DEFAULT_API_PORT = 9098; app.set('port', process.env.PORT || DEFAULT_API_PORT); // eslint-disable-line no-process-env,max-len From ebcbe2fb06cae4f3bde8606d52964ed0c1a24c79 Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Wed, 5 Jun 2019 17:43:05 +0200 Subject: [PATCH 64/78] fix: Ignore client and server when building API --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 98619209a..838fe63af 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "prepublishOnly": "npm run clean && npm run mkdirs && npm run copy-client-scripts", "postinstall": "npm run prepublishOnly", "build-server-js": "babel src --out-dir lib --ignore src/api", - "build-api-js": "babel src --out-dir lib --ignore src/client", + "build-api-js": "babel src --out-dir lib --ignore 'src/server','src/client'", "build-client-js": "./scripts/build-client-js.sh", "build-less": "./scripts/build-less.sh", "build": "npm run build-less && npm run build-client-js && npm run build-server-js", From b352d13894b18f6744c616886918a5b7ada5f7b0 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Thu, 6 Jun 2019 23:27:27 +0530 Subject: [PATCH 65/78] refactor: load entity data with middleware Add more tests --- src/api/helpers/entityLoader.js | 19 ++++++ ...{formatWorkData.js => formatEntityData.js} | 30 ++++----- src/api/routes/work.js | 66 ++++++++++--------- src/common/helpers/utils.js | 21 ++++++ src/server/helpers/achievement.js | 2 +- src/server/helpers/auth.js | 2 +- src/server/helpers/handler.js | 2 +- src/server/helpers/middleware.js | 6 +- src/server/helpers/search.js | 3 +- src/server/helpers/utils.js | 19 ------ test/src/api/routes/test-work.js | 49 +++++++++++--- 11 files changed, 137 insertions(+), 82 deletions(-) create mode 100644 src/api/helpers/entityLoader.js rename src/api/helpers/{formatWorkData.js => formatEntityData.js} (61%) create mode 100644 src/common/helpers/utils.js diff --git a/src/api/helpers/entityLoader.js b/src/api/helpers/entityLoader.js new file mode 100644 index 000000000..b90a073a1 --- /dev/null +++ b/src/api/helpers/entityLoader.js @@ -0,0 +1,19 @@ +import * as commonUtils from '../../common/helpers/utils'; + + +export function makeEntityLoader(modelName, relations, errMessage) { + return async (req, res, next) => { + const {orm} = req.app.locals; + if (commonUtils.isValidBBID(req.params.bbid)) { + try { + const entityData = await orm.func.entity.getEntity(orm, modelName, req.params.bbid, relations); + res.locals.entity = entityData; + return next(); + } + catch (err) { + return res.status(404).send({message: errMessage}); + } + } + return res.status(406).send({message: 'BBID is not valid uuid'}); + }; +} diff --git a/src/api/helpers/formatWorkData.js b/src/api/helpers/formatEntityData.js similarity index 61% rename from src/api/helpers/formatWorkData.js rename to src/api/helpers/formatEntityData.js index aae5f319d..b0ce9b6b1 100644 --- a/src/api/helpers/formatWorkData.js +++ b/src/api/helpers/formatEntityData.js @@ -22,26 +22,24 @@ import _ from 'lodash'; export function getWorkBasicInfo(work: object) { return _.isNil(work) ? null : { - bbid: work.bbid, + bbid: _.get(work, 'bbid', null), defaultAlias: { - name: work.defaultAlias.name, - sortName: work.defaultAlias.sortName, - aliasLanguage: work.defaultAlias.language.name + name: _.get(work, 'defaultAlias.name', null), + sortName: _.get(work, 'defaultAlias.sortName', null), + aliasLanguage: _.get(work, 'defaultAlias.language.name', null) }, - disambiguation: work.disambiguation ? - work.disambiguation.comment : null, - languages: work.languageSet ? - work.languageSet.languages.map((language) => language.name) : null, - workType: work.workType.label, - entityType: work.type ? work.type : null + disambiguation: _.get(work, 'disambiguation.comment', null), + languages: _.get(work, 'languageSet.languages', []).map((language) => language.name), + workType: _.get(work, 'workType.label', null), + entityType: _.get(work, 'type', null) }; } -export function getWorkAliases(work: object) { +export function getEntityAliases(work: object) { return _.isNil(work) ? null : { - bbid: work.bbid, - aliases: work.aliasSet.aliases.map((alias) => { + bbid: _.get(work, 'bbid', null), + aliases: _.get(work, 'aliasSet.aliases', []).map((alias) => { return { name: alias.name, sortName: alias.sortName, @@ -52,11 +50,11 @@ export function getWorkAliases(work: object) { }; } -export function getWorkIdentifiers(work: object) { +export function getEntityIdentifiers(work: object) { return _.isNil(work) ? null : { - bbid: work.bbid, - identifiers: work.identifierSet.identifiers.map((identifier) => { + bbid: _.get(work, 'bbid', null), + identifiers: _.get(work, 'identifierSet.identifiers', []).map((identifier) => { return { type: identifier.type.label, value: identifier.value diff --git a/src/api/routes/work.js b/src/api/routes/work.js index 6d856d7fc..d8be04e26 100644 --- a/src/api/routes/work.js +++ b/src/api/routes/work.js @@ -16,42 +16,46 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -import {getWorkAliases, getWorkBasicInfo, getWorkIdentifiers} from '../helpers/formatWorkData'; +import {getEntityAliases, getEntityIdentifiers, getWorkBasicInfo} from '../helpers/formatEntityData'; import _ from 'lodash'; import express from 'express'; -import {getWorkFromDB} from '../../common/queries/work'; +import {makeEntityLoader} from '../helpers/entityLoader'; const router = express.Router(); -router.get('/:bbid', async (req, res, next) => { - const relations = ['defaultAlias.language', 'languageSet.languages', 'disambiguation', 'workType']; - const work = await getWorkFromDB(req, relations); - if (_.isNil(work)) { - return res.status(404).send({message: 'This Work is not founded'}); - } - const workBasicInfo = getWorkBasicInfo(work.toJSON()); - return res.status(200).send(workBasicInfo); -}); - -router.get('/:bbid/aliases', async (req, res, next) => { - const relations = ['aliasSet.aliases.language']; - const workWithAliases = await getWorkFromDB(req, relations); - if (_.isNil(workWithAliases.aliasSet)) { - return res.status(404).send({message: 'This Work is not founded'}); - } - const workAliasesList = getWorkAliases(workWithAliases.toJSON()); - return res.status(200).send(workAliasesList); -}); - -router.get('/:bbid/identifiers', async (req, res, next) => { - const relations = ['identifierSet.identifiers.type']; - const workWithIdentifiers = await getWorkFromDB(req, relations); - if (_.isNil(workWithIdentifiers.identifierSet)) { - return res.status(404).send({message: 'No identifiers are founded for this work'}); - } - const workIdentifiersList = getWorkIdentifiers(workWithIdentifiers.toJSON()); - return res.status(200).send(workIdentifiersList); -}); +const workBasicRelations = [ + 'defaultAlias.language', + 'languageSet.languages', + 'disambiguation', + 'workType' +]; + +const workError = 'Work not found'; + +router.get('/:bbid', + makeEntityLoader('Work', workBasicRelations, workError), + async (req, res, next) => { + const workBasicInfo = await getWorkBasicInfo(res.locals.entity); + return res.status(200).send(workBasicInfo); + }); + +const workAliasRelation = ['aliasSet.aliases.language']; + +router.get('/:bbid/aliases', + makeEntityLoader('Work', workAliasRelation, workError), + async (req, res, next) => { + const workAliasesList = await getEntityAliases(res.locals.entity); + return res.status(200).send(workAliasesList); + }); + +const workIdentifierRelation = ['identifierSet.identifiers.type']; + +router.get('/:bbid/identifiers', + makeEntityLoader('Work', workIdentifierRelation, workError), + async (req, res, next) => { + const workIdentifiersList = await getEntityIdentifiers(res.locals.entity); + return res.status(200).send(workIdentifiersList); + }); export default router; diff --git a/src/common/helpers/utils.js b/src/common/helpers/utils.js new file mode 100644 index 000000000..80a76b27d --- /dev/null +++ b/src/common/helpers/utils.js @@ -0,0 +1,21 @@ + +// @flow + +/** + * Regular expression for valid BookBrainz UUIDs (bbid) + * + * @type {RegExp} + * @private + */ +const _bbidRegex = + /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/; + +/** + * Tests if a BookBrainz UUID is valid + * + * @param {string} bbid - BookBrainz UUID to validate + * @returns {boolean} - Returns true if BookBrainz UUID is valid + */ +export function isValidBBID(bbid: string): boolean { + return _bbidRegex.test(bbid); +} diff --git a/src/server/helpers/achievement.js b/src/server/helpers/achievement.js index 7c037e917..529bc7cf6 100644 --- a/src/server/helpers/achievement.js +++ b/src/server/helpers/achievement.js @@ -22,7 +22,7 @@ */ /* eslint prefer-spread: 1, prefer-reflect: 1, no-magic-numbers: 0 */ -import * as error from './error'; +import * as error from '../../common/helpers/error'; import Log from 'log'; import Promise from 'bluebird'; diff --git a/src/server/helpers/auth.js b/src/server/helpers/auth.js index a9a9efa26..1331cb036 100644 --- a/src/server/helpers/auth.js +++ b/src/server/helpers/auth.js @@ -18,7 +18,7 @@ */ import * as MusicBrainzOAuth from 'passport-musicbrainz-oauth2'; -import * as error from '../helpers/error'; +import * as error from '../../common/helpers/error'; import Log from 'log'; import _ from 'lodash'; diff --git a/src/server/helpers/handler.js b/src/server/helpers/handler.js index cff8a1221..a4e85046a 100644 --- a/src/server/helpers/handler.js +++ b/src/server/helpers/handler.js @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -import * as error from './error'; +import * as error from '../../common/helpers/error'; export function sendPromiseResult(res, promise, processingCallback) { diff --git a/src/server/helpers/middleware.js b/src/server/helpers/middleware.js index 9e7ac7191..52afa10bf 100644 --- a/src/server/helpers/middleware.js +++ b/src/server/helpers/middleware.js @@ -17,12 +17,14 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -import * as error from '../helpers/error'; +import * as commonUtils from '../../common/helpers/utils'; +import * as error from '../../common/helpers/error'; import * as utils from '../helpers/utils'; import Promise from 'bluebird'; import renderRelationship from '../helpers/render'; + function makeLoader(modelName, propName, sortFunc) { return function loaderFunc(req, res, next) { const model = req.app.locals.orm[modelName]; @@ -141,7 +143,7 @@ export function makeEntityLoader(modelName, additionalRels, errMessage) { return async (req, res, next, bbid) => { const {orm} = req.app.locals; - if (utils.isValidBBID(bbid)) { + if (commonUtils.isValidBBID(bbid)) { try { const entity = await orm.func.entity.getEntity(orm, modelName, bbid, relations); if (!entity.dataId) { diff --git a/src/server/helpers/search.js b/src/server/helpers/search.js index 7f12a76e5..fe4b84d32 100644 --- a/src/server/helpers/search.js +++ b/src/server/helpers/search.js @@ -16,6 +16,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +import * as commonUtils from '../../common/helpers/utils'; import * as utils from '../helpers/utils'; import ElasticSearch from 'elasticsearch'; @@ -149,7 +150,7 @@ async function _processEntityListForBulk(entityList) { export function autocomplete(orm, query, collection) { let queryBody = null; - if (utils.isValidBBID(query)) { + if (commonUtils.isValidBBID(query)) { queryBody = { ids: { values: [query] diff --git a/src/server/helpers/utils.js b/src/server/helpers/utils.js index 837ca6ec3..8e22be34e 100644 --- a/src/server/helpers/utils.js +++ b/src/server/helpers/utils.js @@ -108,25 +108,6 @@ export function getEntityModelByType(orm: Object, type: string): Object { return entityModels[type]; } -/** - * Regular expression for valid BookBrainz UUIDs (bbid) - * - * @type {RegExp} - * @private - */ -const _bbidRegex = - /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/; - -/** - * Tests if a BookBrainz UUID is valid - * - * @param {string} bbid - BookBrainz UUID to validate - * @returns {boolean} - Returns true if BookBrainz UUID is valid - */ -export function isValidBBID(bbid: string): boolean { - return _bbidRegex.test(bbid); -} - /** * Helper-function / template-tag that allows the values of an object that * is passed in at a later time to be interpolated into a diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index fde947278..9c37b8188 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -30,10 +30,11 @@ chai.should(); const aBBID = getRandomUUID(); const bBBID = getRandomUUID(); +const inValidBBID = 'akjd-adjjk-23123'; describe('GET /work', () => { - beforeEach(() => createWork(aBBID)); - afterEach(truncateEntities); + before(() => createWork(aBBID)); + after(truncateEntities); // Test to get basic information of a work it('should get basic information of work', async function () { const res = await chai.request(app).get(`/work/${aBBID}`); @@ -50,19 +51,12 @@ describe('GET /work', () => { ); }); - it('should return status 404, if work is not founded', async function () { - const res = await chai.request(app).get(`/work/${bBBID}`); - - res.should.have.status(404); - res.body.should.be.a('object'); - res.body.message.should.equal('This Work is not founded'); - }); - it('should return list of aliases of work', async function () { const res = await chai.request(app).get(`/work/${aBBID}/aliases`); res.should.have.status(200); res.body.should.be.a('object'); + res.body.aliases.should.be.a('array'); res.body.should.all.keys( 'bbid', 'aliases' @@ -74,9 +68,44 @@ describe('GET /work', () => { res.should.have.status(200); res.body.should.be.a('object'); + res.body.identifiers.should.be.a('array'); res.body.should.all.keys( 'bbid', 'identifiers' ); }); + + it('should throw a 404 error if trying to access a work that does not exist', async function () { + const res = await chai.request(app).get(`/work/${bBBID}`); + + res.should.have.status(404); + res.body.should.be.a('object'); + res.body.message.should.equal('Work not found'); + }); + + it('should throw a 406 error if trying to access a work with ivalid BBID', async function () { + const res = await chai.request(app).get(`/work/${inValidBBID}`); + + res.should.have.status(406); + res.body.should.be.a('object'); + res.body.message.should.equal('BBID is not valid uuid'); + }); + + it('should throw a 404 error if trying to identifiers aliases of a work that does not exist', async function () { + const res = await chai.request(app).get(`/work/${bBBID}/identifiers`); + + res.should.have.status(404); + res.body.should.be.a('object'); + res.body.message.should.equal('Work not found'); + }); + + + it('should throw a 404 error if trying to access aliases of a work that does not exist', async function () { + const res = await chai.request(app).get(`/work/${bBBID}/aliases`); + + res.should.have.status(404); + res.body.should.be.a('object'); + res.body.message.should.equal('Work not found'); + }); }); + From 657aebc7a4ae5894cf56287ae0c9912749de7bfa Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Fri, 7 Jun 2019 00:55:27 +0530 Subject: [PATCH 66/78] refactor: use expect instead of should to make consistecy on tests --- test/src/api/routes/test-work.js | 56 ++++++++++++++------------------ 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index 9c37b8188..0adde9e2a 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -25,7 +25,7 @@ import chaiHttp from 'chai-http'; chai.use(chaiHttp); -chai.should(); +const {expect} = chai; const aBBID = getRandomUUID(); @@ -38,10 +38,9 @@ describe('GET /work', () => { // Test to get basic information of a work it('should get basic information of work', async function () { const res = await chai.request(app).get(`/work/${aBBID}`); - - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.should.have.all.keys( + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body).to.have.all.keys( 'bbid', 'defaultAlias', 'languages', @@ -53,11 +52,10 @@ describe('GET /work', () => { it('should return list of aliases of work', async function () { const res = await chai.request(app).get(`/work/${aBBID}/aliases`); - - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.aliases.should.be.a('array'); - res.body.should.all.keys( + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.aliases).to.be.an('array'); + expect(res.body).to.have.all.keys( 'bbid', 'aliases' ); @@ -65,11 +63,10 @@ describe('GET /work', () => { it('should return list of identifiers of work', async function () { const res = await chai.request(app).get(`/work/${aBBID}/identifiers`); - - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.identifiers.should.be.a('array'); - res.body.should.all.keys( + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.identifiers).to.be.an('array'); + expect(res.body).to.have.all.keys( 'bbid', 'identifiers' ); @@ -77,35 +74,30 @@ describe('GET /work', () => { it('should throw a 404 error if trying to access a work that does not exist', async function () { const res = await chai.request(app).get(`/work/${bBBID}`); - - res.should.have.status(404); - res.body.should.be.a('object'); - res.body.message.should.equal('Work not found'); + expect(res.status).to.equal(404); + expect(res.body).to.be.an('object'); + expect(res.body.message).to.equal('Work not found'); }); - it('should throw a 406 error if trying to access a work with ivalid BBID', async function () { + it('should throw a 406 error if trying to access a work with invalid BBID', async function () { const res = await chai.request(app).get(`/work/${inValidBBID}`); - - res.should.have.status(406); - res.body.should.be.a('object'); - res.body.message.should.equal('BBID is not valid uuid'); + expect(res.status).to.equal(406); + expect(res.body.message).to.equal('BBID is not valid uuid'); }); it('should throw a 404 error if trying to identifiers aliases of a work that does not exist', async function () { const res = await chai.request(app).get(`/work/${bBBID}/identifiers`); - - res.should.have.status(404); - res.body.should.be.a('object'); - res.body.message.should.equal('Work not found'); + expect(res.status).to.equal(404); + expect(res.body).to.be.an('object'); + expect(res.body.message).to.equal('Work not found'); }); it('should throw a 404 error if trying to access aliases of a work that does not exist', async function () { const res = await chai.request(app).get(`/work/${bBBID}/aliases`); - - res.should.have.status(404); - res.body.should.be.a('object'); - res.body.message.should.equal('Work not found'); + expect(res.status).to.equal(404); + expect(res.body).to.be.an('object'); + expect(res.body.message).to.equal('Work not found'); }); }); From 0df891034e4bd6989acae9a9b6f32c126a08baa3 Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Fri, 7 Jun 2019 12:54:03 +0200 Subject: [PATCH 67/78] test: Testing CI setup for testing expected API errors --- test/src/api/routes/test-work.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index 0adde9e2a..38f1e29ac 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -73,10 +73,19 @@ describe('GET /work', () => { }); it('should throw a 404 error if trying to access a work that does not exist', async function () { - const res = await chai.request(app).get(`/work/${bBBID}`); - expect(res.status).to.equal(404); - expect(res.body).to.be.an('object'); - expect(res.body.message).to.equal('Work not found'); + try { + const res = await chai.request(app).get(`/work/${bBBID}`); + expect(res).to.have.status(404); + expect(res.body).to.be.an('object'); + expect(res.body.message).to.equal('Work not found'); + } + catch ({response}) { + // Chai-http promise throws in CI, so we catch it here and test for it. + expect(response).to.have.status(404); + expect(response.body).to.be.an('object'); + expect(response.body.success).to.equal(false); + expect(response.body.errors[0]).to.equal('Work not found'); + } }); it('should throw a 406 error if trying to access a work with invalid BBID', async function () { From af86ffb2a07764bef177ecd5c05ccae197b960d8 Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Fri, 7 Jun 2019 13:19:14 +0200 Subject: [PATCH 68/78] test: Trying another method to test expected API errors --- test/src/api/routes/test-work.js | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index 38f1e29ac..f72ce6f93 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -72,20 +72,17 @@ describe('GET /work', () => { ); }); - it('should throw a 404 error if trying to access a work that does not exist', async function () { - try { - const res = await chai.request(app).get(`/work/${bBBID}`); - expect(res).to.have.status(404); - expect(res.body).to.be.an('object'); - expect(res.body.message).to.equal('Work not found'); - } - catch ({response}) { - // Chai-http promise throws in CI, so we catch it here and test for it. - expect(response).to.have.status(404); - expect(response.body).to.be.an('object'); - expect(response.body.success).to.equal(false); - expect(response.body.errors[0]).to.equal('Work not found'); - } + it('should throw a 404 error if trying to access a work that does not exist', function (done) { + chai.request(app) + .get(`/work/${bBBID}`) + .end(function (err, res) { + if (err) { return done(err); } + expect(res).to.have.status(404); + expect(res.ok).to.be.false; + expect(res.body).to.be.an('object'); + expect(res.body.message).to.equal('Work not found'); + return done(); + }); }); it('should throw a 406 error if trying to access a work with invalid BBID', async function () { From 0608ad4fc713d214adbc29d040a1fd95d25fa01b Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Sun, 9 Jun 2019 00:03:58 +0530 Subject: [PATCH 69/78] refactor: modify work tests to pass in CI --- test/src/api/routes/test-work.js | 47 ++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/test/src/api/routes/test-work.js b/test/src/api/routes/test-work.js index f72ce6f93..96c7290dc 100644 --- a/test/src/api/routes/test-work.js +++ b/test/src/api/routes/test-work.js @@ -85,25 +85,44 @@ describe('GET /work', () => { }); }); - it('should throw a 406 error if trying to access a work with invalid BBID', async function () { - const res = await chai.request(app).get(`/work/${inValidBBID}`); - expect(res.status).to.equal(406); - expect(res.body.message).to.equal('BBID is not valid uuid'); + it('should throw a 406 error if trying to access a work with invalid BBID', function (done) { + chai.request(app) + .get(`/work/${inValidBBID}`) + .end(function (err, res) { + if (err) { return done(err); } + expect(res).to.have.status(406); + expect(res.ok).to.be.false; + expect(res.body).to.be.an('object'); + expect(res.body.message).to.equal('BBID is not valid uuid'); + return done(); + }); }); - it('should throw a 404 error if trying to identifiers aliases of a work that does not exist', async function () { - const res = await chai.request(app).get(`/work/${bBBID}/identifiers`); - expect(res.status).to.equal(404); - expect(res.body).to.be.an('object'); - expect(res.body.message).to.equal('Work not found'); + it('should throw a 404 error if trying to identifiers aliases of a work that does not exist', function (done) { + chai.request(app) + .get(`/work/${bBBID}/identifiers`) + .end(function (err, res) { + if (err) { return done(err); } + expect(res).to.have.status(404); + expect(res.ok).to.be.false; + expect(res.body).to.be.an('object'); + expect(res.body.message).to.equal('Work not found'); + return done(); + }); }); - it('should throw a 404 error if trying to access aliases of a work that does not exist', async function () { - const res = await chai.request(app).get(`/work/${bBBID}/aliases`); - expect(res.status).to.equal(404); - expect(res.body).to.be.an('object'); - expect(res.body.message).to.equal('Work not found'); + it('should throw a 404 error if trying to access aliases of a work that does not exist', function (done) { + chai.request(app) + .get(`/work/${bBBID}/aliases`) + .end(function (err, res) { + if (err) { return done(err); } + expect(res).to.have.status(404); + expect(res.ok).to.be.false; + expect(res.body).to.be.an('object'); + expect(res.body.message).to.equal('Work not found'); + return done(); + }); }); }); From b0e22527623d67acd20607490ff40191a180b5c5 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Sun, 9 Jun 2019 00:09:27 +0530 Subject: [PATCH 70/78] feat: add new endpoints for lookup of editions --- src/api/helpers/formatEntityData.js | 39 +++++++++++--- src/api/routes.js | 6 +++ src/api/routes/edition.js | 63 ++++++++++++++++++++++ test/src/api/routes/test-edition.js | 81 +++++++++++++++++++++++++++++ 4 files changed, 183 insertions(+), 6 deletions(-) create mode 100644 src/api/routes/edition.js create mode 100644 test/src/api/routes/test-edition.js diff --git a/src/api/helpers/formatEntityData.js b/src/api/helpers/formatEntityData.js index b0ce9b6b1..cff459054 100644 --- a/src/api/helpers/formatEntityData.js +++ b/src/api/helpers/formatEntityData.js @@ -19,22 +19,49 @@ /* eslint-disable */ import _ from 'lodash'; +function getDefaultAlias(entity: object){ + return { + name: _.get(entity, 'defaultAlias.name', null), + sortName: _.get(entity, 'defaultAlias.sortName', null), + aliasLanguage: _.get(entity, 'defaultAlias.language.name', null) + } +} + +function getLanguages(entity: object) { + return _.get(entity, 'languageSet.languages', []).map((language) => language.name) +} + export function getWorkBasicInfo(work: object) { return _.isNil(work) ? null : { bbid: _.get(work, 'bbid', null), - defaultAlias: { - name: _.get(work, 'defaultAlias.name', null), - sortName: _.get(work, 'defaultAlias.sortName', null), - aliasLanguage: _.get(work, 'defaultAlias.language.name', null) - }, + defaultAlias: getDefaultAlias(work), disambiguation: _.get(work, 'disambiguation.comment', null), - languages: _.get(work, 'languageSet.languages', []).map((language) => language.name), + languages: getLanguages(work), workType: _.get(work, 'workType.label', null), entityType: _.get(work, 'type', null) }; } +export function getEditionBasicInfo(edition: object) { + + return _.isNil(edition) ? null : + { + bbid: _.get(edition, 'bbid', null), + defaultAlias: getDefaultAlias(edition), + languages: getLanguages(edition), + disambiguation: _.get(edition, 'disambiguation.comment', null), + hight: _.get(edition, 'hight', null), + width: _.get(edition, 'width', null), + depth: _.get(edition, 'depth', null), + pages: _.get(edition, 'pages', null), + releaseEventDates: _.get(edition, 'releaseEventSet.releaseEvents', []).map((event) => event.date), + editionFormat: _.get(edition, 'editioFormat.label', null), + weight: _.get(edition, 'waight', null), + status: _.get(edition, 'editionStatus.label', null) + } +} + export function getEntityAliases(work: object) { return _.isNil(work) ? null : { diff --git a/src/api/routes.js b/src/api/routes.js index cd87c9fe2..3258231c6 100644 --- a/src/api/routes.js +++ b/src/api/routes.js @@ -17,6 +17,7 @@ */ +import editionRouter from './routes/edition'; import workRouter from './routes/work'; @@ -24,9 +25,14 @@ function initWorkRoute(app) { app.use('/work', workRouter); } +function initEditionRoute(app) { + app.use('/edition', editionRouter); +} + function initRoutes(app) { initWorkRoute(app); + initEditionRoute(app); } export default initRoutes; diff --git a/src/api/routes/edition.js b/src/api/routes/edition.js new file mode 100644 index 000000000..c53bc2903 --- /dev/null +++ b/src/api/routes/edition.js @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {getEditionBasicInfo, getEntityAliases, getEntityIdentifiers} from '../helpers/formatEntityData'; +import _ from 'lodash'; +import express from 'express'; +import {makeEntityLoader} from '../helpers/entityLoader'; + + +const router = express.Router(); + +const editionBasicRelations = [ + 'defaultAlias.language', + 'languageSet.languages', + 'disambiguation', + 'editionFormat', + 'editionStatus', + 'releaseEventSet.releaseEvents' +]; + +const editionError = 'Edition not found'; + +router.get('/:bbid', + makeEntityLoader('Edition', editionBasicRelations, editionError), + async (req, res, next) => { + const editionBasicInfo = await getEditionBasicInfo(res.locals.entity); + return res.status(200).send(editionBasicInfo); + }); + +const editionAliasRelation = ['aliasSet.aliases.language']; + +router.get('/:bbid/aliases', + makeEntityLoader('Edition', editionAliasRelation, editionError), + async (req, res, next) => { + const editionAliasesList = await getEntityAliases(res.locals.entity); + return res.status(200).send(editionAliasesList); + }); + +const editionIdentifierRelation = ['identifierSet.identifiers.type']; + +router.get('/:bbid/identifiers', + makeEntityLoader('Edition', editionIdentifierRelation, editionError), + async (req, res, next) => { + const editionIdentifiersList = await getEntityIdentifiers(res.locals.entity); + return res.status(200).send(editionIdentifiersList); + }); + +export default router; diff --git a/test/src/api/routes/test-edition.js b/test/src/api/routes/test-edition.js new file mode 100644 index 000000000..0fa9132eb --- /dev/null +++ b/test/src/api/routes/test-edition.js @@ -0,0 +1,81 @@ +/* eslint-disable prefer-arrow-callback,func-names */ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {createEdition, getRandomUUID, truncateEntities} from '../../../test-helpers/create-entities'; + +import app from '../../../../src/api/app'; +import chai from 'chai'; +import chaiHttp from 'chai-http'; + + +chai.use(chaiHttp); +const {expect} = chai; + + +const aBBID = getRandomUUID(); +const bBBID = getRandomUUID(); +const inValidBBID = 'akjd-adjjk-23123'; + +describe('GET /Edition', () => { + before(() => createEdition(aBBID)); + after(truncateEntities); + // Test to get basic information of a work + it('should get basic information of edition', async function () { + const res = await chai.request(app).get(`/edition/${aBBID}`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body).to.have.all.keys( + 'bbid', + 'defaultAlias', + 'languages', + 'disambiguation', + 'editionFormat', + 'hight', + 'width', + 'depth', + 'pages', + 'status', + 'releaseEventDates', + 'weight' + ); + }); + + it('should return list of aliases of Edition', async function () { + const res = await chai.request(app).get(`/edition/${aBBID}/aliases`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.aliases).to.be.an('array'); + expect(res.body).to.have.all.keys( + 'bbid', + 'aliases' + ); + }); + + it('should return list of identifiers of edition', async function () { + const res = await chai.request(app).get(`/edition/${aBBID}/identifiers`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.identifiers).to.be.an('array'); + expect(res.body).to.have.all.keys( + 'bbid', + 'identifiers' + ); + }); +}); + From d4b5a6cb61b7b401d3f45c841d08be5368517cc4 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Wed, 12 Jun 2019 22:56:03 +0530 Subject: [PATCH 71/78] feat: add lookup endpoints for edition-group and author with basic tests --- src/api/helpers/formatEntityData.js | 26 ++++++++ src/api/routes.js | 13 +++- src/api/routes/author.js | 63 ++++++++++++++++++ src/api/routes/edition-group.js | 60 +++++++++++++++++ test/src/api/routes/test-author.js | 79 +++++++++++++++++++++++ test/src/api/routes/test-edition-group.js | 73 +++++++++++++++++++++ test/src/api/routes/test-edition.js | 2 +- test/test-helpers/create-entities.js | 44 ++++++++++++- 8 files changed, 357 insertions(+), 3 deletions(-) create mode 100644 src/api/routes/author.js create mode 100644 src/api/routes/edition-group.js create mode 100644 test/src/api/routes/test-author.js create mode 100644 test/src/api/routes/test-edition-group.js diff --git a/src/api/helpers/formatEntityData.js b/src/api/helpers/formatEntityData.js index cff459054..d2dd56ed3 100644 --- a/src/api/helpers/formatEntityData.js +++ b/src/api/helpers/formatEntityData.js @@ -62,6 +62,32 @@ export function getEditionBasicInfo(edition: object) { } } +export function getEditionGroupBasicInfo(editionGroup: object) { + return _.isNil(editionGroup) ? null : + { + bbid: _.get(editionGroup, 'bbid', null), + defaultAlias: getDefaultAlias(editionGroup), + disambiguation: _.get(editionGroup, 'disambiguation.comment', null), + type: _.get(editionGroup, 'editionGroupType.label') + } +} + +export function getAuthorBasicInfo(author: object) { + return _.isNil(author) ? null : + { + bbid: _.get(author, 'bbid', null), + defaultAlias: getDefaultAlias(author), + disambiguation: _.get(author, 'disambiguation.comment', null), + type: _.get(author, 'authorType.label', null), + gender: _.get(author, 'gender.name', null), + beginArea: _.get(author, 'beginArea.name', null), + beginDate: _.get(author, 'beginDate', null), + ended: _.get(author, 'ended', null), + endArea: _.get(author, 'endArea.name', null), + endDate: _.get(author, 'endDate', null) + } +} + export function getEntityAliases(work: object) { return _.isNil(work) ? null : { diff --git a/src/api/routes.js b/src/api/routes.js index 3258231c6..725087ed7 100644 --- a/src/api/routes.js +++ b/src/api/routes.js @@ -16,7 +16,8 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - +import authorRouter from './routes/author'; +import editionGroupRouter from './routes/edition-group'; import editionRouter from './routes/edition'; import workRouter from './routes/work'; @@ -29,10 +30,20 @@ function initEditionRoute(app) { app.use('/edition', editionRouter); } +function initEditionGroupRoute(app) { + app.use('/edition-group', editionGroupRouter); +} + +function initAuthorRoute(app) { + app.use('/author', authorRouter); +} + function initRoutes(app) { initWorkRoute(app); initEditionRoute(app); + initEditionGroupRoute(app); + initAuthorRoute(app); } export default initRoutes; diff --git a/src/api/routes/author.js b/src/api/routes/author.js new file mode 100644 index 000000000..97e90e815 --- /dev/null +++ b/src/api/routes/author.js @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {getAuthorBasicInfo, getEntityAliases, getEntityIdentifiers} from '../helpers/formatEntityData'; +import _ from 'lodash'; +import express from 'express'; +import {makeEntityLoader} from '../helpers/entityLoader'; + + +const router = express.Router(); + +const authorBasicRelations = [ + 'defaultAlias.language', + 'disambiguation', + 'authorType', + 'gender', + 'beginArea', + 'endArea' +]; + +const authorError = 'Author not found'; + +router.get('/:bbid', + makeEntityLoader('Author', authorBasicRelations, authorError), + async (req, res, next) => { + const authorBasicInfo = await getAuthorBasicInfo(res.locals.entity); + return res.status(200).send(authorBasicInfo); + }); + +const authorAliasRelation = ['aliasSet.aliases.language']; + +router.get('/:bbid/aliases', + makeEntityLoader('Author', authorAliasRelation, authorError), + async (req, res, next) => { + const authorAliasesList = await getEntityAliases(res.locals.entity); + return res.status(200).send(authorAliasesList); + }); + +const authorIdentifierRelation = ['identifierSet.identifiers.type']; + +router.get('/:bbid/identifiers', + makeEntityLoader('Author', authorIdentifierRelation, authorError), + async (req, res, next) => { + const authorIdentifiersList = await getEntityIdentifiers(res.locals.entity); + return res.status(200).send(authorIdentifiersList); + }); + +export default router; diff --git a/src/api/routes/edition-group.js b/src/api/routes/edition-group.js new file mode 100644 index 000000000..d891f456a --- /dev/null +++ b/src/api/routes/edition-group.js @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {getEditionGroupBasicInfo, getEntityAliases, getEntityIdentifiers} from '../helpers/formatEntityData'; +import _ from 'lodash'; +import express from 'express'; +import {makeEntityLoader} from '../helpers/entityLoader'; + + +const router = express.Router(); + +const editionGroupBasicRelations = [ + 'defaultAlias.language', + 'disambiguation', + 'editionGroupType' +]; + +const editionGroupError = 'Edition-Group not found'; + +router.get('/:bbid', + makeEntityLoader('EditionGroup', editionGroupBasicRelations, editionGroupError), + async (req, res, next) => { + const editionGroupBasicInfo = await getEditionGroupBasicInfo(res.locals.entity); + return res.status(200).send(editionGroupBasicInfo); + }); + +const editionGroupAliasRelation = ['aliasSet.aliases.language']; + +router.get('/:bbid/aliases', + makeEntityLoader('EditionGroup', editionGroupAliasRelation, editionGroupError), + async (req, res, next) => { + const editionAliasesList = await getEntityAliases(res.locals.entity); + return res.status(200).send(editionAliasesList); + }); + +const editionGroupIdentifierRelation = ['identifierSet.identifiers.type']; + +router.get('/:bbid/identifiers', + makeEntityLoader('EditionGroup', editionGroupIdentifierRelation, editionGroupError), + async (req, res, next) => { + const editionGroupIdentifiersList = await getEntityIdentifiers(res.locals.entity); + return res.status(200).send(editionGroupIdentifiersList); + }); + +export default router; diff --git a/test/src/api/routes/test-author.js b/test/src/api/routes/test-author.js new file mode 100644 index 000000000..25f85d508 --- /dev/null +++ b/test/src/api/routes/test-author.js @@ -0,0 +1,79 @@ +/* eslint-disable prefer-arrow-callback,func-names */ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {createAuthor, getRandomUUID, truncateEntities} from '../../../test-helpers/create-entities'; + +import app from '../../../../src/api/app'; +import chai from 'chai'; +import chaiHttp from 'chai-http'; + + +chai.use(chaiHttp); +const {expect} = chai; + + +const aBBID = getRandomUUID(); +const bBBID = getRandomUUID(); +const inValidBBID = 'akjd-adjjk-23123'; + +describe('GET /Author', () => { + before(() => createAuthor(aBBID)); + after(truncateEntities); + // Test to get basic information of an author + it('should get basic information of an author', async function () { + const res = await chai.request(app).get(`/author/${aBBID}`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body).to.have.all.keys( + 'bbid', + 'defaultAlias', + 'disambiguation', + 'type', + 'gender', + 'beginArea', + 'beginDate', + 'endArea', + 'endDate', + 'ended' + ); + }); + + it('should return list of aliases of an author', async function () { + const res = await chai.request(app).get(`/author/${aBBID}/aliases`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.aliases).to.be.an('array'); + expect(res.body).to.have.all.keys( + 'bbid', + 'aliases' + ); + }); + + it('should return list of identifiers of an author', async function () { + const res = await chai.request(app).get(`/author/${aBBID}/identifiers`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.identifiers).to.be.an('array'); + expect(res.body).to.have.all.keys( + 'bbid', + 'identifiers' + ); + }); +}); + diff --git a/test/src/api/routes/test-edition-group.js b/test/src/api/routes/test-edition-group.js new file mode 100644 index 000000000..3078d8760 --- /dev/null +++ b/test/src/api/routes/test-edition-group.js @@ -0,0 +1,73 @@ +/* eslint-disable prefer-arrow-callback,func-names */ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {createEditionGroup, getRandomUUID, truncateEntities} from '../../../test-helpers/create-entities'; + +import app from '../../../../src/api/app'; +import chai from 'chai'; +import chaiHttp from 'chai-http'; + + +chai.use(chaiHttp); +const {expect} = chai; + + +const aBBID = getRandomUUID(); +const bBBID = getRandomUUID(); +const inValidBBID = 'akjd-adjjk-23123'; + +describe('GET /EditionGroup', () => { + before(() => createEditionGroup(aBBID)); + after(truncateEntities); + // Test to get basic information of an Edition Group + it('should get basic information of edition group', async function () { + const res = await chai.request(app).get(`/edition-group/${aBBID}`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body).to.have.all.keys( + 'bbid', + 'defaultAlias', + 'disambiguation', + 'type' + ); + }); + + it('should return list of aliases of Edition Group', async function () { + const res = await chai.request(app).get(`/edition-group/${aBBID}/aliases`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.aliases).to.be.an('array'); + expect(res.body).to.have.all.keys( + 'bbid', + 'aliases' + ); + }); + + it('should return list of identifiers of edition group', async function () { + const res = await chai.request(app).get(`/edition-group/${aBBID}/identifiers`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.identifiers).to.be.an('array'); + expect(res.body).to.have.all.keys( + 'bbid', + 'identifiers' + ); + }); +}); + diff --git a/test/src/api/routes/test-edition.js b/test/src/api/routes/test-edition.js index 0fa9132eb..d2f89854b 100644 --- a/test/src/api/routes/test-edition.js +++ b/test/src/api/routes/test-edition.js @@ -35,7 +35,7 @@ const inValidBBID = 'akjd-adjjk-23123'; describe('GET /Edition', () => { before(() => createEdition(aBBID)); after(truncateEntities); - // Test to get basic information of a work + // Test to get basic information of an Edition it('should get basic information of edition', async function () { const res = await chai.request(app).get(`/edition/${aBBID}`); expect(res.status).to.equal(200); diff --git a/test/test-helpers/create-entities.js b/test/test-helpers/create-entities.js index a406d4725..fe0246da6 100644 --- a/test/test-helpers/create-entities.js +++ b/test/test-helpers/create-entities.js @@ -26,7 +26,7 @@ const { Alias, AliasSet, Identifier, IdentifierType, IdentifierSet, Disambiguation, Entity, Annotation, Gender, Author, Edition, EditionGroup, Publisher, Work, - Language, WorkType + Language, WorkType, EditionGroupType, AuthorType } = orm; const {updateLanguageSet} = orm.func.language; @@ -193,6 +193,46 @@ export async function createWork(optionalBBID) { .save(null, {method: 'insert'}); } +export async function createEditionGroup(optionalBBID) { + const bbid = optionalBBID || uuidv4(); + await createEntityPrerequisites(); + const editionGroupAttribs = { + bbid, + typeId: setData.id + }; + await new EditionGroupType({...setData, label: 'Edition Group Type 1'}) + .save(null, {method: 'insert'}); + await new Entity({bbid, type: 'EditionGroup'}) + .save(null, {method: 'insert'}); + await new EditionGroup({...entityAttribs, ...editionGroupAttribs}) + .save(null, {method: 'insert'}); +} + +export async function createAuthor(optionalBBID) { + const bbid = optionalBBID || uuidv4(); + await createEntityPrerequisites(); + const authorAttribs = { + bbid, + beginAreaId: setData.id, + beginDay: 25, + beginMonth: 12, + beginYear: 2000, + endAreaId: setData.id, + endDay: 10, + endMonth: 5, + endYear: 2012, + ended: true, + genderId: setData.id, + typeId: setData.id + }; + await new AuthorType({...setData, label: 'Author Type 1'}) + .save(null, {method: 'insert'}); + await new Entity({bbid, type: 'Author'}) + .save(null, {method: 'insert'}); + await new Author({...entityAttribs, ...authorAttribs}) + .save(null, {method: 'insert'}); +} + export function truncateEntities() { return util.truncateTables(bookshelf, [ 'bookbrainz.editor', @@ -209,6 +249,8 @@ export function truncateEntities() { 'bookbrainz.revision', 'bookbrainz.annotation', 'bookbrainz.work_type', + 'bookbrainz.edition_group_type', + 'bookbrainz.author_type', 'musicbrainz.language', 'musicbrainz.gender' ]); From 7801e3ab67362ef9ed0ca3d295be98baeec2dcce Mon Sep 17 00:00:00 2001 From: Monkey Do Date: Thu, 13 Jun 2019 14:06:11 +0200 Subject: [PATCH 72/78] tests: Added Area when creating Author test entity --- test/test-helpers/create-entities.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/test-helpers/create-entities.js b/test/test-helpers/create-entities.js index fe0246da6..76da8f2b6 100644 --- a/test/test-helpers/create-entities.js +++ b/test/test-helpers/create-entities.js @@ -23,7 +23,7 @@ import uuidv4 from 'uuid/v4'; const { bookshelf, util, Editor, EditorType, Revision, RelationshipSet, - Alias, AliasSet, Identifier, IdentifierType, IdentifierSet, + Alias, AliasSet, Area, Identifier, IdentifierType, IdentifierSet, Disambiguation, Entity, Annotation, Gender, Author, Edition, EditionGroup, Publisher, Work, Language, WorkType, EditionGroupType, AuthorType @@ -225,6 +225,8 @@ export async function createAuthor(optionalBBID) { genderId: setData.id, typeId: setData.id }; + await new Area({...setData, gid: uuidv4(), name: 'Rlyeh'}) + .save(null, {method: 'insert'}); await new AuthorType({...setData, label: 'Author Type 1'}) .save(null, {method: 'insert'}); await new Entity({bbid, type: 'Author'}) From 7e020bcfc017d30a1378703e6d15adac292a2d57 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Thu, 13 Jun 2019 23:07:54 +0530 Subject: [PATCH 73/78] feat: add publisher endpoints for lookup --- src/api/helpers/formatEntityData.js | 14 +++++ src/api/routes.js | 6 +++ src/api/routes/publisher.js | 61 +++++++++++++++++++++ test/src/api/routes/test-publisher.js | 77 +++++++++++++++++++++++++++ test/test-helpers/create-entities.js | 29 +++++++++- 5 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 src/api/routes/publisher.js create mode 100644 test/src/api/routes/test-publisher.js diff --git a/src/api/helpers/formatEntityData.js b/src/api/helpers/formatEntityData.js index d2dd56ed3..e529fd864 100644 --- a/src/api/helpers/formatEntityData.js +++ b/src/api/helpers/formatEntityData.js @@ -88,6 +88,20 @@ export function getAuthorBasicInfo(author: object) { } } +export function getPublisherBasicInfo(publisher: object) { + return _.isNil(publisher) ? null : + { + bbid: _.get(publisher, 'bbid', null), + defaultAlias: getDefaultAlias(publisher), + disambiguation: _.get(publisher, 'disambiguation.comment', null), + type: _.get(publisher, 'publisherType.label', null), + area: _.get(publisher, 'area.name', null), + beginDate: _.get(publisher, 'beginDate', null), + ended: _.get(publisher, 'ended', null), + endDate: _.get(publisher, 'endDate', null) + } +} + export function getEntityAliases(work: object) { return _.isNil(work) ? null : { diff --git a/src/api/routes.js b/src/api/routes.js index 725087ed7..63ac2154d 100644 --- a/src/api/routes.js +++ b/src/api/routes.js @@ -19,6 +19,7 @@ import authorRouter from './routes/author'; import editionGroupRouter from './routes/edition-group'; import editionRouter from './routes/edition'; +import publisherRouter from './routes/publisher'; import workRouter from './routes/work'; @@ -38,12 +39,17 @@ function initAuthorRoute(app) { app.use('/author', authorRouter); } +function initPublishetRouter(app) { + app.use('/publisher', publisherRouter); +} + function initRoutes(app) { initWorkRoute(app); initEditionRoute(app); initEditionGroupRoute(app); initAuthorRoute(app); + initPublishetRouter(app); } export default initRoutes; diff --git a/src/api/routes/publisher.js b/src/api/routes/publisher.js new file mode 100644 index 000000000..c3972a036 --- /dev/null +++ b/src/api/routes/publisher.js @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {getEntityAliases, getEntityIdentifiers, getPublisherBasicInfo} from '../helpers/formatEntityData'; +import _ from 'lodash'; +import express from 'express'; +import {makeEntityLoader} from '../helpers/entityLoader'; + + +const router = express.Router(); + +const publisherBasicRelations = [ + 'defaultAlias.language', + 'disambiguation', + 'publisherType', + 'area' +]; + +const publisherError = 'Publisher not found'; + +router.get('/:bbid', + makeEntityLoader('Publisher', publisherBasicRelations, publisherError), + async (req, res, next) => { + const publisherBasicInfo = await getPublisherBasicInfo(res.locals.entity); + return res.status(200).send(publisherBasicInfo); + }); + +const publisherAliasRelation = ['aliasSet.aliases.language']; + +router.get('/:bbid/aliases', + makeEntityLoader('Publisher', publisherAliasRelation, publisherError), + async (req, res, next) => { + const publisherAliasesList = await getEntityAliases(res.locals.entity); + return res.status(200).send(publisherAliasesList); + }); + +const publisherIdentifierRelation = ['identifierSet.identifiers.type']; + +router.get('/:bbid/identifiers', + makeEntityLoader('Publisher', publisherIdentifierRelation, publisherError), + async (req, res, next) => { + const publisherIdentifiersList = await getEntityIdentifiers(res.locals.entity); + return res.status(200).send(publisherIdentifiersList); + }); + +export default router; diff --git a/test/src/api/routes/test-publisher.js b/test/src/api/routes/test-publisher.js new file mode 100644 index 000000000..84dfe53cb --- /dev/null +++ b/test/src/api/routes/test-publisher.js @@ -0,0 +1,77 @@ +/* eslint-disable prefer-arrow-callback,func-names */ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {createPublisher, getRandomUUID, truncateEntities} from '../../../test-helpers/create-entities'; + +import app from '../../../../src/api/app'; +import chai from 'chai'; +import chaiHttp from 'chai-http'; + + +chai.use(chaiHttp); +const {expect} = chai; + + +const aBBID = getRandomUUID(); +const bBBID = getRandomUUID(); +const inValidBBID = 'akjd-adjjk-23123'; + +describe('GET /Publisher', () => { + before(() => createPublisher(aBBID)); + after(truncateEntities); + // Test to get basic information of a publisher + it('should get basic information of a publisher', async function () { + const res = await chai.request(app).get(`/publisher/${aBBID}`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body).to.have.all.keys( + 'bbid', + 'defaultAlias', + 'disambiguation', + 'type', + 'area', + 'beginDate', + 'endDate', + 'ended' + ); + }); + + it('should return list of aliases of a publisher', async function () { + const res = await chai.request(app).get(`/publisher/${aBBID}/aliases`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.aliases).to.be.an('array'); + expect(res.body).to.have.all.keys( + 'bbid', + 'aliases' + ); + }); + + it('should return list of identifiers of a publisher', async function () { + const res = await chai.request(app).get(`/publisher/${aBBID}/identifiers`); + expect(res.status).to.equal(200); + expect(res.body).to.be.an('object'); + expect(res.body.identifiers).to.be.an('array'); + expect(res.body).to.have.all.keys( + 'bbid', + 'identifiers' + ); + }); +}); + diff --git a/test/test-helpers/create-entities.js b/test/test-helpers/create-entities.js index 76da8f2b6..481f16b1b 100644 --- a/test/test-helpers/create-entities.js +++ b/test/test-helpers/create-entities.js @@ -26,7 +26,7 @@ const { Alias, AliasSet, Area, Identifier, IdentifierType, IdentifierSet, Disambiguation, Entity, Annotation, Gender, Author, Edition, EditionGroup, Publisher, Work, - Language, WorkType, EditionGroupType, AuthorType + Language, WorkType, EditionGroupType, AuthorType, PublisherType } = orm; const {updateLanguageSet} = orm.func.language; @@ -235,6 +235,31 @@ export async function createAuthor(optionalBBID) { .save(null, {method: 'insert'}); } +export async function createPublisher(optionalBBID) { + const bbid = optionalBBID || uuidv4(); + await createEntityPrerequisites(); + const publisherAttribs = { + areaId: setData.id, + bbid, + beginDay: 25, + beginMonth: 12, + beginYear: 2000, + endDay: 10, + endMonth: 5, + endYear: 2012, + ended: true, + typeId: setData.id + }; + await new Area({...setData, gid: uuidv4(), name: 'Rlyeh'}) + .save(null, {method: 'insert'}); + await new PublisherType({...setData, label: 'Publisher Type 1'}) + .save(null, {method: 'insert'}); + await new Entity({bbid, type: 'Publisher'}) + .save(null, {method: 'insert'}); + await new Publisher({...entityAttribs, ...publisherAttribs}) + .save(null, {method: 'insert'}); +} + export function truncateEntities() { return util.truncateTables(bookshelf, [ 'bookbrainz.editor', @@ -253,6 +278,8 @@ export function truncateEntities() { 'bookbrainz.work_type', 'bookbrainz.edition_group_type', 'bookbrainz.author_type', + 'bookbrainz.publisher_type', + 'musicbrainz.area', 'musicbrainz.language', 'musicbrainz.gender' ]); From 5496a030b2ddb806d880a3c4b927efc6f29fbc96 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Fri, 14 Jun 2019 01:40:48 +0530 Subject: [PATCH 74/78] fix: fix typo and replace entity in place of work for common function --- src/api/helpers/formatEntityData.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/api/helpers/formatEntityData.js b/src/api/helpers/formatEntityData.js index e529fd864..29670a2b6 100644 --- a/src/api/helpers/formatEntityData.js +++ b/src/api/helpers/formatEntityData.js @@ -56,8 +56,8 @@ export function getEditionBasicInfo(edition: object) { depth: _.get(edition, 'depth', null), pages: _.get(edition, 'pages', null), releaseEventDates: _.get(edition, 'releaseEventSet.releaseEvents', []).map((event) => event.date), - editionFormat: _.get(edition, 'editioFormat.label', null), - weight: _.get(edition, 'waight', null), + editionFormat: _.get(edition, 'editionFormat.label', null), + weight: _.get(edition, 'weight', null), status: _.get(edition, 'editionStatus.label', null) } } @@ -102,11 +102,11 @@ export function getPublisherBasicInfo(publisher: object) { } } -export function getEntityAliases(work: object) { - return _.isNil(work) ? null : +export function getEntityAliases(entity: object) { + return _.isNil(entity) ? null : { - bbid: _.get(work, 'bbid', null), - aliases: _.get(work, 'aliasSet.aliases', []).map((alias) => { + bbid: _.get(entity, 'bbid', null), + aliases: _.get(entity, 'aliasSet.aliases', []).map((alias) => { return { name: alias.name, sortName: alias.sortName, @@ -117,11 +117,11 @@ export function getEntityAliases(work: object) { }; } -export function getEntityIdentifiers(work: object) { - return _.isNil(work) ? null : +export function getEntityIdentifiers(entity: object) { + return _.isNil(entity) ? null : { - bbid: _.get(work, 'bbid', null), - identifiers: _.get(work, 'identifierSet.identifiers', []).map((identifier) => { + bbid: _.get(entity, 'bbid', null), + identifiers: _.get(entity, 'identifierSet.identifiers', []).map((identifier) => { return { type: identifier.type.label, value: identifier.value From 43bb119742ab6beee5cffe47d6fa8974e1539d58 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Fri, 14 Jun 2019 01:43:32 +0530 Subject: [PATCH 75/78] refactor: remove unnecessary file --- src/common/queries/work.js | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 src/common/queries/work.js diff --git a/src/common/queries/work.js b/src/common/queries/work.js deleted file mode 100644 index 952462d75..000000000 --- a/src/common/queries/work.js +++ /dev/null @@ -1,18 +0,0 @@ -/* eslint-disable */ - -import _ from 'lodash'; - - - - -export async function getWorkFromDB(req, relations) { - const {orm} = req.app.locals; - const {Work} = orm; - - const workPromise = Work.forge({bbid: req.params.bbid}) - .fetch({withRelated: relations}) - - const workData = await Promise.resolve(workPromise) - - return workData; -} From 9ef3a4841eaf67fe34b3a1a204fb46b9ea752f71 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Fri, 14 Jun 2019 01:48:47 +0530 Subject: [PATCH 76/78] refactor: move common relation to helpers/utils and update error on invalid url --- package.json | 2 +- src/api/app.js | 2 +- src/api/helpers/utils.js | 20 ++++++++++++++++++++ src/api/routes/author.js | 7 +++---- src/api/routes/edition-group.js | 7 +++---- src/api/routes/edition.js | 7 +++---- src/api/routes/publisher.js | 7 +++---- src/api/routes/work.js | 7 +++---- 8 files changed, 37 insertions(+), 22 deletions(-) create mode 100644 src/api/helpers/utils.js diff --git a/package.json b/package.json index 838fe63af..b1ed71663 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "WIP-build-client-webpack": "cross-env NODE_ENV=production SSR=true webpack --progress --config webpack.client.js", "prestart": "npm run build-less & npm run build-client-js & npm run build-server-js", "start": "cross-env SSR=true node ./lib/server/app.js", - "start-api": "npm run build-api-js && cross-env SSR=true node ./lib/api/app.js", + "start-api": "npm run build-api-js && node ./lib/api/app.js", "debug": "cross-env DEBUG=bbsite NODE_ENV=development SSR=true babel-node src/server/app.js", "debug-watch-server": "cross-env DEBUG=bbsite NODE_ENV=development SSR=true nodemon src/server/app.js --watch src/server --exec babel-node", "lint": "eslint .", diff --git a/src/api/app.js b/src/api/app.js index fa3911a24..97055a3e2 100644 --- a/src/api/app.js +++ b/src/api/app.js @@ -82,7 +82,7 @@ routes(app); // Catch 404 and forward to error handler app.use((req, res, next) => { - next(new error.NotFoundError(null, req)); + res.status(404).send({message: `Incorrect endpoint ${req.path}`}); }); diff --git a/src/api/helpers/utils.js b/src/api/helpers/utils.js new file mode 100644 index 000000000..25706935f --- /dev/null +++ b/src/api/helpers/utils.js @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +export const aliasesRelation = ['aliasSet.aliases.language']; +export const identifiersRelation = ['identifierSet.identifiers.type']; diff --git a/src/api/routes/author.js b/src/api/routes/author.js index 97e90e815..26696af09 100644 --- a/src/api/routes/author.js +++ b/src/api/routes/author.js @@ -16,6 +16,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +import {aliasesRelation, identifiersRelation} from '../helpers/utils'; import {getAuthorBasicInfo, getEntityAliases, getEntityIdentifiers} from '../helpers/formatEntityData'; import _ from 'lodash'; import express from 'express'; @@ -42,19 +43,17 @@ router.get('/:bbid', return res.status(200).send(authorBasicInfo); }); -const authorAliasRelation = ['aliasSet.aliases.language']; router.get('/:bbid/aliases', - makeEntityLoader('Author', authorAliasRelation, authorError), + makeEntityLoader('Author', aliasesRelation, authorError), async (req, res, next) => { const authorAliasesList = await getEntityAliases(res.locals.entity); return res.status(200).send(authorAliasesList); }); -const authorIdentifierRelation = ['identifierSet.identifiers.type']; router.get('/:bbid/identifiers', - makeEntityLoader('Author', authorIdentifierRelation, authorError), + makeEntityLoader('Author', identifiersRelation, authorError), async (req, res, next) => { const authorIdentifiersList = await getEntityIdentifiers(res.locals.entity); return res.status(200).send(authorIdentifiersList); diff --git a/src/api/routes/edition-group.js b/src/api/routes/edition-group.js index d891f456a..e0ac3c10a 100644 --- a/src/api/routes/edition-group.js +++ b/src/api/routes/edition-group.js @@ -16,6 +16,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +import {aliasesRelation, identifiersRelation} from '../helpers/utils'; import {getEditionGroupBasicInfo, getEntityAliases, getEntityIdentifiers} from '../helpers/formatEntityData'; import _ from 'lodash'; import express from 'express'; @@ -39,19 +40,17 @@ router.get('/:bbid', return res.status(200).send(editionGroupBasicInfo); }); -const editionGroupAliasRelation = ['aliasSet.aliases.language']; router.get('/:bbid/aliases', - makeEntityLoader('EditionGroup', editionGroupAliasRelation, editionGroupError), + makeEntityLoader('EditionGroup', aliasesRelation, editionGroupError), async (req, res, next) => { const editionAliasesList = await getEntityAliases(res.locals.entity); return res.status(200).send(editionAliasesList); }); -const editionGroupIdentifierRelation = ['identifierSet.identifiers.type']; router.get('/:bbid/identifiers', - makeEntityLoader('EditionGroup', editionGroupIdentifierRelation, editionGroupError), + makeEntityLoader('EditionGroup', identifiersRelation, editionGroupError), async (req, res, next) => { const editionGroupIdentifiersList = await getEntityIdentifiers(res.locals.entity); return res.status(200).send(editionGroupIdentifiersList); diff --git a/src/api/routes/edition.js b/src/api/routes/edition.js index c53bc2903..9ff04d0e5 100644 --- a/src/api/routes/edition.js +++ b/src/api/routes/edition.js @@ -16,6 +16,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +import {aliasesRelation, identifiersRelation} from '../helpers/utils'; import {getEditionBasicInfo, getEntityAliases, getEntityIdentifiers} from '../helpers/formatEntityData'; import _ from 'lodash'; import express from 'express'; @@ -42,19 +43,17 @@ router.get('/:bbid', return res.status(200).send(editionBasicInfo); }); -const editionAliasRelation = ['aliasSet.aliases.language']; router.get('/:bbid/aliases', - makeEntityLoader('Edition', editionAliasRelation, editionError), + makeEntityLoader('Edition', aliasesRelation, editionError), async (req, res, next) => { const editionAliasesList = await getEntityAliases(res.locals.entity); return res.status(200).send(editionAliasesList); }); -const editionIdentifierRelation = ['identifierSet.identifiers.type']; router.get('/:bbid/identifiers', - makeEntityLoader('Edition', editionIdentifierRelation, editionError), + makeEntityLoader('Edition', identifiersRelation, editionError), async (req, res, next) => { const editionIdentifiersList = await getEntityIdentifiers(res.locals.entity); return res.status(200).send(editionIdentifiersList); diff --git a/src/api/routes/publisher.js b/src/api/routes/publisher.js index c3972a036..523bcbb03 100644 --- a/src/api/routes/publisher.js +++ b/src/api/routes/publisher.js @@ -16,6 +16,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +import {aliasesRelation, identifiersRelation} from '../helpers/utils'; import {getEntityAliases, getEntityIdentifiers, getPublisherBasicInfo} from '../helpers/formatEntityData'; import _ from 'lodash'; import express from 'express'; @@ -40,19 +41,17 @@ router.get('/:bbid', return res.status(200).send(publisherBasicInfo); }); -const publisherAliasRelation = ['aliasSet.aliases.language']; router.get('/:bbid/aliases', - makeEntityLoader('Publisher', publisherAliasRelation, publisherError), + makeEntityLoader('Publisher', aliasesRelation, publisherError), async (req, res, next) => { const publisherAliasesList = await getEntityAliases(res.locals.entity); return res.status(200).send(publisherAliasesList); }); -const publisherIdentifierRelation = ['identifierSet.identifiers.type']; router.get('/:bbid/identifiers', - makeEntityLoader('Publisher', publisherIdentifierRelation, publisherError), + makeEntityLoader('Publisher', identifiersRelation, publisherError), async (req, res, next) => { const publisherIdentifiersList = await getEntityIdentifiers(res.locals.entity); return res.status(200).send(publisherIdentifiersList); diff --git a/src/api/routes/work.js b/src/api/routes/work.js index d8be04e26..5b35a8ea0 100644 --- a/src/api/routes/work.js +++ b/src/api/routes/work.js @@ -16,6 +16,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +import {aliasesRelation, identifiersRelation} from '../helpers/utils'; import {getEntityAliases, getEntityIdentifiers, getWorkBasicInfo} from '../helpers/formatEntityData'; import _ from 'lodash'; import express from 'express'; @@ -40,19 +41,17 @@ router.get('/:bbid', return res.status(200).send(workBasicInfo); }); -const workAliasRelation = ['aliasSet.aliases.language']; router.get('/:bbid/aliases', - makeEntityLoader('Work', workAliasRelation, workError), + makeEntityLoader('Work', aliasesRelation, workError), async (req, res, next) => { const workAliasesList = await getEntityAliases(res.locals.entity); return res.status(200).send(workAliasesList); }); -const workIdentifierRelation = ['identifierSet.identifiers.type']; router.get('/:bbid/identifiers', - makeEntityLoader('Work', workIdentifierRelation, workError), + makeEntityLoader('Work', identifiersRelation, workError), async (req, res, next) => { const workIdentifiersList = await getEntityIdentifiers(res.locals.entity); return res.status(200).send(workIdentifiersList); From 864b3f61e2b38415ae86939cbabf14c9864a41f7 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Mon, 17 Jun 2019 15:09:38 +0530 Subject: [PATCH 77/78] feat: add tests for envalid endpoints and allow only get requests --- src/api/app.js | 6 ++- src/api/helpers/utils.js | 9 ++++ test/src/api/common-tests.js | 86 ++++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 test/src/api/common-tests.js diff --git a/src/api/app.js b/src/api/app.js index 97055a3e2..f69420f3d 100644 --- a/src/api/app.js +++ b/src/api/app.js @@ -20,12 +20,11 @@ /* eslint global-require: 'warn' */ -import * as error from '../common/helpers/error'; - import BookBrainzData from 'bookbrainz-data'; import Debug from 'debug'; import Promise from 'bluebird'; import {get as _get} from 'lodash'; +import {allowOnlyGetMethod} from './helpers/utils'; import appCleanup from '../common/helpers/appCleanup'; import bodyParser from 'body-parser'; import compression from 'compression'; @@ -80,6 +79,9 @@ app.use(session({ // Set up routes routes(app); +// Allow only get requests for now throw error for any other type of requests +app.all('/*', allowOnlyGetMethod); + // Catch 404 and forward to error handler app.use((req, res, next) => { res.status(404).send({message: `Incorrect endpoint ${req.path}`}); diff --git a/src/api/helpers/utils.js b/src/api/helpers/utils.js index 25706935f..4674db645 100644 --- a/src/api/helpers/utils.js +++ b/src/api/helpers/utils.js @@ -18,3 +18,12 @@ export const aliasesRelation = ['aliasSet.aliases.language']; export const identifiersRelation = ['identifierSet.identifiers.type']; + +export function allowOnlyGetMethod(req, res, next) { + if (req.method === 'GET') { + return next(); + } + return res.set('Allow', 'GET') + .status(405) + .send({message: `${req.method} method for the "${req.path}" route is not supported. Only GET method is allowed`}); +} diff --git a/test/src/api/common-tests.js b/test/src/api/common-tests.js new file mode 100644 index 000000000..68b886726 --- /dev/null +++ b/test/src/api/common-tests.js @@ -0,0 +1,86 @@ +/* eslint-disable prefer-arrow-callback,func-names */ +/* + * Copyright (C) 2019 Akhilesh Kumar + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import app from '../../../src/api/app'; +import chai from 'chai'; +import chaiHttp from 'chai-http'; +import {getRandomUUID} from '../../test-helpers/create-entities'; + + +chai.use(chaiHttp); +const {expect} = chai; + + +const aBBID = getRandomUUID(); +const bBBID = getRandomUUID(); +const inValidBBID = 'akjd-adjjk-23123'; + +describe('Common test of API', () => { + // Test API for envalid requests + it('should throw a 405 error if send post request', function (done) { + chai.request(app) + .post(`/work/${bBBID}`) + .end(function (err, res) { + if (err) { return done(err); } + expect(res).to.have.status(405); + expect(res.ok).to.be.false; + expect(res.body).to.be.an('object'); + expect(res.body).to.have.all.keys('message'); + return done(); + }); + }); + it('should throw a 405 error if send put request', function (done) { + chai.request(app) + .put(`/work/${bBBID}`) + .end(function (err, res) { + if (err) { return done(err); } + expect(res).to.have.status(405); + expect(res.ok).to.be.false; + expect(res.body).to.be.an('object'); + expect(res.body).to.have.all.keys('message'); + return done(); + }); + }); + it('should throw a 405 error if send delete request', function (done) { + chai.request(app) + .delete(`/work/${bBBID}`) + .end(function (err, res) { + if (err) { return done(err); } + expect(res).to.have.status(405); + expect(res.ok).to.be.false; + expect(res.body).to.be.an('object'); + expect(res.body).to.have.all.keys('message'); + return done(); + }); + }); + + it('should throw a 404 error if endpoint is not valid', function (done) { + chai.request(app) + .get(`/work/${bBBID}/not-valid`) + .end(function (err, res) { + if (err) { return done(err); } + expect(res).to.have.status(404); + expect(res.ok).to.be.false; + expect(res.body).to.be.an('object'); + expect(res.body).to.have.all.keys('message'); + return done(); + }); + }); +}); + From 590c4bf7ac2583eddcbed69886907f069d54b7d9 Mon Sep 17 00:00:00 2001 From: Akhilesh Kumar Date: Mon, 17 Jun 2019 15:52:23 +0530 Subject: [PATCH 78/78] fix: resolve conflicts with master --- package-lock.json | 56 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 86c2b366d..9ce3066f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -976,12 +976,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -996,17 +998,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -1123,7 +1128,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -1135,6 +1141,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -1149,6 +1156,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -1156,12 +1164,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -1180,6 +1190,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -1260,7 +1271,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -1272,6 +1284,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -1393,6 +1406,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5735,11 +5749,13 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true + "bundled": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5752,15 +5768,18 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "concat-map": { "version": "0.0.1", - "bundled": true + "bundled": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "bundled": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -5863,7 +5882,8 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "bundled": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -5873,6 +5893,7 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5885,17 +5906,20 @@ "minimatch": { "version": "3.0.4", "bundled": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true + "bundled": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -5912,6 +5936,7 @@ "mkdirp": { "version": "0.5.1", "bundled": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -5984,7 +6009,8 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "bundled": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -5994,6 +6020,7 @@ "once": { "version": "1.4.0", "bundled": true, + "optional": true, "requires": { "wrappy": "1" } @@ -6099,6 +6126,7 @@ "string-width": { "version": "1.0.2", "bundled": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0",