Просмотр исходного кода

Merge pull request #110 from weseek/master

release v1.2.9
Yuki Takei 8 лет назад
Родитель
Сommit
7116f1c58f
9 измененных файлов с 243 добавлено и 132 удалено
  1. 9 1
      CHANGES.md
  2. 1 1
      Procfile
  3. 36 30
      README.md
  4. 8 1
      config/env.dev.js
  5. 8 3
      lib/crowi/index.js
  6. 66 63
      lib/views/me/index.html
  7. 6 7
      package.json
  8. 1 1
      resource/js/legacy/crowi-form.js
  9. 108 25
      yarn.lock

+ 9 - 1
CHANGES.md

@@ -1,10 +1,18 @@
 CHANGES
 ========
 
-## 1.2.7
+## 1.2.9
+
+* Improvement: Enabled to save with <kbd>⌘+S</kbd> on Mac
+* Improvement: Adopt the fastest logger 'pino'
+* Fix: The problem that can't upload profile image
+
+## 1.2.8
 
 * Fix: The problem that redirect doesn't work when using 'crowi-plus Simplified Behavior'
 
+## 1.2.7 (Missing number)
+
 ## 1.2.6
 
 * Fix: The problem that page_list widget doesn't show the picture of revision.author

+ 1 - 1
Procfile

@@ -1 +1 @@
-web: npm run server:prod:container
+web: npm run server:prod

+ 36 - 30
README.md

