Yuki Takei 8 лет назад
Родитель
Сommit
7500155d69

+ 20 - 2
app.js

@@ -5,7 +5,25 @@
  * @author  Yuki Takei <yuki@weseek.co.jp>
  * @author  Yuki Takei <yuki@weseek.co.jp>
  */
  */
 
 
-var growi = new (require('./lib/crowi'))(__dirname, process.env);
+require('module-alias/register');
+
+const logger = require('@alias/logger')('growi');
+const growi = new (require('./lib/crowi'))(__dirname, process.env);
+
+
+/************************************
+ *          Main Process
+ ***********************************/
+process.on('uncaughtException', (err) => {
+  logger.error('Uncaught Exception: ', err);
+});
+
+process.on('unhandledRejection', (reason, p) => {
+  logger.error('Unhandled Rejection: Promise:', p, 'Reason:', reason);
+});
 
 
 growi.start()
 growi.start()
-  .catch(growi.exitOnerror);
+  .catch(err => {
+    logger.error('An error occurred, unable to start the server');
+    logger.error(err);
+  });

+ 1 - 1
bin/search.js

@@ -116,7 +116,7 @@ crowi.init()
 
 
     program.parse(process.argv);
     program.parse(process.argv);
 
 
-  }).catch(crowi.exitOnError);
+  });
 
 
 
 
 //program
 //program

+ 1 - 1
bin/util.js

@@ -41,4 +41,4 @@ crowi.init()
       });
       });
 
 
     program.parse(process.argv);
     program.parse(process.argv);
-  }).catch(crowi.exitOnError);
+  });

+ 5 - 13
config/env.dev.js

@@ -7,19 +7,11 @@ module.exports = {
     // 'growi-plugin-lsx',
     // 'growi-plugin-lsx',
     // 'growi-plugin-pukiwiki-like-linker',
     // 'growi-plugin-pukiwiki-like-linker',
   ],
   ],
-  // filters for debug
+  // settings for 'visionmedia/debug'
+  // see also './logger/config.prod.js'
   DEBUG: [
   DEBUG: [
     // 'express:*',
     // 'express:*',
-    // 'crowi:*',
-    'crowi:crowi',
-    // 'crowi:crowi:dev',
-    'crowi:crowi:express-init',
-    'crowi:models:external-account',
-    // 'crowi:routes:login',
-    'crowi:routes:login-passport',
-    'crowi:service:PassportService',
-    // 'crowi:routes:page',
-    // 'crowi:plugins:*',
-    // 'crowi:InterceptorManager',
+    'crowi:*',
+    'growi:*',
   ].join(),
   ].join(),
-}
+};

+ 6 - 2
config/env.prod.js

@@ -1,6 +1,10 @@
 module.exports = {
 module.exports = {
   NODE_ENV: 'production',
   NODE_ENV: 'production',
+  // settings for 'visionmedia/debug'
+  // see also './logger/config.prod.js'
   DEBUG: [
   DEBUG: [
-    'crowi:crowi',
+    // 'express:*',
+    'crowi:*',
+    'growi:*',
   ].join(),
   ].join(),
-}
+};

+ 13 - 0
config/index.js

@@ -0,0 +1,13 @@
+function envShortName() {
+  switch (process.env.NODE_ENV) {
+    case 'production':
+      return 'prod';
+    default:
+      return 'dev';
+  }
+}
+
+module.exports = {
+  env: require(`./env.${envShortName()}`),
+  logger: require(`./logger/config.${envShortName()}`),
+};

+ 18 - 0
config/logger/config.dev.js

@@ -0,0 +1,18 @@
+module.exports = {
+  default: 'info',
+
+  //// configure level for name
+  // 'crowi:*': 'debug',
+  // 'express:*': 'debug',
+  // 'crowi:*': 'debug',
+  'crowi:crowi': 'debug',
+  // 'crowi:crowi:dev': 'debug',
+  'crowi:crowi:express-init': 'debug',
+  'crowi:models:external-account': 'debug',
+  // 'crowi:routes:login': 'debug',
+  'crowi:routes:login-passport': 'debug',
+  'crowi:service:PassportService': 'debug',
+  // 'crowi:routes:page': 'debug',
+  // 'crowi:plugins:*': 'debug',
+  // 'crowi:InterceptorManager': 'debug',
+};

+ 3 - 0
config/logger/config.prod.js

@@ -0,0 +1,3 @@
+module.exports = {
+  default: 'info',
+};

+ 9 - 28
lib/crowi/index.js

@@ -1,7 +1,7 @@
 'use strict';
 'use strict';
 
 
 
 
-var debug = require('debug')('crowi:crowi')
+var debug = require('@alias/debug')('crowi:crowi')
   , pkg = require('../../package.json')
   , pkg = require('../../package.json')
   , path = require('path')
   , path = require('path')
   , sep = path.sep
   , sep = path.sep
@@ -412,26 +412,17 @@ Crowi.prototype.buildServer = function() {
     }
     }
   }
   }
 
 
-  if (env == 'development') {
-    //swig.setDefaults({ cache: false });   // moved to dev.js -- 2017.07.09 Yuki Takei
+  // use bunyan
+  if (env == 'production') {
+    const expressBunyanLogger = require('express-bunyan-logger');
+    const logger = require('@alias/logger')('express');
+    app.use(expressBunyanLogger({ logger }));
+  }
+  // use morgan
+  else {
     const morgan = require('morgan');
     const morgan = require('morgan');
     app.use(morgan('dev'));
     app.use(morgan('dev'));
-  }
 
 
-  if (env == 'production') {
-    /*
-     * commented out morgan because of using pino  -- 2017.06.27 Yuki Takei
-     *
-    var oneYear = 31557600000;
-    app.use(morgan('combined'));
-    app.use(function (err, req, res, next) {
-      res.status(500);
-      res.render('500', { error: err });
-    });
-     */
-    const pino = require('pino')({extreme: true}, process.stdout);
-    const expressPino = require('express-pino-logger')({pino});
-    app.use(expressPino);
   }
   }
 
 
   return Promise.resolve(app);
   return Promise.resolve(app);
@@ -457,14 +448,4 @@ Crowi.prototype.require = function(modulePath) {
   return require(modulePath);
   return require(modulePath);
 };
 };
 
 
-Crowi.prototype.exitOnError = function(err) {
-  debug('Critical error occured.');
-  /* eslint-disable no-console */
-  console.error(err);
-  console.error(err.stack);
-  /* eslint-enable */
-  process.exit(1);
-};
-
-
 module.exports = Crowi;
 module.exports = Crowi;

+ 11 - 0
lib/service/logger/alias-for-debug.js

@@ -0,0 +1,11 @@
+/**
+ * return 'debug' method of bunyan logger
+ *
+ * This is supposed to be used as an replacement of "require('debug')"
+ *
+ * @param {string} name
+ */
+module.exports = (name) => {
+  const bunyanLogger = require('./index')(name);
+  return bunyanLogger.debug.bind(bunyanLogger);
+};

+ 43 - 0
lib/service/logger/index.js

@@ -0,0 +1,43 @@
+const bunyan = require('bunyan');
+const minimatch = require('minimatch');
+
+const isProd = process.env.NODE_ENV === 'production';
+
+const config = require('../../../config').logger;
+
+let stream = isProd ? require('./stream.prod') : require('./stream.dev');
+
+// logger store
+let loggers = {};
+
+/**
+ * determine logger level
+ * @param {string} name Logger name
+ */
+function determineLoggerLevel(name) {
+  let level = config.default;
+
+  // retrieve configured level
+  Object.keys(config).some(key => { // breakable forEach
+    // test whether 'name' matches to 'key'(blob)
+    if (minimatch(name, key)) {
+      level = config[key];
+      return;                       // break if match
+    }
+  });
+
+  return level;
+}
+
+module.exports = (name) => {
+  // create logger instance if absent
+  if (loggers[name] == null) {
+    loggers[name] = bunyan.createLogger({
+      name,
+      stream,
+      level: determineLoggerLevel(name),
+    });
+  }
+
+  return loggers[name];
+};