@@ -20,6 +20,7 @@ This is **crowi-plus** that is the fork of [Crowi][crowi], is [perfectly compati
   * Find plugins from [npm](https://www.npmjs.com/browse/keyword/crowi-plugin) or [github](https://github.com/search?q=topic%3Acrowi-plugin)!
 * Faster
   * Optimize client-side code chunks by Webpack
+  * Adopt the fastest logger [pino](https://github.com/pinojs/pino)
   * Using CDN
 * Secure
   * Upgrade jQuery to 3.x
@@ -53,7 +54,7 @@ cd crowi-plus
 docker-compose up
 ```
 
-see also [weseek/crowi-plus-docker-compose][docker-compose]
+See also [weseek/crowi-plus-docker-compose][docker-compose]
 
 On-premise
 ----------
@@ -81,7 +82,9 @@ yarn
 MONGO_URI=mongodb://MONGO_HOST:MONGO_PORT/crowi npm start
 ```
 
-If you use Redis and ElasticSearch, add environment variables before `npm start` like following:
+`npm start` lauches the server after building the client.  
+
+If you launch crowi-plus with Redis and ElasticSearch, add environment variables before `npm start` like following:
 
 ```
 export MONGO_URI=mongodb://MONGO_HOST:MONGO_PORT/crowi
@@ -90,6 +93,23 @@ export ELASTICSEARCH_URI=http://ELASTICSEARCH_HOST:ELASTICSEARCH_PORT/crowi
 npm start
 ```
 
+For more info, check [the official documents](https://github.com/crowi/crowi/wiki/Install-and-Configuration#env-parameters).
+
+#### Other commands
+
+|command|desc|
+|--|--|
+|`npm run build:prod`|Build the client|
+|`npm run server:prod`|Launch the server|
+
+### Upgrade
+
+```bash
+git pull
+yarn
+npm start
+```
+
 ### Install plugins
 
 * Stop server if running
@@ -104,9 +124,6 @@ yarn add crowi-plugin-lsx
 npm start
 ```
 
-## Other documents
-
-More info are [here](https://github.com/crowi/crowi/wiki/Install-and-Configuration#env-parameters).
 
 Getting Started to Develop
 ==========================
@@ -139,35 +156,24 @@ Getting Started to Develop
 
 After you have installed all dependencies and build client you can now run the app. Run `npm run server` to start a local server using `node-dev` which will watch server-side codes and reload for you. The port will be displayed to you as `http://0.0.0.0:3000`.
 
-### build and run server
-```bash
-# development
-npm run build
-npm run server
-# production
-npm run build:prod
-npm run server:prod
-```
 
-## Other commands
+List of npm commands
+=====================
 
-### build client app
-```bash
-# development
-npm run build:dev
-# production
-npm run build:prod
-```
+e.g. `npm run build`
 
-### watch client-side codes and incremental build
-```bash
-npm run build:dev:watch
-```
+|command|desc|
+|--|--|
+|`build`|Same to `build:dev`|
+|`build:dev`|Build the client|
+|`build:dev:watch`|Watch and Re-build the client|
+|`build:prod`|Build the client for production|
+|`server`|Same to `server:dev:watch`|
+|`server:dev`|Launch the server|
+|`server:dev:watch`|Watch and Re-start the server|
+|`server:prod`|Launch the server for production|
+|`start`|run `build:prod` and `server:prod`|
 
-### run unit tests
-```bash
-npm test
-```
 
 Documentation
 ==============

+ 8 - 1
config/env.dev.js

@@ -6,5 +6,12 @@ module.exports = {
   PLUGIN_NAMES_TOBE_LOADED: [
     // 'crowi-plugin-lsx',
     // 'crowi-plugin-pukiwiki-like-linker',
-  ]
+  ],
+  // filters for debug
+  DEBUG: [
+    // 'express:*',
+    // 'crowi:*',
+    // 'crowi:plugins:*',
+    // 'crowi:InterceptorManager',
+  ].join(),
 }

+ 8 - 3
lib/crowi/index.js

@@ -357,8 +357,6 @@ Crowi.prototype.start = function() {
 
 Crowi.prototype.buildServer = function() {
   var express  = require('express')
-    , errorHandler   = require('errorhandler')
-    , morgan         = require('morgan')
     , app = express()
     , env = this.node_env
     ;
@@ -381,17 +379,24 @@ Crowi.prototype.buildServer = function() {
 
   if (env == 'development') {
     //swig.setDefaults({ cache: false });
-    app.use(errorHandler({ dumpExceptions: true, showStack: true }));
+    const morgan = require('morgan');
     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);

+ 66 - 63
lib/views/me/index.html

@@ -91,78 +91,81 @@
   </div>
 
   <div class="form-box">
-    <form action="/me/imagetype" method="post" class="form" role="form">
-      <fieldset>
 
-        <legend>{{ t('Set Profile Image') }}</legend>
-
-        <div class="form-group col-sm-offset-1 col-sm-3">
-          <div class="radio">
-            <h4>
-              <input type="radio" name="imagetypeForm[isGravatarEnabled]" value="true" {% if user.isGravatarEnabled %}checked="checked"{% endif %}>
-              <img src="https://gravatar.com/avatar/00000000000000000000000000000000?s=24" /> Gravatar
-              <a href="https://gravatar.com/">
-                <small><i class="fa fa-external-link" aria-hidden="true"></i></small>
-              </a>
-            </h4>
-          </div>
+    <!-- separeted form tag -->
+    <form action="/me/imagetype" id="formImageType" method="post" class="form" role="form"></form>
 
-          <img src="{{ user|gravatar }}" width="64">
-        </div><!-- /.col-sm* -->
+    <fieldset>
 
-        <div class="form-group col-sm-8">
-          <div class="radio">
-            <h4>
-              <input type="radio" name="imagetypeForm[isGravatarEnabled]" value="false" {% if !user.isGravatarEnabled  %}checked="checked"{% endif %}>{{ t('Upload Image') }}
-            </h4>
-          </div>
-          <div class="form-group">
-            <div id="pictureUploadFormMessage"></div>
-            <label for="" class="col-sm-4 control-label">
-              {{ t('Current Image') }}
-            </label>
-            <div class="col-sm-8">
-              <p>
-              <img src="{{ user|uploadedpicture }}" width="64" id="settingUserPicture"><br>
-              </p>
-              <p>
-              {% if user.image %}
-              <form action="/me/picture/delete" method="post" class="form-horizontal" role="form" onsubmit="return window.confirm('{{ t('Delete this image?') }}');">
-                <button type="submit" class="btn btn-danger">{{ t('Delete Image') }}</button>
-              </form>
-              {% endif %}
-              </p>
-            </div>
-          </div><!-- /.form-group -->
-
-          <div class="form-group">
-            <label for="" class="col-sm-4 control-label">
-              {{ t('Upload new image') }}
-            </label>
-            <div class="col-sm-8">
-              {% if isUploadable() %}
-              <form action="/_api/me/picture/upload" id="pictureUploadForm" method="post" class="form-horizontal" role="form" enctype="multipart/form-data">
-                <input name="userPicture" type="file" accept="image/*">
-                <div id="pictureUploadFormProgress">
-                </div>
-              </form>
-              {% else %}
-              * {{ t('page_me.form_help.profile_image1') }}<br>
-              * {{ t('page_me.form_help.profile_image2') }}<br>
-              {% endif %}
-            </div>
-          </div><!-- /.form-group -->
+      <legend>{{ t('Set Profile Image') }}</legend>
 
-        </div><!-- /.col-sm- -->
+      <div class="form-group col-sm-offset-1 col-sm-3">
+        <div class="radio">
+          <h4>
+            <input type="radio" form="formImageType" name="imagetypeForm[isGravatarEnabled]" value="true" {% if user.isGravatarEnabled %}checked="checked"{% endif %}>
+            <img src="https://gravatar.com/avatar/00000000000000000000000000000000?s=24" /> Gravatar
+            <a href="https://gravatar.com/">
+              <small><i class="fa fa-external-link" aria-hidden="true"></i></small>
+            </a>
+          </h4>
+        </div>
+
+        <img src="{{ user|gravatar }}" width="64">
+      </div><!-- /.col-sm* -->
 
+      <div class="form-group col-sm-8">
+        <div class="radio">
+          <h4>
+            <input type="radio" form="formImageType" name="imagetypeForm[isGravatarEnabled]" value="false" {% if !user.isGravatarEnabled  %}checked="checked"{% endif %}>
+            {{ t('Upload Image') }}
+          </h4>
+        </div>
         <div class="form-group">
-          <div class="col-sm-offset-4 col-sm-6">
-            <button type="submit" class="btn btn-primary">{{ t('Update') }}</button>
+          <div id="pictureUploadFormMessage"></div>
+          <label for="" class="col-sm-4 control-label">
+            {{ t('Current Image') }}
+          </label>
+          <div class="col-sm-8">
+            <p>
+            <img src="{{ user|uploadedpicture }}" width="64" id="settingUserPicture"><br>
+            </p>
+            <p>
+            {% if user.image %}
+            <form action="/me/picture/delete" method="post" class="form-horizontal" role="form" onsubmit="return window.confirm('{{ t('Delete this image?') }}');">
+              <button type="submit" class="btn btn-danger">{{ t('Delete Image') }}</button>
+            </form>
+            {% endif %}
+            </p>
+          </div>
+        </div><!-- /.form-group -->
+
+        <div class="form-group">
+          <label for="" class="col-sm-4 control-label">
+            {{ t('Upload new image') }}
+          </label>
+          <div class="col-sm-8">
+            {% if isUploadable() %}
+            <form action="/_api/me/picture/upload" id="pictureUploadForm" method="post" class="form-horizontal" role="form" enctype="multipart/form-data">
+              <input name="userPicture" type="file" accept="image/*">
+              <div id="pictureUploadFormProgress">
+              </div>
+            </form>
+            {% else %}
+            * {{ t('page_me.form_help.profile_image1') }}<br>
+            * {{ t('page_me.form_help.profile_image2') }}<br>
+            {% endif %}
           </div>
+        </div><!-- /.form-group -->
+
+      </div><!-- /.col-sm- -->
+
+      <div class="form-group">
+        <div class="col-sm-offset-4 col-sm-6">
+          <button type="submit" form="formImageType" class="btn btn-primary">{{ t('Update') }}</button>
         </div>
+      </div>
 
-      </fieldset>
-    </form>
+    </fieldset>
   </div><!-- /.form-box -->
 
   <script>

+ 6 - 7
package.json

@@ -1,6 +1,6 @@
 {
   "name": "crowi-plus",
-  "version": "1.2.8-RC",
+  "version": "1.2.9-RC",
   "description": "Enhanced Crowi",
   "tags": [
     "wiki",
@@ -32,11 +32,9 @@
     "prebuild:dev": "env-cmd config/env.dev.js npm run plugin:def",
     "prebuild:prod": "npm run plugin:def",
     "prestart": "npm run build:prod",
-    "server:dev:watch": "env-cmd config/env.dev.js node-dev app.js --watch",
+    "server:dev:watch": "env-cmd config/env.dev.js node-dev --respawn app.js --watch",
     "server:dev": "env-cmd config/env.dev.js node app.js",
-    "server:prod:container": "node app.js --production --container",
-    "server:prod:onpremise": "mkdirp logs && node app.js --production --onpremise",
-    "server:prod": "npm run server:prod:onpremise",
+    "server:prod": "node app.js --production | pino-clf common",
     "server": "npm run server:dev:watch",
     "start": "npm run server:prod",
     "test": "mocha -r test/bootstrap.js test/**/*.js",
@@ -74,9 +72,9 @@
     "elasticsearch": "^12.1.3",
     "emojify.js": "^1.1.0",
     "env-cmd": "^5.0.0",
-    "errorhandler": "^1.5.0",
     "express": "~4.15.2",
     "express-form": "~0.12.0",
+    "express-pino-logger": "^2.0.0",
     "express-session": "~1.15.0",
     "express-webpack-assets": "0.0.2",
     "file-loader": "^0.11.1",
@@ -96,13 +94,13 @@
     "moment": "^2.18.0",
     "mongoose": "^4.9.4",
     "mongoose-paginate": "5.0.x",
-    "morgan": "^1.8.0",
     "multer": "~1.3.0",
     "node-sass": "^4.5.0",
     "nodemailer": "~2.7.0",
     "nodemailer-ses-transport": "~1.5.0",
     "normalize-path": "^2.1.1",
     "optimize-js-plugin": "0.0.4",
+    "pino-clf": "^1.0.2",
     "plantuml-encoder": "^1.2.4",
     "react": "^15.5.0",
     "react-bootstrap": "^0.31.0",
@@ -128,6 +126,7 @@
     "concurrently": "^3.4.0",
     "easy-livereload": "^1.2.0",
     "mocha": "^3.2.0",
+    "morgan": "^1.8.2",
     "node-dev": "^3.1.3",
     "proxyquire": "^1.7.11",
     "sinon": "^2.1.0",

+ 1 - 1
resource/js/legacy/crowi-form.js

@@ -370,7 +370,7 @@ $(function() {
    * event handler when 'Ctrl-S' pressed
    */
   var handleSKey = function(event) {
-    if (!event.ctrlKey) {
+    if (!event.ctrlKey && !event.metaKey) {
       return;
     }
 

+ 108 - 25
yarn.lock

@@ -878,7 +878,7 @@ basic-auth-connect@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz#fdb0b43962ca7b40456a7c2bb48fe173da2d2122"
 
-basic-auth@~1.1.0:
+basic-auth@^1.1.0, basic-auth@~1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884"
 
@@ -1269,6 +1269,10 @@ classnames@^2.2.0, classnames@^2.2.5:
   version "2.2.5"
   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-table@^0.3.1:
   version "0.3.1"
   resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23"
@@ -2025,6 +2029,12 @@ encoding@^0.1.11:
   dependencies:
     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@~1.8.4:
   version "1.8.4"
   resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.4.tgz#9fe85dee25853ca6babe25bd2ad68710863e91c2"
@@ -2091,13 +2101,6 @@ error-ex@^1.2.0:
   dependencies:
     is-arrayish "^0.2.1"
 
-errorhandler@^1.5.0:
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.5.0.tgz#eaba64ca5d542a311ac945f582defc336165d9f4"
-  dependencies:
-    accepts "~1.3.3"
-    escape-html "~1.0.3"
-
 es6-promise@3.2.1:
   version "3.2.1"
   resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.2.1.tgz#ec56233868032909207170c39448e24449dd1fc4"
@@ -2164,6 +2167,12 @@ express-form@~0.12.0:
     object-additions "^0.5.1"
     validator "^2.1.0"
 
+express-pino-logger@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/express-pino-logger/-/express-pino-logger-2.0.0.tgz#e2b1046a8e9a9fe65d4e7fcbe57115e28df076a1"
+  dependencies:
+    pino-http "^2.0.0"
+
 express-session@~1.15.0:
   version "1.15.3"
   resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.15.3.tgz#db545f0435a7b1b228ae02da8197f65141735c67"
@@ -2229,6 +2238,14 @@ extsprintf@1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
 
+fast-json-parse@^1.0.0, fast-json-parse@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/fast-json-parse/-/fast-json-parse-1.0.2.tgz#3fb1ca12db68a85933612cc3fab4d7060cfff1d7"
+
+fast-safe-stringify@^1.0.8, fast-safe-stringify@^1.1.11:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-1.2.0.tgz#ebd42666fd18fe4f2ba4f0d295065f3f85cade96"
+
 fastparse@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8"
@@ -2322,6 +2339,10 @@ find-up@^1.0.0:
     path-exists "^2.0.0"
     pinkie-promise "^2.0.0"
 
+flatstr@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.5.tgz#5b451b08cbd48e2eac54a2bbe0bf46165aa14be3"
+
 flatten@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
@@ -3089,7 +3110,7 @@ json-stable-stringify@^1.0.1:
   dependencies:
     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"
   resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
 
@@ -3721,7 +3742,7 @@ mongoose@^4.9.4:
     regexp-clone "0.0.1"
     sliced "1.0.1"
 
-morgan@^1.8.0:
+morgan@^1.8.2:
   version "1.8.2"
   resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.8.2.tgz#784ac7734e4a453a9c6e6e8680a9329275c8b687"
   dependencies:
@@ -3793,6 +3814,15 @@ native-promise-only@^0.8.1:
   version "0.8.1"
   resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11"
 
+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:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
@@ -4136,7 +4166,7 @@ on-headers@~1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
 
-once@^1.3.0, once@^1.3.3:
+once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
   dependencies:
@@ -4318,6 +4348,45 @@ pinkie@^2.0.0:
   version "2.0.4"
   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@^2.0.0:
+  version "2.6.1"
+  resolved "https://registry.yarnpkg.com/pino-http/-/pino-http-2.6.1.tgz#aec7e852ee8f47a089bc4be4614a627d2c302598"
+  dependencies:
+    pino "^4.0.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.0.2:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/pino/-/pino-4.6.0.tgz#68e78ee9f3799a208a120a4533207943f38f6c5d"
+  dependencies:
+    chalk "^1.1.1"
+    fast-json-parse "^1.0.0"
+    fast-safe-stringify "^1.1.11"
+    flatstr "^1.0.4"
+    pump "^1.0.2"
+    quick-format-unescaped "^1.1.1"
+    split2 "^2.0.1"
+
 pkg-dir@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
@@ -4643,6 +4712,13 @@ public-encrypt@^4.0.0:
     parse-asn1 "^5.0.0"
     randombytes "^2.0.1"
 
+pump@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.2.tgz#3b3ee6512f94f0e575538c17995f9f16990a5d51"
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
 punycode@1.3.2:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
@@ -4678,6 +4754,12 @@ querystring@0.2.0:
   version "0.2.0"
   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:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b"
@@ -4835,7 +4917,7 @@ readable-stream@1.1.x, readable-stream@~1.1.9:
     isarray "0.0.1"
     string_decoder "~0.10.x"
 
-readable-stream@2.2.7:
+readable-stream@2.2.7, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, 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:
   version "2.2.7"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.7.tgz#07057acbe2467b22042d36f98c5ad507054e95b1"
   dependencies:
@@ -4847,18 +4929,6 @@ readable-stream@2.2.7:
     string_decoder "~1.0.0"
     util-deprecate "~1.0.1"
 
-readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.2.6:
-  version "2.2.11"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.11.tgz#0796b31f8d7688007ff0b93a8088d34aa17c0f72"
-  dependencies:
-    core-util-is "~1.0.0"
-    inherits "~2.0.1"
-    isarray "~1.0.0"
-    process-nextick-args "~1.0.6"
-    safe-buffer "~5.0.1"
-    string_decoder "~1.0.0"
-    util-deprecate "~1.0.1"
-
 readable-stream@~2.0.5:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
@@ -5411,6 +5481,12 @@ spdx-license-ids@^1.0.2:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
 
+split2@^2.0.1, split2@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/split2/-/split2-2.1.1.tgz#7a1f551e176a90ecd3345f7246a0cfe175ef4fd0"
+  dependencies:
+    through2 "^2.0.2"
+
 sprintf-js@~1.0.2:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
@@ -5629,6 +5705,13 @@ text-encoding@0.6.4:
   version "0.6.4"
   resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19"
 
+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"
+
 timers-browserify@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86"
@@ -6053,7 +6136,7 @@ xmlhttprequest-ssl@1.5.3:
   version "1.5.3"
   resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d"
 
-xtend@^4.0.0:
+xtend@^4.0.0, xtend@~4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"