+ 6 - 0
lib/service/logger/stream.dev.js

@@ -0,0 +1,6 @@
+let stream = undefined;
+
+const bunyanFormat = require('bunyan-format');
+stream = bunyanFormat({ outputMode: 'short' });
+
+module.exports = stream;

+ 6 - 0
lib/service/logger/stream.prod.js

@@ -0,0 +1,6 @@
+let stream = undefined;
+
+// do nothing
+// output JSON to stdout
+
+module.exports = stream;

+ 11 - 4
package.json

@@ -39,7 +39,7 @@
     "postserver:prod:container": "echo ---------------------------------------- && echo [WARNING] && echo   'server:prod:container' is deprecated. && echo   Please use 'sever:prod' && echo ----------------------------------------",
     "postserver:prod:container": "echo ---------------------------------------- && echo [WARNING] && echo   'server:prod:container' is deprecated. && echo   Please use 'sever:prod' && echo ----------------------------------------",
     "server:dev": "env-cmd config/env.dev.js node-dev --respawn app.js",
     "server:dev": "env-cmd config/env.dev.js node-dev --respawn app.js",
     "server:prod:container": "npm run server:prod",
     "server:prod:container": "npm run server:prod",
-    "server:prod": "env-cmd config/env.prod.js node app.js --production | pino-clf common",
+    "server:prod": "env-cmd config/env.prod.js node app.js",
     "server": "npm run server:dev",
     "server": "npm run server:dev",
     "start": "npm run server:prod",
     "start": "npm run server:prod",
     "test": "mocha --timeout 10000 -r test/bootstrap.js test/**/*.js",
     "test": "mocha --timeout 10000 -r test/bootstrap.js test/**/*.js",
@@ -61,6 +61,9 @@
     "body-parser": "^1.18.2",
     "body-parser": "^1.18.2",
     "bootstrap-sass": "~3.3.6",
     "bootstrap-sass": "~3.3.6",
     "bootstrap-select": "^1.12.4",
     "bootstrap-select": "^1.12.4",
+    "bunyan": "^1.8.12",
+    "bunyan-debug": "^2.0.0",
+    "bunyan-format": "^0.2.1",
     "check-node-version": "^3.1.1",
     "check-node-version": "^3.1.1",
     "codemirror": "^5.37.0",
     "codemirror": "^5.37.0",
     "connect-flash": "~0.1.1",
     "connect-flash": "~0.1.1",
@@ -81,8 +84,8 @@
     "env-cmd": "^8.0.1",
     "env-cmd": "^8.0.1",
     "escape-string-regexp": "^1.0.5",
     "escape-string-regexp": "^1.0.5",
     "express": "^4.16.1",
     "express": "^4.16.1",
+    "express-bunyan-logger": "^1.3.3",
     "express-form": "~0.12.0",
     "express-form": "~0.12.0",
-    "express-pino-logger": "^3.0.1",
     "express-sanitizer": "^1.0.4",
     "express-sanitizer": "^1.0.4",
     "express-session": "~1.15.0",
     "express-session": "~1.15.0",
     "express-webpack-assets": "^0.1.0",
     "express-webpack-assets": "^0.1.0",
@@ -112,6 +115,7 @@
     "method-override": "^2.3.10",
     "method-override": "^2.3.10",
     "metismenu": "^2.7.4",
     "metismenu": "^2.7.4",
     "mkdirp": "~0.5.1",
     "mkdirp": "~0.5.1",
+    "module-alias": "^2.0.6",
     "mongoose": "^5.0.0",
     "mongoose": "^5.0.0",
     "mongoose-paginate": "^5.0.0",
     "mongoose-paginate": "^5.0.0",
     "mongoose-unique-validator": "^2.0.0",
     "mongoose-unique-validator": "^2.0.0",
@@ -125,7 +129,6 @@
     "passport": "^0.4.0",
     "passport": "^0.4.0",
     "passport-ldapauth": "^2.0.0",
     "passport-ldapauth": "^2.0.0",
     "passport-local": "^1.0.0",
     "passport-local": "^1.0.0",
-    "pino-clf": "^1.0.2",
     "plantuml-encoder": "^1.2.5",
     "plantuml-encoder": "^1.2.5",
     "postcss-loader": "^2.1.3",
     "postcss-loader": "^2.1.3",
     "react": "^16.2.0",
     "react": "^16.2.0",
@@ -164,13 +167,17 @@
     "eslint": "^4.19.1",
     "eslint": "^4.19.1",
     "eslint-plugin-react": "^7.7.0",
     "eslint-plugin-react": "^7.7.0",
     "mocha": "^5.0.0",
     "mocha": "^5.0.0",
-    "morgan": "^1.8.2",
+    "morgan": "^1.9.0",
     "node-dev": "^3.1.3",
     "node-dev": "^3.1.3",
     "on-headers": "^1.0.1",
     "on-headers": "^1.0.1",
     "sinon": "^5.0.2",
     "sinon": "^5.0.2",
     "sinon-chai": "^3.0.0",
     "sinon-chai": "^3.0.0",
     "webpack-dll-bundles-plugin": "^1.0.0-beta.5"
     "webpack-dll-bundles-plugin": "^1.0.0-beta.5"
   },
   },
+  "_moduleAliases": {
+    "@alias/logger": "lib/service/logger",
+    "@alias/debug": "lib/service/logger/alias-for-debug"
+  },
   "engines": {
   "engines": {
     "node": ">=6.11 <9",
     "node": ">=6.11 <9",
     "npm": ">=4",
     "npm": ">=4",

+ 73 - 121
yarn.lock

@@ -201,6 +201,10 @@ ansicolors@~0.2.1:
   version "0.2.1"
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef"
   resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef"
 
 
+ansistyles@~0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539"
+
 anymatch@^1.3.0:
 anymatch@^1.3.0:
   version "1.3.2"
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
   resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
@@ -1045,10 +1049,6 @@ basic-auth-connect@~1.0.0:
   version "1.0.0"
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz#fdb0b43962ca7b40456a7c2bb48fe173da2d2122"
   resolved "https://registry.yarnpkg.com/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz#fdb0b43962ca7b40456a7c2bb48fe173da2d2122"
 
 
-basic-auth@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884"
-
 basic-auth@~2.0.0:
 basic-auth@~2.0.0:
   version "2.0.0"
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.0.tgz#015db3f353e02e56377755f962742e8981e7bbba"
   resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.0.tgz#015db3f353e02e56377755f962742e8981e7bbba"
@@ -1323,7 +1323,22 @@ builtin-status-codes@^3.0.0:
   version "3.0.0"
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
   resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
 
 
-bunyan@^1.8.3:
+bunyan-debug@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/bunyan-debug/-/bunyan-debug-2.0.0.tgz#15ba1bdb5d3158781cdd4b9aee70eb80d4c2c81a"
+  dependencies:
+    chalk "^1.1.3"
+    event-stream "^3.3.2"
+
+bunyan-format@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/bunyan-format/-/bunyan-format-0.2.1.tgz#a4b3b0d80070a865279417269e3f00ff02fbcb47"
+  dependencies:
+    ansicolors "~0.2.1"
+    ansistyles "~0.1.1"
+    xtend "~2.1.1"
+
+bunyan@^1.8.12, bunyan@^1.8.3:
   version "1.8.12"
   version "1.8.12"
   resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.12.tgz#f150f0f6748abdd72aeae84f04403be2ef113797"
   resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.12.tgz#f150f0f6748abdd72aeae84f04403be2ef113797"
   optionalDependencies:
   optionalDependencies:
@@ -1524,10 +1539,6 @@ classnames@^2.2.0, classnames@^2.2.5:
   version "2.2.5"
   version "2.2.5"
   resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d"
   resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d"
 
 
-clf-date@0.0.4:
-  version "0.0.4"
-  resolved "https://registry.yarnpkg.com/clf-date/-/clf-date-0.0.4.tgz#34eec7757095c7b03bd59aa1c3d5120d5f27f39f"
-
 cli-cursor@^2.1.0:
 cli-cursor@^2.1.0:
   version "2.1.0"
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
   resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
@@ -2331,12 +2342,6 @@ encoding@^0.1.11:
   dependencies:
   dependencies:
     iconv-lite "~0.4.13"
     iconv-lite "~0.4.13"
 
 
-end-of-stream@^1.1.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206"
-  dependencies:
-    once "^1.4.0"
-
 engine.io-client@~3.1.0:
 engine.io-client@~3.1.0:
   version "3.1.4"
   version "3.1.4"
   resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.1.4.tgz#4fcf1370b47163bd2ce9be2733972430350d4ea1"
   resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.1.4.tgz#4fcf1370b47163bd2ce9be2733972430350d4ea1"
@@ -2626,7 +2631,7 @@ event-emitter@~0.3.5:
     d "1"
     d "1"
     es5-ext "~0.10.14"
     es5-ext "~0.10.14"
 
 
-event-stream@~3.3.0:
+event-stream@^3.3.2, event-stream@~3.3.0:
   version "3.3.4"
   version "3.3.4"
   resolved "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571"
   resolved "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571"
   dependencies:
   dependencies:
@@ -2681,6 +2686,16 @@ expand-range@^1.8.1:
   dependencies:
   dependencies:
     fill-range "^2.1.0"
     fill-range "^2.1.0"
 
 
+express-bunyan-logger@^1.3.3:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/express-bunyan-logger/-/express-bunyan-logger-1.3.3.tgz#e76d9b3d598ca83a69b692a9839c7453d01b5010"
+  dependencies:
+    bunyan "^1.8.12"
+    lodash.has "^4.5.2"
+    lodash.set "^4.3.2"
+    useragent "^2.2.1"
+    uuid "^3.1.0"
+
 express-form@~0.12.0:
 express-form@~0.12.0:
   version "0.12.6"
   version "0.12.6"
   resolved "https://registry.yarnpkg.com/express-form/-/express-form-0.12.6.tgz#0fb1049abecba747dbfd2e8e1b1a5a20395715ac"
   resolved "https://registry.yarnpkg.com/express-form/-/express-form-0.12.6.tgz#0fb1049abecba747dbfd2e8e1b1a5a20395715ac"
@@ -2689,12 +2704,6 @@ express-form@~0.12.0:
     object-additions "^0.5.1"
     object-additions "^0.5.1"
     validator "^2.1.0"
     validator "^2.1.0"
 
 
-express-pino-logger@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/express-pino-logger/-/express-pino-logger-3.0.1.tgz#31befe82ed4f1d685d90eeb035923c0c79fe95cc"
-  dependencies:
-    pino-http "^3.0.1"
-
 express-sanitizer@^1.0.4:
 express-sanitizer@^1.0.4:
   version "1.0.4"
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/express-sanitizer/-/express-sanitizer-1.0.4.tgz#5331a12de6577582901a6581e91e38a8b99a6ee2"
   resolved "https://registry.yarnpkg.com/express-sanitizer/-/express-sanitizer-1.0.4.tgz#5331a12de6577582901a6581e91e38a8b99a6ee2"
@@ -2798,10 +2807,6 @@ fast-deep-equal@^1.0.0:
   version "1.0.0"
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
   resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff"
 
 
-fast-json-parse@^1.0.2, fast-json-parse@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/fast-json-parse/-/fast-json-parse-1.0.3.tgz#43e5c61ee4efa9265633046b770fb682a7577c4d"
-
 fast-json-stable-stringify@^2.0.0:
 fast-json-stable-stringify@^2.0.0:
   version "2.0.0"
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
   resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
@@ -2810,10 +2815,6 @@ fast-levenshtein@~2.0.4:
   version "2.0.6"
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
   resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
 
 
-fast-safe-stringify@^1.0.8, fast-safe-stringify@^1.2.1:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-1.2.2.tgz#eab31cd4dd0dbaa09f64ac6b77e7e7eb9b4a142b"
-
 fastparse@^1.1.1:
 fastparse@^1.1.1:
   version "1.1.1"
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8"
   resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8"
@@ -2930,10 +2931,6 @@ flat-cache@^1.2.1:
     graceful-fs "^4.1.2"
     graceful-fs "^4.1.2"
     write "^0.2.1"
     write "^0.2.1"
 
 
-flatstr@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.5.tgz#5b451b08cbd48e2eac54a2bbe0bf46165aa14be3"
-
 flatten@^1.0.2:
 flatten@^1.0.2:
   version "1.0.2"
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
   resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
@@ -3888,7 +3885,7 @@ json-stable-stringify@^1.0.1:
   dependencies:
   dependencies:
     jsonify "~0.0.0"
     jsonify "~0.0.0"
 
 
-json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1:
+json-stringify-safe@~5.0.1:
   version "5.0.1"
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
   resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
 
 
@@ -4196,6 +4193,10 @@ lodash.get@4.4.2, lodash.get@^4.0.2, lodash.get@^4.4.2:
   version "4.4.2"
   version "4.4.2"
   resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
   resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
 
 
+lodash.has@^4.5.2:
+  version "4.5.2"
+  resolved "https://registry.yarnpkg.com/lodash.has/-/lodash.has-4.5.2.tgz#d19f4dc1095058cccbe2b0cdf4ee0fe4aa37c862"
+
 lodash.isarguments@^3.0.0:
 lodash.isarguments@^3.0.0:
   version "3.1.0"
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
   resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
@@ -4271,6 +4272,10 @@ lodash.restparam@^3.0.0:
   version "3.6.1"
   version "3.6.1"
   resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
   resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
 
 
+lodash.set@^4.3.2:
+  version "4.3.2"
+  resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23"
+
 lodash.tail@^4.1.1:
 lodash.tail@^4.1.1:
   version "4.1.1"
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
   resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
@@ -4335,6 +4340,13 @@ loud-rejection@^1.0.0:
     currently-unhandled "^0.4.1"
     currently-unhandled "^0.4.1"
     signal-exit "^3.0.0"
     signal-exit "^3.0.0"
 
 
+lru-cache@4.1.x:
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
+  dependencies:
+    pseudomap "^1.0.2"
+    yallist "^2.1.2"
+
 lru-cache@^4.0.1, lru-cache@^4.0.2, lru-cache@^4.1.1:
 lru-cache@^4.0.1, lru-cache@^4.0.2, lru-cache@^4.1.1:
   version "4.1.1"
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55"
   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55"
@@ -4630,6 +4642,10 @@ mocha@^5.0.0:
     mkdirp "0.5.1"
     mkdirp "0.5.1"
     supports-color "4.4.0"
     supports-color "4.4.0"
 
 
+module-alias@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/module-alias/-/module-alias-2.0.6.tgz#abb2cfa07014f503514ad5061c6f03d79b591889"
+
 moment@^2.10.6:
 moment@^2.10.6:
   version "2.20.1"
   version "2.20.1"
   resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd"
   resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd"
@@ -4695,7 +4711,7 @@ mongoose@^5.0.0:
     regexp-clone "0.0.1"
     regexp-clone "0.0.1"
     sliced "1.0.1"
     sliced "1.0.1"
 
 
-morgan@^1.8.2:
+morgan@^1.9.0:
   version "1.9.0"
   version "1.9.0"
   resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.0.tgz#d01fa6c65859b76fcf31b3cb53a3821a311d8051"
   resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.0.tgz#d01fa6c65859b76fcf31b3cb53a3821a311d8051"
   dependencies:
   dependencies:
@@ -4771,15 +4787,6 @@ ncp@~2.0.0:
   version "2.0.0"
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3"
   resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3"
 
 
-ndjson@^1.4.3:
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/ndjson/-/ndjson-1.5.0.tgz#ae603b36b134bcec347b452422b0bf98d5832ec8"
-  dependencies:
-    json-stringify-safe "^5.0.1"
-    minimist "^1.2.0"
-    split2 "^2.1.0"
-    through2 "^2.0.3"
-
 negotiator@0.6.1:
 negotiator@0.6.1:
   version "0.6.1"
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
   resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
@@ -5062,6 +5069,10 @@ object-keys@~0.2.0:
     indexof "~0.0.1"
     indexof "~0.0.1"
     is "~0.2.6"
     is "~0.2.6"
 
 
+object-keys@~0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
+
 object-path@^0.9.0:
 object-path@^0.9.0:
   version "0.9.2"
   version "0.9.2"
   resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5"
   resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5"
@@ -5092,7 +5103,7 @@ on-headers@^1.0.1, on-headers@~1.0.1:
   version "1.0.1"
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
   resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
 
 
-once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0:
+once@^1.3.0, once@^1.3.3, once@^1.4.0:
   version "1.4.0"
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
   resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
   dependencies:
   dependencies:
@@ -5399,45 +5410,6 @@ pinkie@^2.0.0:
   version "2.0.4"
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
   resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
 
 
-pino-clf@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/pino-clf/-/pino-clf-1.0.2.tgz#3e8ffea2f4bd07f794570c2daa1e012c17cff6bb"
-  dependencies:
-    fast-json-parse "^1.0.2"
-    minimist "^1.2.0"
-    pino-toke "^1.0.0"
-    pump "^1.0.2"
-    through2 "^2.0.3"
-
-pino-http@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/pino-http/-/pino-http-3.0.1.tgz#015376250968b22f709e1260dcb516b691e27c6d"
-  dependencies:
-    pino "^4.10.2"
-
-pino-toke@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/pino-toke/-/pino-toke-1.0.0.tgz#9c072e17c30dcf564cd560ac392b22a929bf2297"
-  dependencies:
-    basic-auth "^1.1.0"
-    clf-date "0.0.4"
-    minimist "^1.2.0"
-    ndjson "^1.4.3"
-    pump "^1.0.2"
-    through2 "^2.0.1"
-
-pino@^4.10.2:
-  version "4.10.3"
-  resolved "https://registry.yarnpkg.com/pino/-/pino-4.10.3.tgz#d46030524f2294fe43a2e2247ce1a7ef028c46bc"
-  dependencies:
-    chalk "^2.3.0"
-    fast-json-parse "^1.0.3"
-    fast-safe-stringify "^1.2.1"
-    flatstr "^1.0.5"
-    pump "^2.0.0"
-    quick-format-unescaped "^1.1.1"
-    split2 "^2.2.0"
-
 pkg-dir@^2.0.0:
 pkg-dir@^2.0.0:
   version "2.0.0"
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
   resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
@@ -5843,20 +5815,6 @@ public-encrypt@^4.0.0:
     parse-asn1 "^5.0.0"
     parse-asn1 "^5.0.0"
     randombytes "^2.0.1"
     randombytes "^2.0.1"
 
 
-pump@^1.0.2:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954"
-  dependencies:
-    end-of-stream "^1.1.0"
-    once "^1.3.1"
-
-pump@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.0.tgz#7946da1c8d622b098e2ceb2d3476582470829c9d"
-  dependencies:
-    end-of-stream "^1.1.0"
-    once "^1.3.1"
-
 punycode@1.3.2:
 punycode@1.3.2:
   version "1.3.2"
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
@@ -5900,12 +5858,6 @@ querystring@0.2.0:
   version "0.2.0"
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
   resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
 
 
-quick-format-unescaped@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-1.1.1.tgz#e77555ef3e66e105d4039e13ef79201284fee916"
-  dependencies:
-    fast-safe-stringify "^1.0.8"
-
 random-bytes@~1.0.0:
 random-bytes@~1.0.0:
   version "1.0.0"
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b"
   resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b"
@@ -6118,7 +6070,7 @@ readable-stream@2.2.7:
     string_decoder "~1.0.0"
     string_decoder "~1.0.0"
     util-deprecate "~1.0.1"
     util-deprecate "~1.0.1"
 
 
-readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6, readable-stream@^2.3.3:
+readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.2.6, readable-stream@^2.3.3:
   version "2.3.3"
   version "2.3.3"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
   dependencies:
   dependencies:
@@ -6858,12 +6810,6 @@ spdx-license-ids@^1.0.2:
   version "1.2.2"
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
   resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
 
 
-split2@^2.1.0, split2@^2.2.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493"
-  dependencies:
-    through2 "^2.0.2"
-
 split@0.3:
 split@0.3:
   version "0.3.3"
   version "0.3.3"
   resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f"
   resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f"
@@ -7136,13 +7082,6 @@ throttle-debounce@^1.0.1:
   version "1.0.1"
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-1.0.1.tgz#dad0fe130f9daf3719fdea33dc36a8e6ba7f30b5"
   resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-1.0.1.tgz#dad0fe130f9daf3719fdea33dc36a8e6ba7f30b5"
 
 
-through2@^2.0.1, through2@^2.0.2, through2@^2.0.3:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
-  dependencies:
-    readable-stream "^2.1.5"
-    xtend "~4.0.1"
-
 through@2, through@^2.3.6, through@~2.3, through@~2.3.1:
 through@2, through@^2.3.6, through@~2.3, through@~2.3.1:
   version "2.3.8"
   version "2.3.8"
   resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
   resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
@@ -7157,7 +7096,7 @@ tiny-emitter@^2.0.0:
   version "2.0.2"
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c"
   resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c"
 
 
-tmp@^0.0.33:
+tmp@0.0.x, tmp@^0.0.33:
   version "0.0.33"
   version "0.0.33"
   resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
   resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
   dependencies:
   dependencies:
@@ -7376,6 +7315,13 @@ url@^0.11.0:
     punycode "1.3.2"
     punycode "1.3.2"
     querystring "0.2.0"
     querystring "0.2.0"
 
 
+useragent@^2.2.1:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz#217f943ad540cb2128658ab23fc960f6a88c9972"
+  dependencies:
+    lru-cache "4.1.x"
+    tmp "0.0.x"
+
 uslug@^1.0.4:
 uslug@^1.0.4:
   version "1.0.4"
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/uslug/-/uslug-1.0.4.tgz#b9a22f0914e0a86140633dacc302e5f4fa450677"
   resolved "https://registry.yarnpkg.com/uslug/-/uslug-1.0.4.tgz#b9a22f0914e0a86140633dacc302e5f4fa450677"
@@ -7662,7 +7608,7 @@ xss@^0.3.5:
     commander "^2.9.0"
     commander "^2.9.0"
     cssfilter "0.0.10"
     cssfilter "0.0.10"
 
 
-xtend@^4.0.0, xtend@~4.0.1:
+xtend@^4.0.0:
   version "4.0.1"
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
   resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
 
 
@@ -7673,6 +7619,12 @@ xtend@~2.0.6:
     is-object "~0.1.2"
     is-object "~0.1.2"
     object-keys "~0.2.0"
     object-keys "~0.2.0"
 
 
+xtend@~2.1.1:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b"
+  dependencies:
+    object-keys "~0.4.0"
+
 y18n@^3.2.0, y18n@^3.2.1:
 y18n@^3.2.0, y18n@^3.2.1:
   version "3.2.1"
   version "3.2.1"
   resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
   resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"