├── .eslintrc.json
├── .gitattributes
├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── dist
    └── loglevel-plugin-remote.min.js
├── lib
    └── loglevel-plugin-remote.js
├── package-lock.json
├── package.json
├── src
    └── remote.js
└── test
    ├── .eslintrc.json
    └── test.js
/.eslintrc.json:
--------------------------------------------------------------------------------
 1 | {
 2 |     "extends": "airbnb-base",
 3 |     "plugins": [
 4 |         "import"
 5 |     ],
 6 |     "env": {
 7 |         "browser": true,
 8 |         "es6": true
 9 |     },
10 |     "rules": {
11 |         "no-param-reassign": "off",
12 |         "default-case": "off",
13 |         "prefer-rest-params": "off",
14 |         "no-restricted-syntax": "off",
15 |         "no-mixed-operators": "off"
16 |     }
17 | }
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | lib/* linguist-generated
2 | dist/* linguist-generated
3 | 
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .vscode/
2 | node_modules/
3 | internal/
4 | 
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 |   - "node"
4 | 
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
 1 | MIT License
 2 | 
 3 | Copyright (c) 2017 Eugene Pavlov
 4 | 
 5 | Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | of this software and associated documentation files (the "Software"), to deal
 7 | in the Software without restriction, including without limitation the rights
 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 | 
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 | 
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 | 
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
  1 | # loglevel-plugin-remote
  2 | 
  3 | A [loglevel](https://github.com/pimterry/loglevel) plugin for sending browser logs to a server.
  4 | 
  5 | [](https://www.npmjs.com/package/loglevel-plugin-remote)[](https://travis-ci.org/kutuluk/loglevel-plugin-remote)
  6 | 
  7 | ## Features
  8 | 
  9 | - Sends logs asynchronously with a specified frequency using only one request at a time.
 10 | - Slows the frequency of sending after a fail and restores after success.
 11 | - Supports Bearer authentication scheme.
 12 | - Provides light string interpolation like console and node.js (%s, %d, %j, %o).
 13 | - Provides the ability to add any values to the logs and specify a custom format.
 14 | - Single file, no dependencies, weighs in at 2.3KB minified and gzipped.
 15 | 
 16 | ## Installation
 17 | 
 18 | ```sh
 19 | npm i loglevel-plugin-remote --save
 20 | ```
 21 | 
 22 | ## API
 23 | 
 24 | **This plugin is under active development and should be considered as an unstable. No guarantees regarding API stability are made. Backward compatibility is guaranteed only by path releases.**
 25 | 
 26 | #### `apply(loglevel, options)`
 27 | 
 28 | This method applies the plugin to the loglevel.
 29 | 
 30 | #### Parameters
 31 | 
 32 | `loglevel` - the root logger, imported from loglevel package
 33 | 
 34 | `options` - an optional configuration object
 35 | 
 36 | ```javascript
 37 | const defaults = {
 38 |   url: '/logger',
 39 |   method: 'POST',
 40 |   headers: {},
 41 |   token: '',
 42 |   onUnauthorized: failedToken => {},
 43 |   timeout: 0,
 44 |   interval: 1000,
 45 |   level: 'trace',
 46 |   backoff: {
 47 |     multiplier: 2,
 48 |     jitter: 0.1,
 49 |     limit: 30000,
 50 |   },
 51 |   capacity: 500,
 52 |   stacktrace: {
 53 |     levels: ['trace', 'warn', 'error'],
 54 |     depth: 3,
 55 |     excess: 0,
 56 |   },
 57 |   timestamp: () => new Date().toISOString(),
 58 |   format: remote.plain,
 59 | };
 60 | ```
 61 | 
 62 | - **url** (string) - a URL of the server logging API
 63 | 
 64 | - **method** (string) - a HTTP method of the server logging API
 65 | 
 66 | - **headers** (object) - this is to support custom headers passed down to the post request. For example { 'my-header': 'myHeaderValue' }
 67 | 
 68 | - **token** (string) - a token for Bearer authentication scheme (see [RFC 6750](https://tools.ietf.org/html/rfc6750)), e.g. [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier) or [JWT](https://jwt.io/). By default is `''`. If you set the value to `undefined`, the sending of logs will be suspended until the `setToken` method is called, but the logs will still accumulate in the queue.
 69 | 
 70 | - **onUnauthorized** (function) - this function will be called after the sending of logs is suspended due to an authentication error. A token that has not been authenticated will be passed to the function.
 71 | 
 72 | - **timeout** (number) - a timeout in milliseconds (see [XMLHttpRequest.timeout](https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/timeout))
 73 | 
 74 | - **interval** (number) - a time in milliseconds between sending messages. By default is 1000 (one second).
 75 | 
 76 | - **level** (string) - a plugin specific level. The plugin level does not cancel the level of the logger. The highest level will be used to send messages. If the level of the logger is `warn`, and the level of the plugin is `error`, only messages with the `error` level will be sent to the server. By default is `trace`.
 77 | 
 78 | - **backoff** (function|object) - a function used to increase the sending interval after each failed send. The function receives the duration of the previous suspend and returns the duration of the next suspend. Instead of the function backoff can be represented by an object with 3 properties: `multiplier`, `jitter` and `limit`. By default, it doubles the interval (multiplier=2) and adds 10% jitter (jitter=0.1). Having reached the value of 30 seconds (limit=30000), the interval increase stops. After successful sending, the interval will be reset to the initial value.
 79 | 
 80 | - **capacity** (number) - the size of the queue in which messages are accumulated between sending. By default is 500. Overflow will delete the oldest messages. It is forbidden to set the value to 0 - in this case the default value will be used.
 81 | 
 82 | - **stacktrace** (object) - object for configuring a stacktrace with the following properties:
 83 | 
 84 |   - **levels** (array) - lots of levels for which to add the stack trace. By default is `trace`, `warn` and `error`.
 85 |   - **depth** (number) - number of stack trace lines. By default is 3.
 86 |   - **excess** (number) - number of excess lines generated by following plugins (each plugin adds one line). This number of lines will be removed from the top of the stack trace. By default is 0.
 87 | 
 88 | - **timestamp** (function) - a function that returns a timestamp. By default, it returns the time in the ISO format (see [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601))
 89 | 
 90 | - **format** (function) - this option defines the logs format. This function will generate a log, obtaining as a single argument a log object that looks like this:
 91 | 
 92 | ```javascript
 93 | const log = {
 94 |   message: 'Text',
 95 |   level: {
 96 |     label: 'info',
 97 |     value: 2,
 98 |   },
 99 |   logger: 'child',
100 |   timestamp: '2017-05-29T12:53:46.000Z',
101 |   stacktrace: '',
102 | };
103 | ```
104 | 
105 | When the function returns a string, the logs will be sent as plain text. The default value is function `remote.plain`:
106 | 
107 | ```javascript
108 | function plain(log) {
109 |   return `[${log.timestamp}] ${log.level.label.toUpperCase()}${
110 |     log.logger ? ` (${log.logger})` : ''
111 |   }: ${log.message}${log.stacktrace ? `\n${log.stacktrace}` : ''}`;
112 | }
113 | ```
114 | 
115 | Then when you call:
116 | 
117 | ```javascript
118 | log.getLogger('child').info('Info message');
119 | log.error('Error message');
120 | ```
121 | 
122 | the logs look like this:
123 | 
124 | ```
125 | [2017-05-29T12:53:46.000Z] INFO (child): Info message
126 | [2017-05-29T12:53:46.001Z] ERROR: Error message
127 |     at http://localhost/test.js:12:5
128 | ```
129 | 
130 | When the function returns an object, the logs will be sent in json format. You can use the preset function `remote.json`:
131 | 
132 | ```javascript
133 | function json(log) {
134 |   log.level = log.level.label;
135 |   return log;
136 | }
137 | ```
138 | 
139 | then the logs will look like this:
140 | 
141 | ```json
142 | {
143 |   "logs": [
144 |     {
145 |       "message": "Info message",
146 |       "level": "info",
147 |       "logger": "child",
148 |       "timestamp": "2017-05-29T12:53:46.000Z",
149 |       "stacktrace": ""
150 |     },
151 |     {
152 |       "message": "Error message",
153 |       "level": "error",
154 |       "logger": "",
155 |       "timestamp": "2017-05-29T12:53:46.001Z",
156 |       "stacktrace": "    at http://localhost/test.js:12:5"
157 |     }
158 |   ]
159 | }
160 | ```
161 | 
162 | You can include any values in the log. For example:
163 | 
164 | ```javascript
165 | import log from 'loglevel';
166 | import remote from 'loglevel-plugin-remote';
167 | 
168 | const getCounter = () => {
169 |   let count = 1;
170 |   return () => count++;
171 | };
172 | const counter = getCounter();
173 | 
174 | const customPlain = log => `[${counter()}] ${log.message}`;
175 | 
176 | /*
177 | const customJSON = log => ({
178 |   msg: log.message,
179 |   count: counter(),
180 | });
181 | */
182 | 
183 | remote.apply(log, { format: customPlain });
184 | // remote.apply(log, { format: customJSON });
185 | 
186 | log.enableAll();
187 | log.info('Message one');
188 | log.info('Message two');
189 | ```
190 | 
191 | customPlain:
192 | 
193 | ```
194 | [1] Message one
195 | [2] Message two
196 | ```
197 | 
198 | customJSON:
199 | 
200 | ```json
201 | {
202 |   "logs": [
203 |     {
204 |       "msg": "Message one",
205 |       "count": 1
206 |     },
207 |     {
208 |       "msg": "Message two",
209 |       "count": 2
210 |     }
211 |   ]
212 | }
213 | ```
214 | 
215 | #### `setToken(token)`
216 | 
217 | This method only has an effect after a successful call to the apply method and is used to assign a new authentication token. If you pass the value `undefined`, the sending of logs will be suspended until the next `setToken` call, but the logs will still accumulate in the queue.
218 | 
219 | #### `disable()`
220 | 
221 | This method cancels the effect of the plugin.
222 | 
223 | ## Base usage
224 | 
225 | ### Browser directly
226 | 
227 | ```html
228 | 
229 | 
230 | 
231 | 
237 | ```
238 | 
239 | ### ES6
240 | 
241 | ```javascript
242 | import log from 'loglevel';
243 | import remote from 'loglevel-plugin-remote';
244 | 
245 | remote.apply(log);
246 | log.warn('message');
247 | ```
248 | 
249 | ### CommonJS
250 | 
251 | ```javascript
252 | var log = require('loglevel');
253 | var remote = require('loglevel-plugin-remote');
254 | 
255 | remote.apply(log);
256 | log.warn('message');
257 | ```
258 | 
259 | ### AMD
260 | 
261 | ```javascript
262 | define(['loglevel', 'loglevel-plugin-remote'], function(log, remote) {
263 |   remote.apply(log);
264 |   log.warn('message');
265 | });
266 | ```
267 | 
268 | ## Example
269 | 
270 | Code
271 | 
272 | ```javascript
273 | var log = require('loglevel');
274 | var remote = require('loglevel-plugin-remote');
275 | 
276 | log.enableAll();
277 | 
278 | remote.apply(log);
279 | 
280 | log.info('Log levels:');
281 | log.trace('trace message');
282 | log.debug('debug message');
283 | log.info('info message');
284 | log.warn('warn message');
285 | log.error('error message');
286 | ```
287 | 
288 | Output in a log server
289 | 
290 | ```
291 | [2017-05-29T12:53:46.000Z] INFO: Log levels:
292 | [2017-05-29T12:53:46.000Z] TRACE: trace message
293 |     at http://localhost/js/test.js:9:5
294 | [2017-05-29T12:53:46.000Z] DEBUG: debug message
295 | [2017-05-29T12:53:46.000Z] INFO: info message
296 | [2017-05-29T12:53:46.000Z] WARN: warn message
297 |     at http://localhost/js/test.js:12:5
298 | [2017-05-29T12:53:46.000Z] ERROR: error message
299 |     at http://localhost/js/test.js:13:5
300 | ```
301 | 
302 | Code
303 | 
304 | ```javascript
305 | log.info('String interpolation: %% %t %s', 'one', 'two');
306 | log.info('Number interpolation: %d %d %d %d', 16, 1e6, '16', '1e6');
307 | ```
308 | 
309 | Output in a log server
310 | 
311 | ```
312 | [2017-05-29T12:53:46.000Z] INFO: String interpolation: % %t one two
313 | [2017-05-29T12:53:46.000Z] INFO: Number interpolation: 16 1000000 16 1000000
314 | ```
315 | 
316 | Code
317 | 
318 | ```javascript
319 | log.info('Object interpolation:');
320 | 
321 | function Rectangle(width, height) {
322 |   this.width = width;
323 |   this.height = height;
324 | }
325 | var object = new Rectangle(10, 10);
326 | log.info('%s, %d, %o, %j', object, object, object, object, object);
327 | 
328 | var date = new Date();
329 | log.info('date: %o', date);
330 | 
331 | var error = new Error('My error');
332 | log.info('error: %o', error);
333 | 
334 | var string = 'My string';
335 | log.info('string: %o', string);
336 | 
337 | var number = 123;
338 | log.info('number: %o', number);
339 | 
340 | var bool = true;
341 | log.info('boolean: %o', bool);
342 | 
343 | var array = [1, 2, 3];
344 | log.info('array: %o', array);
345 | ```
346 | 
347 | Output in a log server
348 | 
349 | ```
350 | [2017-05-29T12:53:46.000Z] INFO: Object interpolation:
351 | [2017-05-29T12:53:46.000Z] INFO: [object Object], NaN, Rectangle{"height":10,"width":10}, {"height":10,"width":10} [object Object]
352 | [2017-05-29T12:53:46.000Z] INFO: date: Date<"2017-06-04T13:16:01.455Z">
353 | [2017-05-29T12:53:46.000Z] INFO: error: Error{}
354 | [2017-05-29T12:53:46.000Z] INFO: string: String<"My string">
355 | [2017-05-29T12:53:46.000Z] INFO: number: Number<123>
356 | [2017-05-29T12:53:46.000Z] INFO: boolean: Boolean
357 | [2017-05-29T12:53:46.000Z] INFO: array: Array[1,2,3]
358 | ```
359 | 
360 | ## Multiple plugins
361 | 
362 | Code
363 | 
364 | ```javascript
365 | var log = require('loglevel');
366 | var remote = require('loglevel-plugin-remote');
367 | var mock = require('loglevel-plugin-mock');
368 | 
369 | // To clean the loglevel-plugin-mock line in the stack trace:
370 | // options = { stacktrace: { excess: 1 } }
371 | remote.apply(log, { stacktrace: { excess: 1 } });
372 | mock.apply(log);
373 | 
374 | var array = [1, 2, 3];
375 | log.warn('array: %o', array);
376 | ```
377 | 
378 | Output in a log server
379 | 
380 | ```
381 | [2017-05-29T12:53:46.000Z] WARN: array: Array[1,2,3]
382 |     at http://localhost/js/test.js:11:5
383 | ```
384 | 
--------------------------------------------------------------------------------
/dist/loglevel-plugin-remote.min.js:
--------------------------------------------------------------------------------
1 | !function(e,t){if("function"==typeof define&&define.amd)define(["module","exports"],t);else if("undefined"!=typeof exports)t(module,exports);else{var r={exports:{}};t(r,r.exports),e.remote=r.exports}}(this,function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},f=window;if(!f)throw new Error("Plugin for browser usage only");var r=void 0;function s(e){try{return JSON.stringify(e)}catch(e){if(!r)try{var t={};t.a=t,JSON.stringify(t)}catch(e){r=e.message}if(e.message===r)return"[Circular]";throw e}}function w(c){var e="",l=0;return 1"),i=function(e){if(!Object.getOwnPropertyDescriptor||!Object.getPrototypeOf)return Object.prototype.toString.call(e).slice(8,-1);for(;e;){var t=Object.getOwnPropertyDescriptor(e,"constructor");if(void 0!==t&&"function"==typeof t.value&&""!==t.value.name)return t.value.name;e=Object.getPrototypeOf(e)}return""}(o)+a}return i})).replace(/%{2,2}/g,"%"),l+=1),c.length>l&&(e&&(e+=" "),e+=c.slice(l).join(" ")),e}var p=Object.prototype.hasOwnProperty;function k(){try{throw new Error}catch(e){return e.stack}}function n(t){var r=this,n=[],o=[];this.length=function(){return n.length},this.sent=function(){return o.length},this.push=function(e){n.push(e),n.length>t&&n.shift()},this.send=function(){return o.length||(o=n,n=[]),o},this.confirm=function(){o=[],r.content=""},this.fail=function(){var e=1+n.length+o.length-t;0r.limit&&(t=r.limit),t+=t*r.jitter*Math.random()}:r,l=d.interval,h=void 0,m=void 0,s=!1,u=!1,y=new n(d.capacity);function b(){if(!u&&!s&&void 0!==d.token){if(!y.sent()){if(!y.length())return;var e=y.send();y.content=m?'{"logs":['+e.join(",")+"]}":e.join("\n")}s=!0;var t=new f.XMLHttpRequest;t.open(d.method,d.url,!0),t.setRequestHeader("Content-Type",h),d.token&&t.setRequestHeader("Authorization","Bearer "+d.token);var r=d.headers;for(var n in r)if(p.call(r,n)){var o=r[n];o&&t.setRequestHeader(n,o)}var i=void 0;d.timeout&&(i=f.setTimeout(function(){s=!1,t.abort(),a()},d.timeout)),t.onreadystatechange=function(){if(4===t.readyState)if(s=!1,f.clearTimeout(i),200===t.status)l=d.interval,y.confirm(),a(!0);else{if(401===t.status){var e=d.token;d.token=void 0,d.onUnauthorized(e)}a()}},t.send(y.content)}function a(e){e||(l=c(l||1),y.fail()),u=!0,f.setTimeout(function(){u=!1,b()},l)}}return a=e.methodFactory,v=function(s,e,u){var f=a(s,e,u),p=o&&d.stacktrace.levels.some(function(e){return e===s}),v=j.levels[s.toUpperCase()],g=v>=j.levels[d.level.toUpperCase()];return function(){for(var e=arguments.length,t=Array(e),r=0;r 1 && typeof array[0] === 'string') {
 79 |       result = array[0].replace(/(%?)(%([sdjo]))/g, function (match, escaped, ptn, flag) {
 80 |         if (!escaped) {
 81 |           index += 1;
 82 |           var arg = array[index];
 83 |           var a = '';
 84 |           switch (flag) {
 85 |             case 's':
 86 |               a += arg;
 87 |               break;
 88 |             case 'd':
 89 |               a += +arg;
 90 |               break;
 91 |             case 'j':
 92 |               a = tryStringify(arg);
 93 |               break;
 94 |             case 'o':
 95 |               {
 96 |                 var obj = tryStringify(arg);
 97 |                 if (obj[0] !== '{' && obj[0] !== '[') {
 98 |                   obj = '<' + obj + '>';
 99 |                 }
100 |                 a = getConstructorName(arg) + obj;
101 |                 break;
102 |               }
103 |           }
104 |           return a;
105 |         }
106 |         return match;
107 |       });
108 | 
109 |       // update escaped %% values
110 |       result = result.replace(/%{2,2}/g, '%');
111 | 
112 |       index += 1;
113 |     }
114 | 
115 |     // arguments remaining after formatting
116 |     if (array.length > index) {
117 |       if (result) result += ' ';
118 |       result += array.slice(index).join(' ');
119 |     }
120 | 
121 |     return result;
122 |   }
123 | 
124 |   var hasOwnProperty = Object.prototype.hasOwnProperty;
125 | 
126 | 
127 |   // Light deep Object.assign({}, ...sources)
128 |   function assign() {
129 |     var target = {};
130 |     for (var s = 0; s < arguments.length; s += 1) {
131 |       var source = Object(arguments[s]);
132 |       for (var key in source) {
133 |         if (hasOwnProperty.call(source, key)) {
134 |           target[key] = _typeof(source[key]) === 'object' && !Array.isArray(source[key]) ? assign(target[key], source[key]) : source[key];
135 |         }
136 |       }
137 |     }
138 |     return target;
139 |   }
140 | 
141 |   function getStacktrace() {
142 |     try {
143 |       throw new Error();
144 |     } catch (trace) {
145 |       return trace.stack;
146 |     }
147 |   }
148 | 
149 |   function Queue(capacity) {
150 |     var _this = this;
151 | 
152 |     var queue = [];
153 |     var sent = [];
154 | 
155 |     this.length = function () {
156 |       return queue.length;
157 |     };
158 |     this.sent = function () {
159 |       return sent.length;
160 |     };
161 | 
162 |     this.push = function (message) {
163 |       queue.push(message);
164 |       if (queue.length > capacity) {
165 |         queue.shift();
166 |       }
167 |     };
168 | 
169 |     this.send = function () {
170 |       if (!sent.length) {
171 |         sent = queue;
172 |         queue = [];
173 |       }
174 |       return sent;
175 |     };
176 | 
177 |     this.confirm = function () {
178 |       sent = [];
179 |       _this.content = '';
180 |     };
181 | 
182 |     this.fail = function () {
183 |       var overflow = 1 + queue.length + sent.length - capacity;
184 | 
185 |       if (overflow > 0) {
186 |         sent.splice(0, overflow);
187 |         queue = sent.concat(queue);
188 |         _this.confirm();
189 |       }
190 |       // if (queue.length + sent.length >= capacity) this.confirm();
191 |     };
192 |   }
193 | 
194 |   var hasStacktraceSupport = !!getStacktrace();
195 | 
196 |   var loglevel = void 0;
197 |   var originalFactory = void 0;
198 |   var pluginFactory = void 0;
199 | 
200 |   function plain(log) {
201 |     return '[' + log.timestamp + '] ' + log.level.label.toUpperCase() + (log.logger ? ' (' + log.logger + ')' : '') + ': ' + log.message + (log.stacktrace ? '\n' + log.stacktrace : '');
202 |   }
203 | 
204 |   function json(log) {
205 |     log.level = log.level.label;
206 |     return log;
207 |   }
208 | 
209 |   function setToken() {
210 |     throw new Error("You can't set token for a not appled plugin");
211 |   }
212 | 
213 |   var save = win.remote;
214 | 
215 |   var defaultCapacity = 500;
216 |   var defaults = {
217 |     url: '/logger',
218 |     method: 'POST',
219 |     headers: {},
220 |     token: '',
221 |     onUnauthorized: function onUnauthorized() {},
222 |     timeout: 0,
223 |     interval: 1000,
224 |     level: 'trace',
225 |     backoff: {
226 |       multiplier: 2,
227 |       jitter: 0.1,
228 |       limit: 30000
229 |     },
230 |     capacity: 0,
231 |     stacktrace: {
232 |       levels: ['trace', 'warn', 'error'],
233 |       depth: 3,
234 |       excess: 0
235 |     },
236 |     timestamp: function timestamp() {
237 |       return new Date().toISOString();
238 |     },
239 |     format: plain
240 |   };
241 | 
242 |   var remote = {
243 |     noConflict: function noConflict() {
244 |       if (win.remote === remote) {
245 |         win.remote = save;
246 |       }
247 |       return remote;
248 |     },
249 | 
250 |     plain: plain,
251 |     json: json,
252 |     apply: function apply(logger, options) {
253 |       if (!logger || !logger.getLogger) {
254 |         throw new TypeError('Argument is not a root loglevel object');
255 |       }
256 | 
257 |       if (loglevel) {
258 |         throw new Error('You can assign a plugin only one time');
259 |       }
260 | 
261 |       if (!win.XMLHttpRequest) return logger;
262 | 
263 |       loglevel = logger;
264 | 
265 |       var config = assign(defaults, options);
266 | 
267 |       config.capacity = config.capacity || defaultCapacity;
268 | 
269 |       var backoff = config.backoff;
270 | 
271 | 
272 |       var backoffFunc = (typeof backoff === 'undefined' ? 'undefined' : _typeof(backoff)) === 'object' ? function (duration) {
273 |         var next = duration * backoff.multiplier;
274 |         if (next > backoff.limit) next = backoff.limit;
275 |         next += next * backoff.jitter * Math.random();
276 |         return next;
277 |       } : backoff;
278 | 
279 |       var interval = config.interval;
280 | 
281 |       var contentType = void 0;
282 |       var isJSON = void 0;
283 |       var isSending = false;
284 |       var isSuspended = false;
285 | 
286 |       var queue = new Queue(config.capacity);
287 | 
288 |       function send() {
289 |         if (isSuspended || isSending || config.token === undefined) {
290 |           return;
291 |         }
292 | 
293 |         if (!queue.sent()) {
294 |           if (!queue.length()) {
295 |             return;
296 |           }
297 | 
298 |           var logs = queue.send();
299 | 
300 |           queue.content = isJSON ? '{"logs":[' + logs.join(',') + ']}' : logs.join('\n');
301 |         }
302 | 
303 |         isSending = true;
304 | 
305 |         var xhr = new win.XMLHttpRequest();
306 |         xhr.open(config.method, config.url, true);
307 |         xhr.setRequestHeader('Content-Type', contentType);
308 |         if (config.token) {
309 |           xhr.setRequestHeader('Authorization', 'Bearer ' + config.token);
310 |         }
311 | 
312 |         var headers = config.headers;
313 | 
314 |         for (var header in headers) {
315 |           if (hasOwnProperty.call(headers, header)) {
316 |             var value = headers[header];
317 |             if (value) {
318 |               xhr.setRequestHeader(header, value);
319 |             }
320 |           }
321 |         }
322 | 
323 |         function suspend(successful) {
324 |           if (!successful) {
325 |             // interval = config.backoff(interval || 1);
326 |             interval = backoffFunc(interval || 1);
327 |             queue.fail();
328 |           }
329 | 
330 |           isSuspended = true;
331 |           win.setTimeout(function () {
332 |             isSuspended = false;
333 |             send();
334 |           }, interval);
335 |         }
336 | 
337 |         var timeout = void 0;
338 |         if (config.timeout) {
339 |           timeout = win.setTimeout(function () {
340 |             isSending = false;
341 |             xhr.abort();
342 |             suspend();
343 |           }, config.timeout);
344 |         }
345 | 
346 |         xhr.onreadystatechange = function () {
347 |           if (xhr.readyState !== 4) {
348 |             return;
349 |           }
350 | 
351 |           isSending = false;
352 |           win.clearTimeout(timeout);
353 | 
354 |           if (xhr.status === 200) {
355 |             // eslint-disable-next-line prefer-destructuring
356 |             interval = config.interval;
357 |             queue.confirm();
358 |             suspend(true);
359 |           } else {
360 |             if (xhr.status === 401) {
361 |               var token = config.token;
362 | 
363 |               config.token = undefined;
364 |               config.onUnauthorized(token);
365 |             }
366 |             suspend();
367 |           }
368 |         };
369 | 
370 |         xhr.send(queue.content);
371 |       }
372 | 
373 |       originalFactory = logger.methodFactory;
374 | 
375 |       pluginFactory = function remoteMethodFactory(methodName, logLevel, loggerName) {
376 |         var rawMethod = originalFactory(methodName, logLevel, loggerName);
377 |         var needStack = hasStacktraceSupport && config.stacktrace.levels.some(function (level) {
378 |           return level === methodName;
379 |         });
380 |         var levelVal = loglevel.levels[methodName.toUpperCase()];
381 |         var needLog = levelVal >= loglevel.levels[config.level.toUpperCase()];
382 | 
383 |         return function () {
384 |           for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
385 |             args[_key] = arguments[_key];
386 |           }
387 | 
388 |           if (needLog) {
389 |             var timestamp = config.timestamp();
390 | 
391 |             var stacktrace = needStack ? getStacktrace() : '';
392 |             if (stacktrace) {
393 |               var lines = stacktrace.split('\n');
394 |               lines.splice(0, config.stacktrace.excess + 3);
395 |               var depth = config.stacktrace.depth;
396 | 
397 |               if (depth && lines.length !== depth + 1) {
398 |                 var shrink = lines.splice(0, depth);
399 |                 stacktrace = shrink.join('\n');
400 |                 if (lines.length) stacktrace += '\n    and ' + lines.length + ' more';
401 |               } else {
402 |                 stacktrace = lines.join('\n');
403 |               }
404 |             }
405 | 
406 |             var log = config.format({
407 |               message: interpolate(args),
408 |               level: {
409 |                 label: methodName,
410 |                 value: levelVal
411 |               },
412 |               logger: loggerName || '',
413 |               timestamp: timestamp,
414 |               stacktrace: stacktrace
415 |             });
416 | 
417 |             if (isJSON === undefined) {
418 |               isJSON = typeof log !== 'string';
419 |               contentType = isJSON ? 'application/json' : 'text/plain';
420 |             }
421 | 
422 |             var content = '';
423 |             if (isJSON) {
424 |               try {
425 |                 content += JSON.stringify(log);
426 |               } catch (error) {
427 |                 rawMethod.apply(undefined, args);
428 |                 loglevel.getLogger('logger').error(error);
429 |                 return;
430 |               }
431 |             } else {
432 |               content += log;
433 |             }
434 | 
435 |             queue.push(content);
436 |             send();
437 |           }
438 | 
439 |           rawMethod.apply(undefined, args);
440 |         };
441 |       };
442 | 
443 |       logger.methodFactory = pluginFactory;
444 |       logger.setLevel(logger.getLevel());
445 | 
446 |       remote.setToken = function (token) {
447 |         config.token = token;
448 |         send();
449 |       };
450 | 
451 |       return logger;
452 |     },
453 |     disable: function disable() {
454 |       if (!loglevel) {
455 |         throw new Error("You can't disable a not appled plugin");
456 |       }
457 | 
458 |       if (pluginFactory !== loglevel.methodFactory) {
459 |         throw new Error("You can't disable a plugin after appling another plugin");
460 |       }
461 | 
462 |       loglevel.methodFactory = originalFactory;
463 |       loglevel.setLevel(loglevel.getLevel());
464 |       loglevel = undefined;
465 |       remote.setToken = setToken;
466 |     },
467 | 
468 |     setToken: setToken
469 |   };
470 | 
471 |   exports.default = remote;
472 |   module.exports = exports['default'];
473 | });
474 | 
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
   1 | {
   2 |   "name": "loglevel-plugin-remote",
   3 |   "version": "0.6.8",
   4 |   "lockfileVersion": 1,
   5 |   "requires": true,
   6 |   "dependencies": {
   7 |     "@babel/code-frame": {
   8 |       "version": "7.0.0",
   9 |       "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
  10 |       "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
  11 |       "dev": true,
  12 |       "requires": {
  13 |         "@babel/highlight": "^7.0.0"
  14 |       }
  15 |     },
  16 |     "@babel/highlight": {
  17 |       "version": "7.0.0",
  18 |       "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
  19 |       "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
  20 |       "dev": true,
  21 |       "requires": {
  22 |         "chalk": "^2.0.0",
  23 |         "esutils": "^2.0.2",
  24 |         "js-tokens": "^4.0.0"
  25 |       },
  26 |       "dependencies": {
  27 |         "ansi-styles": {
  28 |           "version": "3.2.1",
  29 |           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
  30 |           "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
  31 |           "dev": true,
  32 |           "requires": {
  33 |             "color-convert": "^1.9.0"
  34 |           }
  35 |         },
  36 |         "chalk": {
  37 |           "version": "2.4.1",
  38 |           "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
  39 |           "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
  40 |           "dev": true,
  41 |           "requires": {
  42 |             "ansi-styles": "^3.2.1",
  43 |             "escape-string-regexp": "^1.0.5",
  44 |             "supports-color": "^5.3.0"
  45 |           }
  46 |         },
  47 |         "js-tokens": {
  48 |           "version": "4.0.0",
  49 |           "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
  50 |           "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
  51 |           "dev": true
  52 |         },
  53 |         "supports-color": {
  54 |           "version": "5.5.0",
  55 |           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
  56 |           "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
  57 |           "dev": true,
  58 |           "requires": {
  59 |             "has-flag": "^3.0.0"
  60 |           }
  61 |         }
  62 |       }
  63 |     },
  64 |     "@sinonjs/commons": {
  65 |       "version": "1.0.2",
  66 |       "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.0.2.tgz",
  67 |       "integrity": "sha512-WR3dlgqJP4QNrLC4iXN/5/2WaLQQ0VijOOkmflqFGVJ6wLEpbSjo7c0ZeGIdtY8Crk7xBBp87sM6+Mkerz7alw==",
  68 |       "dev": true,
  69 |       "requires": {
  70 |         "type-detect": "4.0.8"
  71 |       }
  72 |     },
  73 |     "@sinonjs/formatio": {
  74 |       "version": "3.0.0",
  75 |       "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.0.0.tgz",
  76 |       "integrity": "sha512-vdjoYLDptCgvtJs57ULshak3iJe4NW3sJ3g36xVDGff5AE8P30S6A093EIEPjdi2noGhfuNOEkbxt3J3awFW1w==",
  77 |       "dev": true,
  78 |       "requires": {
  79 |         "@sinonjs/samsam": "2.1.0"
  80 |       },
  81 |       "dependencies": {
  82 |         "@sinonjs/samsam": {
  83 |           "version": "2.1.0",
  84 |           "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-2.1.0.tgz",
  85 |           "integrity": "sha512-5x2kFgJYupaF1ns/RmharQ90lQkd2ELS8A9X0ymkAAdemYHGtI2KiUHG8nX2WU0T1qgnOU5YMqnBM2V7NUanNw==",
  86 |           "dev": true,
  87 |           "requires": {
  88 |             "array-from": "^2.1.1"
  89 |           }
  90 |         }
  91 |       }
  92 |     },
  93 |     "@sinonjs/samsam": {
  94 |       "version": "2.1.1",
  95 |       "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-2.1.1.tgz",
  96 |       "integrity": "sha512-7oX6PXMulvdN37h88dvlvRyu61GYZau40fL4wEZvPEHvrjpJc3lDv6xDM5n4Z0StufUVB5nDvVZUM+jZHdMOOQ==",
  97 |       "dev": true,
  98 |       "requires": {
  99 |         "array-from": "^2.1.1"
 100 |       }
 101 |     },
 102 |     "acorn": {
 103 |       "version": "5.7.3",
 104 |       "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
 105 |       "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
 106 |       "dev": true
 107 |     },
 108 |     "acorn-jsx": {
 109 |       "version": "4.1.1",
 110 |       "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz",
 111 |       "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==",
 112 |       "dev": true,
 113 |       "requires": {
 114 |         "acorn": "^5.0.3"
 115 |       }
 116 |     },
 117 |     "ajv": {
 118 |       "version": "6.5.4",
 119 |       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz",
 120 |       "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==",
 121 |       "dev": true,
 122 |       "requires": {
 123 |         "fast-deep-equal": "^2.0.1",
 124 |         "fast-json-stable-stringify": "^2.0.0",
 125 |         "json-schema-traverse": "^0.4.1",
 126 |         "uri-js": "^4.2.2"
 127 |       }
 128 |     },
 129 |     "ajv-keywords": {
 130 |       "version": "3.2.0",
 131 |       "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
 132 |       "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=",
 133 |       "dev": true
 134 |     },
 135 |     "ansi-escapes": {
 136 |       "version": "3.1.0",
 137 |       "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
 138 |       "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
 139 |       "dev": true
 140 |     },
 141 |     "ansi-regex": {
 142 |       "version": "2.1.1",
 143 |       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
 144 |       "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
 145 |       "dev": true
 146 |     },
 147 |     "ansi-styles": {
 148 |       "version": "2.2.1",
 149 |       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
 150 |       "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
 151 |       "dev": true
 152 |     },
 153 |     "anymatch": {
 154 |       "version": "1.3.2",
 155 |       "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
 156 |       "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
 157 |       "dev": true,
 158 |       "optional": true,
 159 |       "requires": {
 160 |         "micromatch": "^2.1.5",
 161 |         "normalize-path": "^2.0.0"
 162 |       }
 163 |     },
 164 |     "argparse": {
 165 |       "version": "1.0.10",
 166 |       "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
 167 |       "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
 168 |       "dev": true,
 169 |       "requires": {
 170 |         "sprintf-js": "~1.0.2"
 171 |       }
 172 |     },
 173 |     "arr-diff": {
 174 |       "version": "2.0.0",
 175 |       "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
 176 |       "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
 177 |       "dev": true,
 178 |       "optional": true,
 179 |       "requires": {
 180 |         "arr-flatten": "^1.0.1"
 181 |       }
 182 |     },
 183 |     "arr-flatten": {
 184 |       "version": "1.1.0",
 185 |       "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
 186 |       "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
 187 |       "dev": true,
 188 |       "optional": true
 189 |     },
 190 |     "array-from": {
 191 |       "version": "2.1.1",
 192 |       "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz",
 193 |       "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=",
 194 |       "dev": true
 195 |     },
 196 |     "array-union": {
 197 |       "version": "1.0.2",
 198 |       "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
 199 |       "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
 200 |       "dev": true,
 201 |       "requires": {
 202 |         "array-uniq": "^1.0.1"
 203 |       }
 204 |     },
 205 |     "array-uniq": {
 206 |       "version": "1.0.3",
 207 |       "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
 208 |       "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
 209 |       "dev": true
 210 |     },
 211 |     "array-unique": {
 212 |       "version": "0.2.1",
 213 |       "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
 214 |       "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
 215 |       "dev": true,
 216 |       "optional": true
 217 |     },
 218 |     "arrify": {
 219 |       "version": "1.0.1",
 220 |       "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
 221 |       "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
 222 |       "dev": true
 223 |     },
 224 |     "assertion-error": {
 225 |       "version": "1.1.0",
 226 |       "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
 227 |       "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
 228 |       "dev": true
 229 |     },
 230 |     "async-each": {
 231 |       "version": "1.0.1",
 232 |       "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
 233 |       "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
 234 |       "dev": true,
 235 |       "optional": true
 236 |     },
 237 |     "babel-cli": {
 238 |       "version": "6.26.0",
 239 |       "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz",
 240 |       "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=",
 241 |       "dev": true,
 242 |       "requires": {
 243 |         "babel-core": "^6.26.0",
 244 |         "babel-polyfill": "^6.26.0",
 245 |         "babel-register": "^6.26.0",
 246 |         "babel-runtime": "^6.26.0",
 247 |         "chokidar": "^1.6.1",
 248 |         "commander": "^2.11.0",
 249 |         "convert-source-map": "^1.5.0",
 250 |         "fs-readdir-recursive": "^1.0.0",
 251 |         "glob": "^7.1.2",
 252 |         "lodash": "^4.17.4",
 253 |         "output-file-sync": "^1.1.2",
 254 |         "path-is-absolute": "^1.0.1",
 255 |         "slash": "^1.0.0",
 256 |         "source-map": "^0.5.6",
 257 |         "v8flags": "^2.1.1"
 258 |       }
 259 |     },
 260 |     "babel-code-frame": {
 261 |       "version": "6.26.0",
 262 |       "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
 263 |       "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
 264 |       "dev": true,
 265 |       "requires": {
 266 |         "chalk": "^1.1.3",
 267 |         "esutils": "^2.0.2",
 268 |         "js-tokens": "^3.0.2"
 269 |       }
 270 |     },
 271 |     "babel-core": {
 272 |       "version": "6.26.3",
 273 |       "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
 274 |       "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
 275 |       "dev": true,
 276 |       "requires": {
 277 |         "babel-code-frame": "^6.26.0",
 278 |         "babel-generator": "^6.26.0",
 279 |         "babel-helpers": "^6.24.1",
 280 |         "babel-messages": "^6.23.0",
 281 |         "babel-register": "^6.26.0",
 282 |         "babel-runtime": "^6.26.0",
 283 |         "babel-template": "^6.26.0",
 284 |         "babel-traverse": "^6.26.0",
 285 |         "babel-types": "^6.26.0",
 286 |         "babylon": "^6.18.0",
 287 |         "convert-source-map": "^1.5.1",
 288 |         "debug": "^2.6.9",
 289 |         "json5": "^0.5.1",
 290 |         "lodash": "^4.17.4",
 291 |         "minimatch": "^3.0.4",
 292 |         "path-is-absolute": "^1.0.1",
 293 |         "private": "^0.1.8",
 294 |         "slash": "^1.0.0",
 295 |         "source-map": "^0.5.7"
 296 |       }
 297 |     },
 298 |     "babel-generator": {
 299 |       "version": "6.26.1",
 300 |       "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
 301 |       "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
 302 |       "dev": true,
 303 |       "requires": {
 304 |         "babel-messages": "^6.23.0",
 305 |         "babel-runtime": "^6.26.0",
 306 |         "babel-types": "^6.26.0",
 307 |         "detect-indent": "^4.0.0",
 308 |         "jsesc": "^1.3.0",
 309 |         "lodash": "^4.17.4",
 310 |         "source-map": "^0.5.7",
 311 |         "trim-right": "^1.0.1"
 312 |       }
 313 |     },
 314 |     "babel-helper-builder-binary-assignment-operator-visitor": {
 315 |       "version": "6.24.1",
 316 |       "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
 317 |       "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
 318 |       "dev": true,
 319 |       "requires": {
 320 |         "babel-helper-explode-assignable-expression": "^6.24.1",
 321 |         "babel-runtime": "^6.22.0",
 322 |         "babel-types": "^6.24.1"
 323 |       }
 324 |     },
 325 |     "babel-helper-call-delegate": {
 326 |       "version": "6.24.1",
 327 |       "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
 328 |       "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
 329 |       "dev": true,
 330 |       "requires": {
 331 |         "babel-helper-hoist-variables": "^6.24.1",
 332 |         "babel-runtime": "^6.22.0",
 333 |         "babel-traverse": "^6.24.1",
 334 |         "babel-types": "^6.24.1"
 335 |       }
 336 |     },
 337 |     "babel-helper-define-map": {
 338 |       "version": "6.26.0",
 339 |       "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
 340 |       "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
 341 |       "dev": true,
 342 |       "requires": {
 343 |         "babel-helper-function-name": "^6.24.1",
 344 |         "babel-runtime": "^6.26.0",
 345 |         "babel-types": "^6.26.0",
 346 |         "lodash": "^4.17.4"
 347 |       }
 348 |     },
 349 |     "babel-helper-explode-assignable-expression": {
 350 |       "version": "6.24.1",
 351 |       "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
 352 |       "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
 353 |       "dev": true,
 354 |       "requires": {
 355 |         "babel-runtime": "^6.22.0",
 356 |         "babel-traverse": "^6.24.1",
 357 |         "babel-types": "^6.24.1"
 358 |       }
 359 |     },
 360 |     "babel-helper-function-name": {
 361 |       "version": "6.24.1",
 362 |       "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
 363 |       "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
 364 |       "dev": true,
 365 |       "requires": {
 366 |         "babel-helper-get-function-arity": "^6.24.1",
 367 |         "babel-runtime": "^6.22.0",
 368 |         "babel-template": "^6.24.1",
 369 |         "babel-traverse": "^6.24.1",
 370 |         "babel-types": "^6.24.1"
 371 |       }
 372 |     },
 373 |     "babel-helper-get-function-arity": {
 374 |       "version": "6.24.1",
 375 |       "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
 376 |       "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
 377 |       "dev": true,
 378 |       "requires": {
 379 |         "babel-runtime": "^6.22.0",
 380 |         "babel-types": "^6.24.1"
 381 |       }
 382 |     },
 383 |     "babel-helper-hoist-variables": {
 384 |       "version": "6.24.1",
 385 |       "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
 386 |       "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
 387 |       "dev": true,
 388 |       "requires": {
 389 |         "babel-runtime": "^6.22.0",
 390 |         "babel-types": "^6.24.1"
 391 |       }
 392 |     },
 393 |     "babel-helper-optimise-call-expression": {
 394 |       "version": "6.24.1",
 395 |       "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
 396 |       "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
 397 |       "dev": true,
 398 |       "requires": {
 399 |         "babel-runtime": "^6.22.0",
 400 |         "babel-types": "^6.24.1"
 401 |       }
 402 |     },
 403 |     "babel-helper-regex": {
 404 |       "version": "6.26.0",
 405 |       "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
 406 |       "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
 407 |       "dev": true,
 408 |       "requires": {
 409 |         "babel-runtime": "^6.26.0",
 410 |         "babel-types": "^6.26.0",
 411 |         "lodash": "^4.17.4"
 412 |       }
 413 |     },
 414 |     "babel-helper-remap-async-to-generator": {
 415 |       "version": "6.24.1",
 416 |       "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
 417 |       "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
 418 |       "dev": true,
 419 |       "requires": {
 420 |         "babel-helper-function-name": "^6.24.1",
 421 |         "babel-runtime": "^6.22.0",
 422 |         "babel-template": "^6.24.1",
 423 |         "babel-traverse": "^6.24.1",
 424 |         "babel-types": "^6.24.1"
 425 |       }
 426 |     },
 427 |     "babel-helper-replace-supers": {
 428 |       "version": "6.24.1",
 429 |       "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
 430 |       "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
 431 |       "dev": true,
 432 |       "requires": {
 433 |         "babel-helper-optimise-call-expression": "^6.24.1",
 434 |         "babel-messages": "^6.23.0",
 435 |         "babel-runtime": "^6.22.0",
 436 |         "babel-template": "^6.24.1",
 437 |         "babel-traverse": "^6.24.1",
 438 |         "babel-types": "^6.24.1"
 439 |       }
 440 |     },
 441 |     "babel-helpers": {
 442 |       "version": "6.24.1",
 443 |       "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
 444 |       "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
 445 |       "dev": true,
 446 |       "requires": {
 447 |         "babel-runtime": "^6.22.0",
 448 |         "babel-template": "^6.24.1"
 449 |       }
 450 |     },
 451 |     "babel-messages": {
 452 |       "version": "6.23.0",
 453 |       "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
 454 |       "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
 455 |       "dev": true,
 456 |       "requires": {
 457 |         "babel-runtime": "^6.22.0"
 458 |       }
 459 |     },
 460 |     "babel-plugin-add-module-exports": {
 461 |       "version": "0.2.1",
 462 |       "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz",
 463 |       "integrity": "sha1-mumh9KjcZ/DN7E9K7aHkOl/2XiU=",
 464 |       "dev": true
 465 |     },
 466 |     "babel-plugin-check-es2015-constants": {
 467 |       "version": "6.22.0",
 468 |       "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
 469 |       "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
 470 |       "dev": true,
 471 |       "requires": {
 472 |         "babel-runtime": "^6.22.0"
 473 |       }
 474 |     },
 475 |     "babel-plugin-syntax-async-functions": {
 476 |       "version": "6.13.0",
 477 |       "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
 478 |       "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
 479 |       "dev": true
 480 |     },
 481 |     "babel-plugin-syntax-exponentiation-operator": {
 482 |       "version": "6.13.0",
 483 |       "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
 484 |       "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
 485 |       "dev": true
 486 |     },
 487 |     "babel-plugin-syntax-trailing-function-commas": {
 488 |       "version": "6.22.0",
 489 |       "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
 490 |       "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
 491 |       "dev": true
 492 |     },
 493 |     "babel-plugin-transform-async-to-generator": {
 494 |       "version": "6.24.1",
 495 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
 496 |       "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
 497 |       "dev": true,
 498 |       "requires": {
 499 |         "babel-helper-remap-async-to-generator": "^6.24.1",
 500 |         "babel-plugin-syntax-async-functions": "^6.8.0",
 501 |         "babel-runtime": "^6.22.0"
 502 |       }
 503 |     },
 504 |     "babel-plugin-transform-es2015-arrow-functions": {
 505 |       "version": "6.22.0",
 506 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
 507 |       "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
 508 |       "dev": true,
 509 |       "requires": {
 510 |         "babel-runtime": "^6.22.0"
 511 |       }
 512 |     },
 513 |     "babel-plugin-transform-es2015-block-scoped-functions": {
 514 |       "version": "6.22.0",
 515 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
 516 |       "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
 517 |       "dev": true,
 518 |       "requires": {
 519 |         "babel-runtime": "^6.22.0"
 520 |       }
 521 |     },
 522 |     "babel-plugin-transform-es2015-block-scoping": {
 523 |       "version": "6.26.0",
 524 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
 525 |       "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
 526 |       "dev": true,
 527 |       "requires": {
 528 |         "babel-runtime": "^6.26.0",
 529 |         "babel-template": "^6.26.0",
 530 |         "babel-traverse": "^6.26.0",
 531 |         "babel-types": "^6.26.0",
 532 |         "lodash": "^4.17.4"
 533 |       }
 534 |     },
 535 |     "babel-plugin-transform-es2015-classes": {
 536 |       "version": "6.24.1",
 537 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
 538 |       "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
 539 |       "dev": true,
 540 |       "requires": {
 541 |         "babel-helper-define-map": "^6.24.1",
 542 |         "babel-helper-function-name": "^6.24.1",
 543 |         "babel-helper-optimise-call-expression": "^6.24.1",
 544 |         "babel-helper-replace-supers": "^6.24.1",
 545 |         "babel-messages": "^6.23.0",
 546 |         "babel-runtime": "^6.22.0",
 547 |         "babel-template": "^6.24.1",
 548 |         "babel-traverse": "^6.24.1",
 549 |         "babel-types": "^6.24.1"
 550 |       }
 551 |     },
 552 |     "babel-plugin-transform-es2015-computed-properties": {
 553 |       "version": "6.24.1",
 554 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
 555 |       "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
 556 |       "dev": true,
 557 |       "requires": {
 558 |         "babel-runtime": "^6.22.0",
 559 |         "babel-template": "^6.24.1"
 560 |       }
 561 |     },
 562 |     "babel-plugin-transform-es2015-destructuring": {
 563 |       "version": "6.23.0",
 564 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
 565 |       "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
 566 |       "dev": true,
 567 |       "requires": {
 568 |         "babel-runtime": "^6.22.0"
 569 |       }
 570 |     },
 571 |     "babel-plugin-transform-es2015-duplicate-keys": {
 572 |       "version": "6.24.1",
 573 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
 574 |       "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
 575 |       "dev": true,
 576 |       "requires": {
 577 |         "babel-runtime": "^6.22.0",
 578 |         "babel-types": "^6.24.1"
 579 |       }
 580 |     },
 581 |     "babel-plugin-transform-es2015-for-of": {
 582 |       "version": "6.23.0",
 583 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
 584 |       "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
 585 |       "dev": true,
 586 |       "requires": {
 587 |         "babel-runtime": "^6.22.0"
 588 |       }
 589 |     },
 590 |     "babel-plugin-transform-es2015-function-name": {
 591 |       "version": "6.24.1",
 592 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
 593 |       "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
 594 |       "dev": true,
 595 |       "requires": {
 596 |         "babel-helper-function-name": "^6.24.1",
 597 |         "babel-runtime": "^6.22.0",
 598 |         "babel-types": "^6.24.1"
 599 |       }
 600 |     },
 601 |     "babel-plugin-transform-es2015-literals": {
 602 |       "version": "6.22.0",
 603 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
 604 |       "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
 605 |       "dev": true,
 606 |       "requires": {
 607 |         "babel-runtime": "^6.22.0"
 608 |       }
 609 |     },
 610 |     "babel-plugin-transform-es2015-modules-amd": {
 611 |       "version": "6.24.1",
 612 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
 613 |       "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
 614 |       "dev": true,
 615 |       "requires": {
 616 |         "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
 617 |         "babel-runtime": "^6.22.0",
 618 |         "babel-template": "^6.24.1"
 619 |       }
 620 |     },
 621 |     "babel-plugin-transform-es2015-modules-commonjs": {
 622 |       "version": "6.26.2",
 623 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
 624 |       "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
 625 |       "dev": true,
 626 |       "requires": {
 627 |         "babel-plugin-transform-strict-mode": "^6.24.1",
 628 |         "babel-runtime": "^6.26.0",
 629 |         "babel-template": "^6.26.0",
 630 |         "babel-types": "^6.26.0"
 631 |       }
 632 |     },
 633 |     "babel-plugin-transform-es2015-modules-systemjs": {
 634 |       "version": "6.24.1",
 635 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
 636 |       "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
 637 |       "dev": true,
 638 |       "requires": {
 639 |         "babel-helper-hoist-variables": "^6.24.1",
 640 |         "babel-runtime": "^6.22.0",
 641 |         "babel-template": "^6.24.1"
 642 |       }
 643 |     },
 644 |     "babel-plugin-transform-es2015-modules-umd": {
 645 |       "version": "6.24.1",
 646 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
 647 |       "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
 648 |       "dev": true,
 649 |       "requires": {
 650 |         "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
 651 |         "babel-runtime": "^6.22.0",
 652 |         "babel-template": "^6.24.1"
 653 |       }
 654 |     },
 655 |     "babel-plugin-transform-es2015-object-super": {
 656 |       "version": "6.24.1",
 657 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
 658 |       "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
 659 |       "dev": true,
 660 |       "requires": {
 661 |         "babel-helper-replace-supers": "^6.24.1",
 662 |         "babel-runtime": "^6.22.0"
 663 |       }
 664 |     },
 665 |     "babel-plugin-transform-es2015-parameters": {
 666 |       "version": "6.24.1",
 667 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
 668 |       "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
 669 |       "dev": true,
 670 |       "requires": {
 671 |         "babel-helper-call-delegate": "^6.24.1",
 672 |         "babel-helper-get-function-arity": "^6.24.1",
 673 |         "babel-runtime": "^6.22.0",
 674 |         "babel-template": "^6.24.1",
 675 |         "babel-traverse": "^6.24.1",
 676 |         "babel-types": "^6.24.1"
 677 |       }
 678 |     },
 679 |     "babel-plugin-transform-es2015-shorthand-properties": {
 680 |       "version": "6.24.1",
 681 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
 682 |       "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
 683 |       "dev": true,
 684 |       "requires": {
 685 |         "babel-runtime": "^6.22.0",
 686 |         "babel-types": "^6.24.1"
 687 |       }
 688 |     },
 689 |     "babel-plugin-transform-es2015-spread": {
 690 |       "version": "6.22.0",
 691 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
 692 |       "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
 693 |       "dev": true,
 694 |       "requires": {
 695 |         "babel-runtime": "^6.22.0"
 696 |       }
 697 |     },
 698 |     "babel-plugin-transform-es2015-sticky-regex": {
 699 |       "version": "6.24.1",
 700 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
 701 |       "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
 702 |       "dev": true,
 703 |       "requires": {
 704 |         "babel-helper-regex": "^6.24.1",
 705 |         "babel-runtime": "^6.22.0",
 706 |         "babel-types": "^6.24.1"
 707 |       }
 708 |     },
 709 |     "babel-plugin-transform-es2015-template-literals": {
 710 |       "version": "6.22.0",
 711 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
 712 |       "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
 713 |       "dev": true,
 714 |       "requires": {
 715 |         "babel-runtime": "^6.22.0"
 716 |       }
 717 |     },
 718 |     "babel-plugin-transform-es2015-typeof-symbol": {
 719 |       "version": "6.23.0",
 720 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
 721 |       "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
 722 |       "dev": true,
 723 |       "requires": {
 724 |         "babel-runtime": "^6.22.0"
 725 |       }
 726 |     },
 727 |     "babel-plugin-transform-es2015-unicode-regex": {
 728 |       "version": "6.24.1",
 729 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
 730 |       "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
 731 |       "dev": true,
 732 |       "requires": {
 733 |         "babel-helper-regex": "^6.24.1",
 734 |         "babel-runtime": "^6.22.0",
 735 |         "regexpu-core": "^2.0.0"
 736 |       }
 737 |     },
 738 |     "babel-plugin-transform-exponentiation-operator": {
 739 |       "version": "6.24.1",
 740 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
 741 |       "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
 742 |       "dev": true,
 743 |       "requires": {
 744 |         "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
 745 |         "babel-plugin-syntax-exponentiation-operator": "^6.8.0",
 746 |         "babel-runtime": "^6.22.0"
 747 |       }
 748 |     },
 749 |     "babel-plugin-transform-regenerator": {
 750 |       "version": "6.26.0",
 751 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
 752 |       "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
 753 |       "dev": true,
 754 |       "requires": {
 755 |         "regenerator-transform": "^0.10.0"
 756 |       }
 757 |     },
 758 |     "babel-plugin-transform-strict-mode": {
 759 |       "version": "6.24.1",
 760 |       "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
 761 |       "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
 762 |       "dev": true,
 763 |       "requires": {
 764 |         "babel-runtime": "^6.22.0",
 765 |         "babel-types": "^6.24.1"
 766 |       }
 767 |     },
 768 |     "babel-polyfill": {
 769 |       "version": "6.26.0",
 770 |       "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
 771 |       "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
 772 |       "dev": true,
 773 |       "requires": {
 774 |         "babel-runtime": "^6.26.0",
 775 |         "core-js": "^2.5.0",
 776 |         "regenerator-runtime": "^0.10.5"
 777 |       },
 778 |       "dependencies": {
 779 |         "regenerator-runtime": {
 780 |           "version": "0.10.5",
 781 |           "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
 782 |           "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
 783 |           "dev": true
 784 |         }
 785 |       }
 786 |     },
 787 |     "babel-preset-env": {
 788 |       "version": "1.7.0",
 789 |       "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz",
 790 |       "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==",
 791 |       "dev": true,
 792 |       "requires": {
 793 |         "babel-plugin-check-es2015-constants": "^6.22.0",
 794 |         "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
 795 |         "babel-plugin-transform-async-to-generator": "^6.22.0",
 796 |         "babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
 797 |         "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
 798 |         "babel-plugin-transform-es2015-block-scoping": "^6.23.0",
 799 |         "babel-plugin-transform-es2015-classes": "^6.23.0",
 800 |         "babel-plugin-transform-es2015-computed-properties": "^6.22.0",
 801 |         "babel-plugin-transform-es2015-destructuring": "^6.23.0",
 802 |         "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0",
 803 |         "babel-plugin-transform-es2015-for-of": "^6.23.0",
 804 |         "babel-plugin-transform-es2015-function-name": "^6.22.0",
 805 |         "babel-plugin-transform-es2015-literals": "^6.22.0",
 806 |         "babel-plugin-transform-es2015-modules-amd": "^6.22.0",
 807 |         "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0",
 808 |         "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0",
 809 |         "babel-plugin-transform-es2015-modules-umd": "^6.23.0",
 810 |         "babel-plugin-transform-es2015-object-super": "^6.22.0",
 811 |         "babel-plugin-transform-es2015-parameters": "^6.23.0",
 812 |         "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0",
 813 |         "babel-plugin-transform-es2015-spread": "^6.22.0",
 814 |         "babel-plugin-transform-es2015-sticky-regex": "^6.22.0",
 815 |         "babel-plugin-transform-es2015-template-literals": "^6.22.0",
 816 |         "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0",
 817 |         "babel-plugin-transform-es2015-unicode-regex": "^6.22.0",
 818 |         "babel-plugin-transform-exponentiation-operator": "^6.22.0",
 819 |         "babel-plugin-transform-regenerator": "^6.22.0",
 820 |         "browserslist": "^3.2.6",
 821 |         "invariant": "^2.2.2",
 822 |         "semver": "^5.3.0"
 823 |       }
 824 |     },
 825 |     "babel-register": {
 826 |       "version": "6.26.0",
 827 |       "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
 828 |       "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
 829 |       "dev": true,
 830 |       "requires": {
 831 |         "babel-core": "^6.26.0",
 832 |         "babel-runtime": "^6.26.0",
 833 |         "core-js": "^2.5.0",
 834 |         "home-or-tmp": "^2.0.0",
 835 |         "lodash": "^4.17.4",
 836 |         "mkdirp": "^0.5.1",
 837 |         "source-map-support": "^0.4.15"
 838 |       }
 839 |     },
 840 |     "babel-runtime": {
 841 |       "version": "6.26.0",
 842 |       "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
 843 |       "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
 844 |       "dev": true,
 845 |       "requires": {
 846 |         "core-js": "^2.4.0",
 847 |         "regenerator-runtime": "^0.11.0"
 848 |       }
 849 |     },
 850 |     "babel-template": {
 851 |       "version": "6.26.0",
 852 |       "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
 853 |       "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
 854 |       "dev": true,
 855 |       "requires": {
 856 |         "babel-runtime": "^6.26.0",
 857 |         "babel-traverse": "^6.26.0",
 858 |         "babel-types": "^6.26.0",
 859 |         "babylon": "^6.18.0",
 860 |         "lodash": "^4.17.4"
 861 |       }
 862 |     },
 863 |     "babel-traverse": {
 864 |       "version": "6.26.0",
 865 |       "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
 866 |       "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
 867 |       "dev": true,
 868 |       "requires": {
 869 |         "babel-code-frame": "^6.26.0",
 870 |         "babel-messages": "^6.23.0",
 871 |         "babel-runtime": "^6.26.0",
 872 |         "babel-types": "^6.26.0",
 873 |         "babylon": "^6.18.0",
 874 |         "debug": "^2.6.8",
 875 |         "globals": "^9.18.0",
 876 |         "invariant": "^2.2.2",
 877 |         "lodash": "^4.17.4"
 878 |       }
 879 |     },
 880 |     "babel-types": {
 881 |       "version": "6.26.0",
 882 |       "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
 883 |       "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
 884 |       "dev": true,
 885 |       "requires": {
 886 |         "babel-runtime": "^6.26.0",
 887 |         "esutils": "^2.0.2",
 888 |         "lodash": "^4.17.4",
 889 |         "to-fast-properties": "^1.0.3"
 890 |       }
 891 |     },
 892 |     "babylon": {
 893 |       "version": "6.18.0",
 894 |       "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
 895 |       "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
 896 |       "dev": true
 897 |     },
 898 |     "balanced-match": {
 899 |       "version": "1.0.0",
 900 |       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
 901 |       "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
 902 |       "dev": true
 903 |     },
 904 |     "binary-extensions": {
 905 |       "version": "1.11.0",
 906 |       "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
 907 |       "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
 908 |       "dev": true,
 909 |       "optional": true
 910 |     },
 911 |     "brace-expansion": {
 912 |       "version": "1.1.11",
 913 |       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
 914 |       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
 915 |       "dev": true,
 916 |       "requires": {
 917 |         "balanced-match": "^1.0.0",
 918 |         "concat-map": "0.0.1"
 919 |       }
 920 |     },
 921 |     "braces": {
 922 |       "version": "1.8.5",
 923 |       "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
 924 |       "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
 925 |       "dev": true,
 926 |       "optional": true,
 927 |       "requires": {
 928 |         "expand-range": "^1.8.1",
 929 |         "preserve": "^0.2.0",
 930 |         "repeat-element": "^1.1.2"
 931 |       }
 932 |     },
 933 |     "browser-stdout": {
 934 |       "version": "1.3.1",
 935 |       "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
 936 |       "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
 937 |       "dev": true
 938 |     },
 939 |     "browserslist": {
 940 |       "version": "3.2.8",
 941 |       "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz",
 942 |       "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==",
 943 |       "dev": true,
 944 |       "requires": {
 945 |         "caniuse-lite": "^1.0.30000844",
 946 |         "electron-to-chromium": "^1.3.47"
 947 |       }
 948 |     },
 949 |     "builtin-modules": {
 950 |       "version": "1.1.1",
 951 |       "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
 952 |       "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
 953 |       "dev": true
 954 |     },
 955 |     "caller-path": {
 956 |       "version": "0.1.0",
 957 |       "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
 958 |       "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
 959 |       "dev": true,
 960 |       "requires": {
 961 |         "callsites": "^0.2.0"
 962 |       }
 963 |     },
 964 |     "callsites": {
 965 |       "version": "0.2.0",
 966 |       "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
 967 |       "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
 968 |       "dev": true
 969 |     },
 970 |     "caniuse-lite": {
 971 |       "version": "1.0.30000874",
 972 |       "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000874.tgz",
 973 |       "integrity": "sha512-29nr1EPiHwrJTAHHsEmTt2h+55L8j2GNFdAcYPlRy2NX6iFz7ZZiepVI7kP/QqlnHLq3KvfWpbmGa0d063U09w==",
 974 |       "dev": true
 975 |     },
 976 |     "chai": {
 977 |       "version": "4.2.0",
 978 |       "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
 979 |       "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
 980 |       "dev": true,
 981 |       "requires": {
 982 |         "assertion-error": "^1.1.0",
 983 |         "check-error": "^1.0.2",
 984 |         "deep-eql": "^3.0.1",
 985 |         "get-func-name": "^2.0.0",
 986 |         "pathval": "^1.1.0",
 987 |         "type-detect": "^4.0.5"
 988 |       }
 989 |     },
 990 |     "chalk": {
 991 |       "version": "1.1.3",
 992 |       "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
 993 |       "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
 994 |       "dev": true,
 995 |       "requires": {
 996 |         "ansi-styles": "^2.2.1",
 997 |         "escape-string-regexp": "^1.0.2",
 998 |         "has-ansi": "^2.0.0",
 999 |         "strip-ansi": "^3.0.0",
1000 |         "supports-color": "^2.0.0"
1001 |       }
1002 |     },
1003 |     "chardet": {
1004 |       "version": "0.7.0",
1005 |       "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
1006 |       "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
1007 |       "dev": true
1008 |     },
1009 |     "check-error": {
1010 |       "version": "1.0.2",
1011 |       "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
1012 |       "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
1013 |       "dev": true
1014 |     },
1015 |     "chokidar": {
1016 |       "version": "1.7.0",
1017 |       "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
1018 |       "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
1019 |       "dev": true,
1020 |       "optional": true,
1021 |       "requires": {
1022 |         "anymatch": "^1.3.0",
1023 |         "async-each": "^1.0.0",
1024 |         "fsevents": "^1.0.0",
1025 |         "glob-parent": "^2.0.0",
1026 |         "inherits": "^2.0.1",
1027 |         "is-binary-path": "^1.0.0",
1028 |         "is-glob": "^2.0.0",
1029 |         "path-is-absolute": "^1.0.0",
1030 |         "readdirp": "^2.0.0"
1031 |       }
1032 |     },
1033 |     "circular-json": {
1034 |       "version": "0.3.3",
1035 |       "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
1036 |       "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
1037 |       "dev": true
1038 |     },
1039 |     "cli-cursor": {
1040 |       "version": "2.1.0",
1041 |       "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
1042 |       "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
1043 |       "dev": true,
1044 |       "requires": {
1045 |         "restore-cursor": "^2.0.0"
1046 |       }
1047 |     },
1048 |     "cli-width": {
1049 |       "version": "2.2.0",
1050 |       "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
1051 |       "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
1052 |       "dev": true
1053 |     },
1054 |     "color-convert": {
1055 |       "version": "1.9.3",
1056 |       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
1057 |       "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
1058 |       "dev": true,
1059 |       "requires": {
1060 |         "color-name": "1.1.3"
1061 |       }
1062 |     },
1063 |     "color-name": {
1064 |       "version": "1.1.3",
1065 |       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
1066 |       "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
1067 |       "dev": true
1068 |     },
1069 |     "commander": {
1070 |       "version": "2.17.1",
1071 |       "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
1072 |       "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
1073 |       "dev": true
1074 |     },
1075 |     "concat-map": {
1076 |       "version": "0.0.1",
1077 |       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
1078 |       "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
1079 |       "dev": true
1080 |     },
1081 |     "contains-path": {
1082 |       "version": "0.1.0",
1083 |       "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
1084 |       "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
1085 |       "dev": true
1086 |     },
1087 |     "convert-source-map": {
1088 |       "version": "1.5.1",
1089 |       "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
1090 |       "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
1091 |       "dev": true
1092 |     },
1093 |     "core-js": {
1094 |       "version": "2.5.7",
1095 |       "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
1096 |       "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==",
1097 |       "dev": true
1098 |     },
1099 |     "core-util-is": {
1100 |       "version": "1.0.2",
1101 |       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
1102 |       "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
1103 |       "dev": true,
1104 |       "optional": true
1105 |     },
1106 |     "cross-spawn": {
1107 |       "version": "6.0.5",
1108 |       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
1109 |       "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
1110 |       "dev": true,
1111 |       "requires": {
1112 |         "nice-try": "^1.0.4",
1113 |         "path-key": "^2.0.1",
1114 |         "semver": "^5.5.0",
1115 |         "shebang-command": "^1.2.0",
1116 |         "which": "^1.2.9"
1117 |       }
1118 |     },
1119 |     "debug": {
1120 |       "version": "2.6.9",
1121 |       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1122 |       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1123 |       "dev": true,
1124 |       "requires": {
1125 |         "ms": "2.0.0"
1126 |       }
1127 |     },
1128 |     "deep-eql": {
1129 |       "version": "3.0.1",
1130 |       "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
1131 |       "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
1132 |       "dev": true,
1133 |       "requires": {
1134 |         "type-detect": "^4.0.0"
1135 |       }
1136 |     },
1137 |     "deep-is": {
1138 |       "version": "0.1.3",
1139 |       "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
1140 |       "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
1141 |       "dev": true
1142 |     },
1143 |     "define-properties": {
1144 |       "version": "1.1.3",
1145 |       "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
1146 |       "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
1147 |       "dev": true,
1148 |       "requires": {
1149 |         "object-keys": "^1.0.12"
1150 |       }
1151 |     },
1152 |     "del": {
1153 |       "version": "2.2.2",
1154 |       "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
1155 |       "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
1156 |       "dev": true,
1157 |       "requires": {
1158 |         "globby": "^5.0.0",
1159 |         "is-path-cwd": "^1.0.0",
1160 |         "is-path-in-cwd": "^1.0.0",
1161 |         "object-assign": "^4.0.1",
1162 |         "pify": "^2.0.0",
1163 |         "pinkie-promise": "^2.0.0",
1164 |         "rimraf": "^2.2.8"
1165 |       }
1166 |     },
1167 |     "detect-indent": {
1168 |       "version": "4.0.0",
1169 |       "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
1170 |       "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
1171 |       "dev": true,
1172 |       "requires": {
1173 |         "repeating": "^2.0.0"
1174 |       }
1175 |     },
1176 |     "diff": {
1177 |       "version": "3.5.0",
1178 |       "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
1179 |       "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
1180 |       "dev": true
1181 |     },
1182 |     "doctrine": {
1183 |       "version": "2.1.0",
1184 |       "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
1185 |       "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
1186 |       "dev": true,
1187 |       "requires": {
1188 |         "esutils": "^2.0.2"
1189 |       }
1190 |     },
1191 |     "electron-to-chromium": {
1192 |       "version": "1.3.57",
1193 |       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.57.tgz",
1194 |       "integrity": "sha512-YYpZlr6mzR8cK5VRmTZydEt5Mp+WMg1/syrO40PoQzl76vJ+oQchL2d3FmEcWzw3FYqJVYJP/kYYSzTa7FLXwg==",
1195 |       "dev": true
1196 |     },
1197 |     "error-ex": {
1198 |       "version": "1.3.2",
1199 |       "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
1200 |       "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
1201 |       "dev": true,
1202 |       "requires": {
1203 |         "is-arrayish": "^0.2.1"
1204 |       }
1205 |     },
1206 |     "es-abstract": {
1207 |       "version": "1.12.0",
1208 |       "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz",
1209 |       "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==",
1210 |       "dev": true,
1211 |       "requires": {
1212 |         "es-to-primitive": "^1.1.1",
1213 |         "function-bind": "^1.1.1",
1214 |         "has": "^1.0.1",
1215 |         "is-callable": "^1.1.3",
1216 |         "is-regex": "^1.0.4"
1217 |       }
1218 |     },
1219 |     "es-to-primitive": {
1220 |       "version": "1.2.0",
1221 |       "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
1222 |       "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
1223 |       "dev": true,
1224 |       "requires": {
1225 |         "is-callable": "^1.1.4",
1226 |         "is-date-object": "^1.0.1",
1227 |         "is-symbol": "^1.0.2"
1228 |       }
1229 |     },
1230 |     "escape-string-regexp": {
1231 |       "version": "1.0.5",
1232 |       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
1233 |       "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
1234 |       "dev": true
1235 |     },
1236 |     "eslint": {
1237 |       "version": "5.6.0",
1238 |       "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.6.0.tgz",
1239 |       "integrity": "sha512-/eVYs9VVVboX286mBK7bbKnO1yamUy2UCRjiY6MryhQL2PaaXCExsCQ2aO83OeYRhU2eCU/FMFP+tVMoOrzNrA==",
1240 |       "dev": true,
1241 |       "requires": {
1242 |         "@babel/code-frame": "^7.0.0",
1243 |         "ajv": "^6.5.3",
1244 |         "chalk": "^2.1.0",
1245 |         "cross-spawn": "^6.0.5",
1246 |         "debug": "^3.1.0",
1247 |         "doctrine": "^2.1.0",
1248 |         "eslint-scope": "^4.0.0",
1249 |         "eslint-utils": "^1.3.1",
1250 |         "eslint-visitor-keys": "^1.0.0",
1251 |         "espree": "^4.0.0",
1252 |         "esquery": "^1.0.1",
1253 |         "esutils": "^2.0.2",
1254 |         "file-entry-cache": "^2.0.0",
1255 |         "functional-red-black-tree": "^1.0.1",
1256 |         "glob": "^7.1.2",
1257 |         "globals": "^11.7.0",
1258 |         "ignore": "^4.0.6",
1259 |         "imurmurhash": "^0.1.4",
1260 |         "inquirer": "^6.1.0",
1261 |         "is-resolvable": "^1.1.0",
1262 |         "js-yaml": "^3.12.0",
1263 |         "json-stable-stringify-without-jsonify": "^1.0.1",
1264 |         "levn": "^0.3.0",
1265 |         "lodash": "^4.17.5",
1266 |         "minimatch": "^3.0.4",
1267 |         "mkdirp": "^0.5.1",
1268 |         "natural-compare": "^1.4.0",
1269 |         "optionator": "^0.8.2",
1270 |         "path-is-inside": "^1.0.2",
1271 |         "pluralize": "^7.0.0",
1272 |         "progress": "^2.0.0",
1273 |         "regexpp": "^2.0.0",
1274 |         "require-uncached": "^1.0.3",
1275 |         "semver": "^5.5.1",
1276 |         "strip-ansi": "^4.0.0",
1277 |         "strip-json-comments": "^2.0.1",
1278 |         "table": "^4.0.3",
1279 |         "text-table": "^0.2.0"
1280 |       },
1281 |       "dependencies": {
1282 |         "ansi-regex": {
1283 |           "version": "3.0.0",
1284 |           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
1285 |           "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
1286 |           "dev": true
1287 |         },
1288 |         "ansi-styles": {
1289 |           "version": "3.2.1",
1290 |           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
1291 |           "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
1292 |           "dev": true,
1293 |           "requires": {
1294 |             "color-convert": "^1.9.0"
1295 |           }
1296 |         },
1297 |         "chalk": {
1298 |           "version": "2.4.1",
1299 |           "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
1300 |           "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
1301 |           "dev": true,
1302 |           "requires": {
1303 |             "ansi-styles": "^3.2.1",
1304 |             "escape-string-regexp": "^1.0.5",
1305 |             "supports-color": "^5.3.0"
1306 |           }
1307 |         },
1308 |         "debug": {
1309 |           "version": "3.2.5",
1310 |           "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz",
1311 |           "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==",
1312 |           "dev": true,
1313 |           "requires": {
1314 |             "ms": "^2.1.1"
1315 |           }
1316 |         },
1317 |         "globals": {
1318 |           "version": "11.7.0",
1319 |           "resolved": "https://registry.npmjs.org/globals/-/globals-11.7.0.tgz",
1320 |           "integrity": "sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg==",
1321 |           "dev": true
1322 |         },
1323 |         "ms": {
1324 |           "version": "2.1.1",
1325 |           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1326 |           "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
1327 |           "dev": true
1328 |         },
1329 |         "semver": {
1330 |           "version": "5.5.1",
1331 |           "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
1332 |           "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
1333 |           "dev": true
1334 |         },
1335 |         "strip-ansi": {
1336 |           "version": "4.0.0",
1337 |           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
1338 |           "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
1339 |           "dev": true,
1340 |           "requires": {
1341 |             "ansi-regex": "^3.0.0"
1342 |           }
1343 |         },
1344 |         "supports-color": {
1345 |           "version": "5.5.0",
1346 |           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1347 |           "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1348 |           "dev": true,
1349 |           "requires": {
1350 |             "has-flag": "^3.0.0"
1351 |           }
1352 |         }
1353 |       }
1354 |     },
1355 |     "eslint-config-airbnb-base": {
1356 |       "version": "13.1.0",
1357 |       "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.1.0.tgz",
1358 |       "integrity": "sha512-XWwQtf3U3zIoKO1BbHh6aUhJZQweOwSt4c2JrPDg9FP3Ltv3+YfEv7jIDB8275tVnO/qOHbfuYg3kzw6Je7uWw==",
1359 |       "dev": true,
1360 |       "requires": {
1361 |         "eslint-restricted-globals": "^0.1.1",
1362 |         "object.assign": "^4.1.0",
1363 |         "object.entries": "^1.0.4"
1364 |       }
1365 |     },
1366 |     "eslint-import-resolver-node": {
1367 |       "version": "0.3.2",
1368 |       "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz",
1369 |       "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==",
1370 |       "dev": true,
1371 |       "requires": {
1372 |         "debug": "^2.6.9",
1373 |         "resolve": "^1.5.0"
1374 |       }
1375 |     },
1376 |     "eslint-module-utils": {
1377 |       "version": "2.2.0",
1378 |       "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz",
1379 |       "integrity": "sha1-snA2LNiLGkitMIl2zn+lTphBF0Y=",
1380 |       "dev": true,
1381 |       "requires": {
1382 |         "debug": "^2.6.8",
1383 |         "pkg-dir": "^1.0.0"
1384 |       }
1385 |     },
1386 |     "eslint-plugin-chai-friendly": {
1387 |       "version": "0.4.1",
1388 |       "resolved": "https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.4.1.tgz",
1389 |       "integrity": "sha512-hkpLN7VVoGGsofZjUhcQ+sufC3FgqMJwD0DvAcRfxY1tVRyQyVsqpaKnToPHJQOrRo0FQ0fSEDwW2gr4rsNdGA==",
1390 |       "dev": true
1391 |     },
1392 |     "eslint-plugin-import": {
1393 |       "version": "2.14.0",
1394 |       "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz",
1395 |       "integrity": "sha512-FpuRtniD/AY6sXByma2Wr0TXvXJ4nA/2/04VPlfpmUDPOpOY264x+ILiwnrk/k4RINgDAyFZByxqPUbSQ5YE7g==",
1396 |       "dev": true,
1397 |       "requires": {
1398 |         "contains-path": "^0.1.0",
1399 |         "debug": "^2.6.8",
1400 |         "doctrine": "1.5.0",
1401 |         "eslint-import-resolver-node": "^0.3.1",
1402 |         "eslint-module-utils": "^2.2.0",
1403 |         "has": "^1.0.1",
1404 |         "lodash": "^4.17.4",
1405 |         "minimatch": "^3.0.3",
1406 |         "read-pkg-up": "^2.0.0",
1407 |         "resolve": "^1.6.0"
1408 |       },
1409 |       "dependencies": {
1410 |         "doctrine": {
1411 |           "version": "1.5.0",
1412 |           "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
1413 |           "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
1414 |           "dev": true,
1415 |           "requires": {
1416 |             "esutils": "^2.0.2",
1417 |             "isarray": "^1.0.0"
1418 |           }
1419 |         }
1420 |       }
1421 |     },
1422 |     "eslint-restricted-globals": {
1423 |       "version": "0.1.1",
1424 |       "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz",
1425 |       "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=",
1426 |       "dev": true
1427 |     },
1428 |     "eslint-scope": {
1429 |       "version": "4.0.0",
1430 |       "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
1431 |       "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
1432 |       "dev": true,
1433 |       "requires": {
1434 |         "esrecurse": "^4.1.0",
1435 |         "estraverse": "^4.1.1"
1436 |       }
1437 |     },
1438 |     "eslint-utils": {
1439 |       "version": "1.3.1",
1440 |       "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz",
1441 |       "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==",
1442 |       "dev": true
1443 |     },
1444 |     "eslint-visitor-keys": {
1445 |       "version": "1.0.0",
1446 |       "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
1447 |       "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
1448 |       "dev": true
1449 |     },
1450 |     "espree": {
1451 |       "version": "4.0.0",
1452 |       "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz",
1453 |       "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==",
1454 |       "dev": true,
1455 |       "requires": {
1456 |         "acorn": "^5.6.0",
1457 |         "acorn-jsx": "^4.1.1"
1458 |       }
1459 |     },
1460 |     "esprima": {
1461 |       "version": "4.0.1",
1462 |       "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
1463 |       "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
1464 |       "dev": true
1465 |     },
1466 |     "esquery": {
1467 |       "version": "1.0.1",
1468 |       "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
1469 |       "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
1470 |       "dev": true,
1471 |       "requires": {
1472 |         "estraverse": "^4.0.0"
1473 |       }
1474 |     },
1475 |     "esrecurse": {
1476 |       "version": "4.2.1",
1477 |       "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
1478 |       "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
1479 |       "dev": true,
1480 |       "requires": {
1481 |         "estraverse": "^4.1.0"
1482 |       }
1483 |     },
1484 |     "estraverse": {
1485 |       "version": "4.2.0",
1486 |       "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
1487 |       "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
1488 |       "dev": true
1489 |     },
1490 |     "esutils": {
1491 |       "version": "2.0.2",
1492 |       "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
1493 |       "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
1494 |       "dev": true
1495 |     },
1496 |     "expand-brackets": {
1497 |       "version": "0.1.5",
1498 |       "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
1499 |       "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
1500 |       "dev": true,
1501 |       "optional": true,
1502 |       "requires": {
1503 |         "is-posix-bracket": "^0.1.0"
1504 |       }
1505 |     },
1506 |     "expand-range": {
1507 |       "version": "1.8.2",
1508 |       "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
1509 |       "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
1510 |       "dev": true,
1511 |       "optional": true,
1512 |       "requires": {
1513 |         "fill-range": "^2.1.0"
1514 |       }
1515 |     },
1516 |     "external-editor": {
1517 |       "version": "3.0.3",
1518 |       "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
1519 |       "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==",
1520 |       "dev": true,
1521 |       "requires": {
1522 |         "chardet": "^0.7.0",
1523 |         "iconv-lite": "^0.4.24",
1524 |         "tmp": "^0.0.33"
1525 |       }
1526 |     },
1527 |     "extglob": {
1528 |       "version": "0.3.2",
1529 |       "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
1530 |       "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
1531 |       "dev": true,
1532 |       "optional": true,
1533 |       "requires": {
1534 |         "is-extglob": "^1.0.0"
1535 |       }
1536 |     },
1537 |     "fast-deep-equal": {
1538 |       "version": "2.0.1",
1539 |       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
1540 |       "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
1541 |       "dev": true
1542 |     },
1543 |     "fast-json-stable-stringify": {
1544 |       "version": "2.0.0",
1545 |       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
1546 |       "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
1547 |       "dev": true
1548 |     },
1549 |     "fast-levenshtein": {
1550 |       "version": "2.0.6",
1551 |       "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
1552 |       "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
1553 |       "dev": true
1554 |     },
1555 |     "figures": {
1556 |       "version": "2.0.0",
1557 |       "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
1558 |       "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
1559 |       "dev": true,
1560 |       "requires": {
1561 |         "escape-string-regexp": "^1.0.5"
1562 |       }
1563 |     },
1564 |     "file-entry-cache": {
1565 |       "version": "2.0.0",
1566 |       "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
1567 |       "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
1568 |       "dev": true,
1569 |       "requires": {
1570 |         "flat-cache": "^1.2.1",
1571 |         "object-assign": "^4.0.1"
1572 |       }
1573 |     },
1574 |     "filename-regex": {
1575 |       "version": "2.0.1",
1576 |       "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
1577 |       "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
1578 |       "dev": true,
1579 |       "optional": true
1580 |     },
1581 |     "fill-range": {
1582 |       "version": "2.2.4",
1583 |       "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
1584 |       "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
1585 |       "dev": true,
1586 |       "optional": true,
1587 |       "requires": {
1588 |         "is-number": "^2.1.0",
1589 |         "isobject": "^2.0.0",
1590 |         "randomatic": "^3.0.0",
1591 |         "repeat-element": "^1.1.2",
1592 |         "repeat-string": "^1.5.2"
1593 |       }
1594 |     },
1595 |     "find-up": {
1596 |       "version": "1.1.2",
1597 |       "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
1598 |       "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
1599 |       "dev": true,
1600 |       "requires": {
1601 |         "path-exists": "^2.0.0",
1602 |         "pinkie-promise": "^2.0.0"
1603 |       }
1604 |     },
1605 |     "flat-cache": {
1606 |       "version": "1.3.0",
1607 |       "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
1608 |       "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
1609 |       "dev": true,
1610 |       "requires": {
1611 |         "circular-json": "^0.3.1",
1612 |         "del": "^2.0.2",
1613 |         "graceful-fs": "^4.1.2",
1614 |         "write": "^0.2.1"
1615 |       }
1616 |     },
1617 |     "for-in": {
1618 |       "version": "1.0.2",
1619 |       "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
1620 |       "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
1621 |       "dev": true,
1622 |       "optional": true
1623 |     },
1624 |     "for-own": {
1625 |       "version": "0.1.5",
1626 |       "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
1627 |       "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
1628 |       "dev": true,
1629 |       "optional": true,
1630 |       "requires": {
1631 |         "for-in": "^1.0.1"
1632 |       }
1633 |     },
1634 |     "fs-readdir-recursive": {
1635 |       "version": "1.1.0",
1636 |       "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
1637 |       "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==",
1638 |       "dev": true
1639 |     },
1640 |     "fs.realpath": {
1641 |       "version": "1.0.0",
1642 |       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1643 |       "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
1644 |       "dev": true
1645 |     },
1646 |     "fsevents": {
1647 |       "version": "1.2.4",
1648 |       "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz",
1649 |       "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
1650 |       "dev": true,
1651 |       "optional": true,
1652 |       "requires": {
1653 |         "nan": "^2.9.2",
1654 |         "node-pre-gyp": "^0.10.0"
1655 |       },
1656 |       "dependencies": {
1657 |         "abbrev": {
1658 |           "version": "1.1.1",
1659 |           "bundled": true,
1660 |           "dev": true,
1661 |           "optional": true
1662 |         },
1663 |         "ansi-regex": {
1664 |           "version": "2.1.1",
1665 |           "bundled": true,
1666 |           "dev": true
1667 |         },
1668 |         "aproba": {
1669 |           "version": "1.2.0",
1670 |           "bundled": true,
1671 |           "dev": true,
1672 |           "optional": true
1673 |         },
1674 |         "are-we-there-yet": {
1675 |           "version": "1.1.4",
1676 |           "bundled": true,
1677 |           "dev": true,
1678 |           "optional": true,
1679 |           "requires": {
1680 |             "delegates": "^1.0.0",
1681 |             "readable-stream": "^2.0.6"
1682 |           }
1683 |         },
1684 |         "balanced-match": {
1685 |           "version": "1.0.0",
1686 |           "bundled": true,
1687 |           "dev": true
1688 |         },
1689 |         "brace-expansion": {
1690 |           "version": "1.1.11",
1691 |           "bundled": true,
1692 |           "dev": true,
1693 |           "requires": {
1694 |             "balanced-match": "^1.0.0",
1695 |             "concat-map": "0.0.1"
1696 |           }
1697 |         },
1698 |         "chownr": {
1699 |           "version": "1.0.1",
1700 |           "bundled": true,
1701 |           "dev": true,
1702 |           "optional": true
1703 |         },
1704 |         "code-point-at": {
1705 |           "version": "1.1.0",
1706 |           "bundled": true,
1707 |           "dev": true
1708 |         },
1709 |         "concat-map": {
1710 |           "version": "0.0.1",
1711 |           "bundled": true,
1712 |           "dev": true
1713 |         },
1714 |         "console-control-strings": {
1715 |           "version": "1.1.0",
1716 |           "bundled": true,
1717 |           "dev": true
1718 |         },
1719 |         "core-util-is": {
1720 |           "version": "1.0.2",
1721 |           "bundled": true,
1722 |           "dev": true,
1723 |           "optional": true
1724 |         },
1725 |         "debug": {
1726 |           "version": "2.6.9",
1727 |           "bundled": true,
1728 |           "dev": true,
1729 |           "optional": true,
1730 |           "requires": {
1731 |             "ms": "2.0.0"
1732 |           }
1733 |         },
1734 |         "deep-extend": {
1735 |           "version": "0.5.1",
1736 |           "bundled": true,
1737 |           "dev": true,
1738 |           "optional": true
1739 |         },
1740 |         "delegates": {
1741 |           "version": "1.0.0",
1742 |           "bundled": true,
1743 |           "dev": true,
1744 |           "optional": true
1745 |         },
1746 |         "detect-libc": {
1747 |           "version": "1.0.3",
1748 |           "bundled": true,
1749 |           "dev": true,
1750 |           "optional": true
1751 |         },
1752 |         "fs-minipass": {
1753 |           "version": "1.2.5",
1754 |           "bundled": true,
1755 |           "dev": true,
1756 |           "optional": true,
1757 |           "requires": {
1758 |             "minipass": "^2.2.1"
1759 |           }
1760 |         },
1761 |         "fs.realpath": {
1762 |           "version": "1.0.0",
1763 |           "bundled": true,
1764 |           "dev": true,
1765 |           "optional": true
1766 |         },
1767 |         "gauge": {
1768 |           "version": "2.7.4",
1769 |           "bundled": true,
1770 |           "dev": true,
1771 |           "optional": true,
1772 |           "requires": {
1773 |             "aproba": "^1.0.3",
1774 |             "console-control-strings": "^1.0.0",
1775 |             "has-unicode": "^2.0.0",
1776 |             "object-assign": "^4.1.0",
1777 |             "signal-exit": "^3.0.0",
1778 |             "string-width": "^1.0.1",
1779 |             "strip-ansi": "^3.0.1",
1780 |             "wide-align": "^1.1.0"
1781 |           }
1782 |         },
1783 |         "glob": {
1784 |           "version": "7.1.2",
1785 |           "bundled": true,
1786 |           "dev": true,
1787 |           "optional": true,
1788 |           "requires": {
1789 |             "fs.realpath": "^1.0.0",
1790 |             "inflight": "^1.0.4",
1791 |             "inherits": "2",
1792 |             "minimatch": "^3.0.4",
1793 |             "once": "^1.3.0",
1794 |             "path-is-absolute": "^1.0.0"
1795 |           }
1796 |         },
1797 |         "has-unicode": {
1798 |           "version": "2.0.1",
1799 |           "bundled": true,
1800 |           "dev": true,
1801 |           "optional": true
1802 |         },
1803 |         "iconv-lite": {
1804 |           "version": "0.4.21",
1805 |           "bundled": true,
1806 |           "dev": true,
1807 |           "optional": true,
1808 |           "requires": {
1809 |             "safer-buffer": "^2.1.0"
1810 |           }
1811 |         },
1812 |         "ignore-walk": {
1813 |           "version": "3.0.1",
1814 |           "bundled": true,
1815 |           "dev": true,
1816 |           "optional": true,
1817 |           "requires": {
1818 |             "minimatch": "^3.0.4"
1819 |           }
1820 |         },
1821 |         "inflight": {
1822 |           "version": "1.0.6",
1823 |           "bundled": true,
1824 |           "dev": true,
1825 |           "optional": true,
1826 |           "requires": {
1827 |             "once": "^1.3.0",
1828 |             "wrappy": "1"
1829 |           }
1830 |         },
1831 |         "inherits": {
1832 |           "version": "2.0.3",
1833 |           "bundled": true,
1834 |           "dev": true
1835 |         },
1836 |         "ini": {
1837 |           "version": "1.3.5",
1838 |           "bundled": true,
1839 |           "dev": true,
1840 |           "optional": true
1841 |         },
1842 |         "is-fullwidth-code-point": {
1843 |           "version": "1.0.0",
1844 |           "bundled": true,
1845 |           "dev": true,
1846 |           "requires": {
1847 |             "number-is-nan": "^1.0.0"
1848 |           }
1849 |         },
1850 |         "isarray": {
1851 |           "version": "1.0.0",
1852 |           "bundled": true,
1853 |           "dev": true,
1854 |           "optional": true
1855 |         },
1856 |         "minimatch": {
1857 |           "version": "3.0.4",
1858 |           "bundled": true,
1859 |           "dev": true,
1860 |           "requires": {
1861 |             "brace-expansion": "^1.1.7"
1862 |           }
1863 |         },
1864 |         "minimist": {
1865 |           "version": "0.0.8",
1866 |           "bundled": true,
1867 |           "dev": true
1868 |         },
1869 |         "minipass": {
1870 |           "version": "2.2.4",
1871 |           "bundled": true,
1872 |           "dev": true,
1873 |           "requires": {
1874 |             "safe-buffer": "^5.1.1",
1875 |             "yallist": "^3.0.0"
1876 |           }
1877 |         },
1878 |         "minizlib": {
1879 |           "version": "1.1.0",
1880 |           "bundled": true,
1881 |           "dev": true,
1882 |           "optional": true,
1883 |           "requires": {
1884 |             "minipass": "^2.2.1"
1885 |           }
1886 |         },
1887 |         "mkdirp": {
1888 |           "version": "0.5.1",
1889 |           "bundled": true,
1890 |           "dev": true,
1891 |           "requires": {
1892 |             "minimist": "0.0.8"
1893 |           }
1894 |         },
1895 |         "ms": {
1896 |           "version": "2.0.0",
1897 |           "bundled": true,
1898 |           "dev": true,
1899 |           "optional": true
1900 |         },
1901 |         "needle": {
1902 |           "version": "2.2.0",
1903 |           "bundled": true,
1904 |           "dev": true,
1905 |           "optional": true,
1906 |           "requires": {
1907 |             "debug": "^2.1.2",
1908 |             "iconv-lite": "^0.4.4",
1909 |             "sax": "^1.2.4"
1910 |           }
1911 |         },
1912 |         "node-pre-gyp": {
1913 |           "version": "0.10.0",
1914 |           "bundled": true,
1915 |           "dev": true,
1916 |           "optional": true,
1917 |           "requires": {
1918 |             "detect-libc": "^1.0.2",
1919 |             "mkdirp": "^0.5.1",
1920 |             "needle": "^2.2.0",
1921 |             "nopt": "^4.0.1",
1922 |             "npm-packlist": "^1.1.6",
1923 |             "npmlog": "^4.0.2",
1924 |             "rc": "^1.1.7",
1925 |             "rimraf": "^2.6.1",
1926 |             "semver": "^5.3.0",
1927 |             "tar": "^4"
1928 |           }
1929 |         },
1930 |         "nopt": {
1931 |           "version": "4.0.1",
1932 |           "bundled": true,
1933 |           "dev": true,
1934 |           "optional": true,
1935 |           "requires": {
1936 |             "abbrev": "1",
1937 |             "osenv": "^0.1.4"
1938 |           }
1939 |         },
1940 |         "npm-bundled": {
1941 |           "version": "1.0.3",
1942 |           "bundled": true,
1943 |           "dev": true,
1944 |           "optional": true
1945 |         },
1946 |         "npm-packlist": {
1947 |           "version": "1.1.10",
1948 |           "bundled": true,
1949 |           "dev": true,
1950 |           "optional": true,
1951 |           "requires": {
1952 |             "ignore-walk": "^3.0.1",
1953 |             "npm-bundled": "^1.0.1"
1954 |           }
1955 |         },
1956 |         "npmlog": {
1957 |           "version": "4.1.2",
1958 |           "bundled": true,
1959 |           "dev": true,
1960 |           "optional": true,
1961 |           "requires": {
1962 |             "are-we-there-yet": "~1.1.2",
1963 |             "console-control-strings": "~1.1.0",
1964 |             "gauge": "~2.7.3",
1965 |             "set-blocking": "~2.0.0"
1966 |           }
1967 |         },
1968 |         "number-is-nan": {
1969 |           "version": "1.0.1",
1970 |           "bundled": true,
1971 |           "dev": true
1972 |         },
1973 |         "object-assign": {
1974 |           "version": "4.1.1",
1975 |           "bundled": true,
1976 |           "dev": true,
1977 |           "optional": true
1978 |         },
1979 |         "once": {
1980 |           "version": "1.4.0",
1981 |           "bundled": true,
1982 |           "dev": true,
1983 |           "requires": {
1984 |             "wrappy": "1"
1985 |           }
1986 |         },
1987 |         "os-homedir": {
1988 |           "version": "1.0.2",
1989 |           "bundled": true,
1990 |           "dev": true,
1991 |           "optional": true
1992 |         },
1993 |         "os-tmpdir": {
1994 |           "version": "1.0.2",
1995 |           "bundled": true,
1996 |           "dev": true,
1997 |           "optional": true
1998 |         },
1999 |         "osenv": {
2000 |           "version": "0.1.5",
2001 |           "bundled": true,
2002 |           "dev": true,
2003 |           "optional": true,
2004 |           "requires": {
2005 |             "os-homedir": "^1.0.0",
2006 |             "os-tmpdir": "^1.0.0"
2007 |           }
2008 |         },
2009 |         "path-is-absolute": {
2010 |           "version": "1.0.1",
2011 |           "bundled": true,
2012 |           "dev": true,
2013 |           "optional": true
2014 |         },
2015 |         "process-nextick-args": {
2016 |           "version": "2.0.0",
2017 |           "bundled": true,
2018 |           "dev": true,
2019 |           "optional": true
2020 |         },
2021 |         "rc": {
2022 |           "version": "1.2.7",
2023 |           "bundled": true,
2024 |           "dev": true,
2025 |           "optional": true,
2026 |           "requires": {
2027 |             "deep-extend": "^0.5.1",
2028 |             "ini": "~1.3.0",
2029 |             "minimist": "^1.2.0",
2030 |             "strip-json-comments": "~2.0.1"
2031 |           },
2032 |           "dependencies": {
2033 |             "minimist": {
2034 |               "version": "1.2.0",
2035 |               "bundled": true,
2036 |               "dev": true,
2037 |               "optional": true
2038 |             }
2039 |           }
2040 |         },
2041 |         "readable-stream": {
2042 |           "version": "2.3.6",
2043 |           "bundled": true,
2044 |           "dev": true,
2045 |           "optional": true,
2046 |           "requires": {
2047 |             "core-util-is": "~1.0.0",
2048 |             "inherits": "~2.0.3",
2049 |             "isarray": "~1.0.0",
2050 |             "process-nextick-args": "~2.0.0",
2051 |             "safe-buffer": "~5.1.1",
2052 |             "string_decoder": "~1.1.1",
2053 |             "util-deprecate": "~1.0.1"
2054 |           }
2055 |         },
2056 |         "rimraf": {
2057 |           "version": "2.6.2",
2058 |           "bundled": true,
2059 |           "dev": true,
2060 |           "optional": true,
2061 |           "requires": {
2062 |             "glob": "^7.0.5"
2063 |           }
2064 |         },
2065 |         "safe-buffer": {
2066 |           "version": "5.1.1",
2067 |           "bundled": true,
2068 |           "dev": true
2069 |         },
2070 |         "safer-buffer": {
2071 |           "version": "2.1.2",
2072 |           "bundled": true,
2073 |           "dev": true,
2074 |           "optional": true
2075 |         },
2076 |         "sax": {
2077 |           "version": "1.2.4",
2078 |           "bundled": true,
2079 |           "dev": true,
2080 |           "optional": true
2081 |         },
2082 |         "semver": {
2083 |           "version": "5.5.0",
2084 |           "bundled": true,
2085 |           "dev": true,
2086 |           "optional": true
2087 |         },
2088 |         "set-blocking": {
2089 |           "version": "2.0.0",
2090 |           "bundled": true,
2091 |           "dev": true,
2092 |           "optional": true
2093 |         },
2094 |         "signal-exit": {
2095 |           "version": "3.0.2",
2096 |           "bundled": true,
2097 |           "dev": true,
2098 |           "optional": true
2099 |         },
2100 |         "string-width": {
2101 |           "version": "1.0.2",
2102 |           "bundled": true,
2103 |           "dev": true,
2104 |           "requires": {
2105 |             "code-point-at": "^1.0.0",
2106 |             "is-fullwidth-code-point": "^1.0.0",
2107 |             "strip-ansi": "^3.0.0"
2108 |           }
2109 |         },
2110 |         "string_decoder": {
2111 |           "version": "1.1.1",
2112 |           "bundled": true,
2113 |           "dev": true,
2114 |           "optional": true,
2115 |           "requires": {
2116 |             "safe-buffer": "~5.1.0"
2117 |           }
2118 |         },
2119 |         "strip-ansi": {
2120 |           "version": "3.0.1",
2121 |           "bundled": true,
2122 |           "dev": true,
2123 |           "requires": {
2124 |             "ansi-regex": "^2.0.0"
2125 |           }
2126 |         },
2127 |         "strip-json-comments": {
2128 |           "version": "2.0.1",
2129 |           "bundled": true,
2130 |           "dev": true,
2131 |           "optional": true
2132 |         },
2133 |         "tar": {
2134 |           "version": "4.4.1",
2135 |           "bundled": true,
2136 |           "dev": true,
2137 |           "optional": true,
2138 |           "requires": {
2139 |             "chownr": "^1.0.1",
2140 |             "fs-minipass": "^1.2.5",
2141 |             "minipass": "^2.2.4",
2142 |             "minizlib": "^1.1.0",
2143 |             "mkdirp": "^0.5.0",
2144 |             "safe-buffer": "^5.1.1",
2145 |             "yallist": "^3.0.2"
2146 |           }
2147 |         },
2148 |         "util-deprecate": {
2149 |           "version": "1.0.2",
2150 |           "bundled": true,
2151 |           "dev": true,
2152 |           "optional": true
2153 |         },
2154 |         "wide-align": {
2155 |           "version": "1.1.2",
2156 |           "bundled": true,
2157 |           "dev": true,
2158 |           "optional": true,
2159 |           "requires": {
2160 |             "string-width": "^1.0.2"
2161 |           }
2162 |         },
2163 |         "wrappy": {
2164 |           "version": "1.0.2",
2165 |           "bundled": true,
2166 |           "dev": true
2167 |         },
2168 |         "yallist": {
2169 |           "version": "3.0.2",
2170 |           "bundled": true,
2171 |           "dev": true
2172 |         }
2173 |       }
2174 |     },
2175 |     "function-bind": {
2176 |       "version": "1.1.1",
2177 |       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
2178 |       "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
2179 |       "dev": true
2180 |     },
2181 |     "functional-red-black-tree": {
2182 |       "version": "1.0.1",
2183 |       "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
2184 |       "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
2185 |       "dev": true
2186 |     },
2187 |     "get-func-name": {
2188 |       "version": "2.0.0",
2189 |       "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
2190 |       "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
2191 |       "dev": true
2192 |     },
2193 |     "glob": {
2194 |       "version": "7.1.2",
2195 |       "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
2196 |       "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
2197 |       "dev": true,
2198 |       "requires": {
2199 |         "fs.realpath": "^1.0.0",
2200 |         "inflight": "^1.0.4",
2201 |         "inherits": "2",
2202 |         "minimatch": "^3.0.4",
2203 |         "once": "^1.3.0",
2204 |         "path-is-absolute": "^1.0.0"
2205 |       }
2206 |     },
2207 |     "glob-base": {
2208 |       "version": "0.3.0",
2209 |       "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
2210 |       "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
2211 |       "dev": true,
2212 |       "optional": true,
2213 |       "requires": {
2214 |         "glob-parent": "^2.0.0",
2215 |         "is-glob": "^2.0.0"
2216 |       }
2217 |     },
2218 |     "glob-parent": {
2219 |       "version": "2.0.0",
2220 |       "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
2221 |       "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
2222 |       "dev": true,
2223 |       "requires": {
2224 |         "is-glob": "^2.0.0"
2225 |       }
2226 |     },
2227 |     "globals": {
2228 |       "version": "9.18.0",
2229 |       "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
2230 |       "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
2231 |       "dev": true
2232 |     },
2233 |     "globby": {
2234 |       "version": "5.0.0",
2235 |       "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
2236 |       "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
2237 |       "dev": true,
2238 |       "requires": {
2239 |         "array-union": "^1.0.1",
2240 |         "arrify": "^1.0.0",
2241 |         "glob": "^7.0.3",
2242 |         "object-assign": "^4.0.1",
2243 |         "pify": "^2.0.0",
2244 |         "pinkie-promise": "^2.0.0"
2245 |       }
2246 |     },
2247 |     "graceful-fs": {
2248 |       "version": "4.1.11",
2249 |       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
2250 |       "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
2251 |       "dev": true
2252 |     },
2253 |     "growl": {
2254 |       "version": "1.10.5",
2255 |       "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
2256 |       "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
2257 |       "dev": true
2258 |     },
2259 |     "has": {
2260 |       "version": "1.0.3",
2261 |       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
2262 |       "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
2263 |       "dev": true,
2264 |       "requires": {
2265 |         "function-bind": "^1.1.1"
2266 |       }
2267 |     },
2268 |     "has-ansi": {
2269 |       "version": "2.0.0",
2270 |       "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
2271 |       "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
2272 |       "dev": true,
2273 |       "requires": {
2274 |         "ansi-regex": "^2.0.0"
2275 |       }
2276 |     },
2277 |     "has-flag": {
2278 |       "version": "3.0.0",
2279 |       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
2280 |       "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
2281 |       "dev": true
2282 |     },
2283 |     "has-symbols": {
2284 |       "version": "1.0.0",
2285 |       "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
2286 |       "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
2287 |       "dev": true
2288 |     },
2289 |     "he": {
2290 |       "version": "1.1.1",
2291 |       "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
2292 |       "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
2293 |       "dev": true
2294 |     },
2295 |     "home-or-tmp": {
2296 |       "version": "2.0.0",
2297 |       "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
2298 |       "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
2299 |       "dev": true,
2300 |       "requires": {
2301 |         "os-homedir": "^1.0.0",
2302 |         "os-tmpdir": "^1.0.1"
2303 |       }
2304 |     },
2305 |     "hosted-git-info": {
2306 |       "version": "2.7.1",
2307 |       "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
2308 |       "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
2309 |       "dev": true
2310 |     },
2311 |     "iconv-lite": {
2312 |       "version": "0.4.24",
2313 |       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
2314 |       "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
2315 |       "dev": true,
2316 |       "requires": {
2317 |         "safer-buffer": ">= 2.1.2 < 3"
2318 |       }
2319 |     },
2320 |     "ignore": {
2321 |       "version": "4.0.6",
2322 |       "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
2323 |       "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
2324 |       "dev": true
2325 |     },
2326 |     "imurmurhash": {
2327 |       "version": "0.1.4",
2328 |       "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
2329 |       "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
2330 |       "dev": true
2331 |     },
2332 |     "inflight": {
2333 |       "version": "1.0.6",
2334 |       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
2335 |       "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
2336 |       "dev": true,
2337 |       "requires": {
2338 |         "once": "^1.3.0",
2339 |         "wrappy": "1"
2340 |       }
2341 |     },
2342 |     "inherits": {
2343 |       "version": "2.0.3",
2344 |       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
2345 |       "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
2346 |       "dev": true
2347 |     },
2348 |     "inquirer": {
2349 |       "version": "6.2.0",
2350 |       "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz",
2351 |       "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==",
2352 |       "dev": true,
2353 |       "requires": {
2354 |         "ansi-escapes": "^3.0.0",
2355 |         "chalk": "^2.0.0",
2356 |         "cli-cursor": "^2.1.0",
2357 |         "cli-width": "^2.0.0",
2358 |         "external-editor": "^3.0.0",
2359 |         "figures": "^2.0.0",
2360 |         "lodash": "^4.17.10",
2361 |         "mute-stream": "0.0.7",
2362 |         "run-async": "^2.2.0",
2363 |         "rxjs": "^6.1.0",
2364 |         "string-width": "^2.1.0",
2365 |         "strip-ansi": "^4.0.0",
2366 |         "through": "^2.3.6"
2367 |       },
2368 |       "dependencies": {
2369 |         "ansi-regex": {
2370 |           "version": "3.0.0",
2371 |           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
2372 |           "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
2373 |           "dev": true
2374 |         },
2375 |         "ansi-styles": {
2376 |           "version": "3.2.1",
2377 |           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
2378 |           "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
2379 |           "dev": true,
2380 |           "requires": {
2381 |             "color-convert": "^1.9.0"
2382 |           }
2383 |         },
2384 |         "chalk": {
2385 |           "version": "2.4.1",
2386 |           "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
2387 |           "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
2388 |           "dev": true,
2389 |           "requires": {
2390 |             "ansi-styles": "^3.2.1",
2391 |             "escape-string-regexp": "^1.0.5",
2392 |             "supports-color": "^5.3.0"
2393 |           }
2394 |         },
2395 |         "strip-ansi": {
2396 |           "version": "4.0.0",
2397 |           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
2398 |           "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
2399 |           "dev": true,
2400 |           "requires": {
2401 |             "ansi-regex": "^3.0.0"
2402 |           }
2403 |         },
2404 |         "supports-color": {
2405 |           "version": "5.5.0",
2406 |           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
2407 |           "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
2408 |           "dev": true,
2409 |           "requires": {
2410 |             "has-flag": "^3.0.0"
2411 |           }
2412 |         }
2413 |       }
2414 |     },
2415 |     "invariant": {
2416 |       "version": "2.2.4",
2417 |       "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
2418 |       "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
2419 |       "dev": true,
2420 |       "requires": {
2421 |         "loose-envify": "^1.0.0"
2422 |       }
2423 |     },
2424 |     "is-arrayish": {
2425 |       "version": "0.2.1",
2426 |       "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
2427 |       "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
2428 |       "dev": true
2429 |     },
2430 |     "is-binary-path": {
2431 |       "version": "1.0.1",
2432 |       "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
2433 |       "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
2434 |       "dev": true,
2435 |       "optional": true,
2436 |       "requires": {
2437 |         "binary-extensions": "^1.0.0"
2438 |       }
2439 |     },
2440 |     "is-buffer": {
2441 |       "version": "1.1.6",
2442 |       "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
2443 |       "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
2444 |       "dev": true
2445 |     },
2446 |     "is-builtin-module": {
2447 |       "version": "1.0.0",
2448 |       "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
2449 |       "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
2450 |       "dev": true,
2451 |       "requires": {
2452 |         "builtin-modules": "^1.0.0"
2453 |       }
2454 |     },
2455 |     "is-callable": {
2456 |       "version": "1.1.4",
2457 |       "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
2458 |       "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
2459 |       "dev": true
2460 |     },
2461 |     "is-date-object": {
2462 |       "version": "1.0.1",
2463 |       "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
2464 |       "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
2465 |       "dev": true
2466 |     },
2467 |     "is-dotfile": {
2468 |       "version": "1.0.3",
2469 |       "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
2470 |       "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
2471 |       "dev": true,
2472 |       "optional": true
2473 |     },
2474 |     "is-equal-shallow": {
2475 |       "version": "0.1.3",
2476 |       "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
2477 |       "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
2478 |       "dev": true,
2479 |       "optional": true,
2480 |       "requires": {
2481 |         "is-primitive": "^2.0.0"
2482 |       }
2483 |     },
2484 |     "is-extendable": {
2485 |       "version": "0.1.1",
2486 |       "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
2487 |       "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
2488 |       "dev": true,
2489 |       "optional": true
2490 |     },
2491 |     "is-extglob": {
2492 |       "version": "1.0.0",
2493 |       "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
2494 |       "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
2495 |       "dev": true
2496 |     },
2497 |     "is-finite": {
2498 |       "version": "1.0.2",
2499 |       "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
2500 |       "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
2501 |       "dev": true,
2502 |       "requires": {
2503 |         "number-is-nan": "^1.0.0"
2504 |       }
2505 |     },
2506 |     "is-fullwidth-code-point": {
2507 |       "version": "2.0.0",
2508 |       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
2509 |       "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
2510 |       "dev": true
2511 |     },
2512 |     "is-glob": {
2513 |       "version": "2.0.1",
2514 |       "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
2515 |       "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
2516 |       "dev": true,
2517 |       "requires": {
2518 |         "is-extglob": "^1.0.0"
2519 |       }
2520 |     },
2521 |     "is-number": {
2522 |       "version": "2.1.0",
2523 |       "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
2524 |       "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
2525 |       "dev": true,
2526 |       "optional": true,
2527 |       "requires": {
2528 |         "kind-of": "^3.0.2"
2529 |       }
2530 |     },
2531 |     "is-path-cwd": {
2532 |       "version": "1.0.0",
2533 |       "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
2534 |       "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
2535 |       "dev": true
2536 |     },
2537 |     "is-path-in-cwd": {
2538 |       "version": "1.0.1",
2539 |       "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
2540 |       "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
2541 |       "dev": true,
2542 |       "requires": {
2543 |         "is-path-inside": "^1.0.0"
2544 |       }
2545 |     },
2546 |     "is-path-inside": {
2547 |       "version": "1.0.1",
2548 |       "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
2549 |       "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
2550 |       "dev": true,
2551 |       "requires": {
2552 |         "path-is-inside": "^1.0.1"
2553 |       }
2554 |     },
2555 |     "is-posix-bracket": {
2556 |       "version": "0.1.1",
2557 |       "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
2558 |       "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
2559 |       "dev": true,
2560 |       "optional": true
2561 |     },
2562 |     "is-primitive": {
2563 |       "version": "2.0.0",
2564 |       "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
2565 |       "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
2566 |       "dev": true,
2567 |       "optional": true
2568 |     },
2569 |     "is-promise": {
2570 |       "version": "2.1.0",
2571 |       "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
2572 |       "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
2573 |       "dev": true
2574 |     },
2575 |     "is-regex": {
2576 |       "version": "1.0.4",
2577 |       "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
2578 |       "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
2579 |       "dev": true,
2580 |       "requires": {
2581 |         "has": "^1.0.1"
2582 |       }
2583 |     },
2584 |     "is-resolvable": {
2585 |       "version": "1.1.0",
2586 |       "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
2587 |       "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
2588 |       "dev": true
2589 |     },
2590 |     "is-symbol": {
2591 |       "version": "1.0.2",
2592 |       "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
2593 |       "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
2594 |       "dev": true,
2595 |       "requires": {
2596 |         "has-symbols": "^1.0.0"
2597 |       }
2598 |     },
2599 |     "isarray": {
2600 |       "version": "1.0.0",
2601 |       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
2602 |       "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
2603 |       "dev": true
2604 |     },
2605 |     "isexe": {
2606 |       "version": "2.0.0",
2607 |       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
2608 |       "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
2609 |       "dev": true
2610 |     },
2611 |     "isobject": {
2612 |       "version": "2.1.0",
2613 |       "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
2614 |       "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
2615 |       "dev": true,
2616 |       "optional": true,
2617 |       "requires": {
2618 |         "isarray": "1.0.0"
2619 |       }
2620 |     },
2621 |     "js-tokens": {
2622 |       "version": "3.0.2",
2623 |       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
2624 |       "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
2625 |       "dev": true
2626 |     },
2627 |     "js-yaml": {
2628 |       "version": "3.12.0",
2629 |       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
2630 |       "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
2631 |       "dev": true,
2632 |       "requires": {
2633 |         "argparse": "^1.0.7",
2634 |         "esprima": "^4.0.0"
2635 |       }
2636 |     },
2637 |     "jsesc": {
2638 |       "version": "1.3.0",
2639 |       "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
2640 |       "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
2641 |       "dev": true
2642 |     },
2643 |     "json-schema-traverse": {
2644 |       "version": "0.4.1",
2645 |       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
2646 |       "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
2647 |       "dev": true
2648 |     },
2649 |     "json-stable-stringify-without-jsonify": {
2650 |       "version": "1.0.1",
2651 |       "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
2652 |       "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
2653 |       "dev": true
2654 |     },
2655 |     "json5": {
2656 |       "version": "0.5.1",
2657 |       "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
2658 |       "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
2659 |       "dev": true
2660 |     },
2661 |     "just-extend": {
2662 |       "version": "3.0.0",
2663 |       "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-3.0.0.tgz",
2664 |       "integrity": "sha512-Fu3T6pKBuxjWT/p4DkqGHFRsysc8OauWr4ZRTY9dIx07Y9O0RkoR5jcv28aeD1vuAwhm3nLkDurwLXoALp4DpQ==",
2665 |       "dev": true
2666 |     },
2667 |     "kind-of": {
2668 |       "version": "3.2.2",
2669 |       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
2670 |       "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
2671 |       "dev": true,
2672 |       "requires": {
2673 |         "is-buffer": "^1.1.5"
2674 |       }
2675 |     },
2676 |     "levn": {
2677 |       "version": "0.3.0",
2678 |       "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
2679 |       "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
2680 |       "dev": true,
2681 |       "requires": {
2682 |         "prelude-ls": "~1.1.2",
2683 |         "type-check": "~0.3.2"
2684 |       }
2685 |     },
2686 |     "load-json-file": {
2687 |       "version": "2.0.0",
2688 |       "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
2689 |       "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
2690 |       "dev": true,
2691 |       "requires": {
2692 |         "graceful-fs": "^4.1.2",
2693 |         "parse-json": "^2.2.0",
2694 |         "pify": "^2.0.0",
2695 |         "strip-bom": "^3.0.0"
2696 |       }
2697 |     },
2698 |     "locate-path": {
2699 |       "version": "2.0.0",
2700 |       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
2701 |       "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
2702 |       "dev": true,
2703 |       "requires": {
2704 |         "p-locate": "^2.0.0",
2705 |         "path-exists": "^3.0.0"
2706 |       },
2707 |       "dependencies": {
2708 |         "path-exists": {
2709 |           "version": "3.0.0",
2710 |           "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
2711 |           "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
2712 |           "dev": true
2713 |         }
2714 |       }
2715 |     },
2716 |     "lodash": {
2717 |       "version": "4.17.10",
2718 |       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
2719 |       "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
2720 |       "dev": true
2721 |     },
2722 |     "lodash.get": {
2723 |       "version": "4.4.2",
2724 |       "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
2725 |       "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
2726 |       "dev": true
2727 |     },
2728 |     "loglevel": {
2729 |       "version": "1.6.1",
2730 |       "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz",
2731 |       "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=",
2732 |       "dev": true
2733 |     },
2734 |     "loglevel-plugin-mock": {
2735 |       "version": "0.1.0",
2736 |       "resolved": "https://registry.npmjs.org/loglevel-plugin-mock/-/loglevel-plugin-mock-0.1.0.tgz",
2737 |       "integrity": "sha512-NgfYm3AMdZnYjHm2q8YVpHOJlJG7ZvATjZ8iu3v9b3wMqPbKt44BiIDSHMesbPgvmf66PaVaV1UG1hFIsAoajA==",
2738 |       "dev": true
2739 |     },
2740 |     "lolex": {
2741 |       "version": "2.7.5",
2742 |       "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz",
2743 |       "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==",
2744 |       "dev": true
2745 |     },
2746 |     "loose-envify": {
2747 |       "version": "1.4.0",
2748 |       "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
2749 |       "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
2750 |       "dev": true,
2751 |       "requires": {
2752 |         "js-tokens": "^3.0.0 || ^4.0.0"
2753 |       }
2754 |     },
2755 |     "math-random": {
2756 |       "version": "1.0.1",
2757 |       "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
2758 |       "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=",
2759 |       "dev": true,
2760 |       "optional": true
2761 |     },
2762 |     "micromatch": {
2763 |       "version": "2.3.11",
2764 |       "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
2765 |       "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
2766 |       "dev": true,
2767 |       "optional": true,
2768 |       "requires": {
2769 |         "arr-diff": "^2.0.0",
2770 |         "array-unique": "^0.2.1",
2771 |         "braces": "^1.8.2",
2772 |         "expand-brackets": "^0.1.4",
2773 |         "extglob": "^0.3.1",
2774 |         "filename-regex": "^2.0.0",
2775 |         "is-extglob": "^1.0.0",
2776 |         "is-glob": "^2.0.1",
2777 |         "kind-of": "^3.0.2",
2778 |         "normalize-path": "^2.0.1",
2779 |         "object.omit": "^2.0.0",
2780 |         "parse-glob": "^3.0.4",
2781 |         "regex-cache": "^0.4.2"
2782 |       }
2783 |     },
2784 |     "mimic-fn": {
2785 |       "version": "1.2.0",
2786 |       "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
2787 |       "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
2788 |       "dev": true
2789 |     },
2790 |     "minimatch": {
2791 |       "version": "3.0.4",
2792 |       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
2793 |       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
2794 |       "dev": true,
2795 |       "requires": {
2796 |         "brace-expansion": "^1.1.7"
2797 |       }
2798 |     },
2799 |     "minimist": {
2800 |       "version": "0.0.8",
2801 |       "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
2802 |       "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
2803 |       "dev": true
2804 |     },
2805 |     "mkdirp": {
2806 |       "version": "0.5.1",
2807 |       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
2808 |       "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
2809 |       "dev": true,
2810 |       "requires": {
2811 |         "minimist": "0.0.8"
2812 |       }
2813 |     },
2814 |     "mocha": {
2815 |       "version": "5.2.0",
2816 |       "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz",
2817 |       "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==",
2818 |       "dev": true,
2819 |       "requires": {
2820 |         "browser-stdout": "1.3.1",
2821 |         "commander": "2.15.1",
2822 |         "debug": "3.1.0",
2823 |         "diff": "3.5.0",
2824 |         "escape-string-regexp": "1.0.5",
2825 |         "glob": "7.1.2",
2826 |         "growl": "1.10.5",
2827 |         "he": "1.1.1",
2828 |         "minimatch": "3.0.4",
2829 |         "mkdirp": "0.5.1",
2830 |         "supports-color": "5.4.0"
2831 |       },
2832 |       "dependencies": {
2833 |         "commander": {
2834 |           "version": "2.15.1",
2835 |           "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
2836 |           "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
2837 |           "dev": true
2838 |         },
2839 |         "debug": {
2840 |           "version": "3.1.0",
2841 |           "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
2842 |           "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
2843 |           "dev": true,
2844 |           "requires": {
2845 |             "ms": "2.0.0"
2846 |           }
2847 |         },
2848 |         "supports-color": {
2849 |           "version": "5.4.0",
2850 |           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
2851 |           "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
2852 |           "dev": true,
2853 |           "requires": {
2854 |             "has-flag": "^3.0.0"
2855 |           }
2856 |         }
2857 |       }
2858 |     },
2859 |     "ms": {
2860 |       "version": "2.0.0",
2861 |       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
2862 |       "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
2863 |       "dev": true
2864 |     },
2865 |     "mute-stream": {
2866 |       "version": "0.0.7",
2867 |       "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
2868 |       "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
2869 |       "dev": true
2870 |     },
2871 |     "nan": {
2872 |       "version": "2.10.0",
2873 |       "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
2874 |       "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==",
2875 |       "dev": true,
2876 |       "optional": true
2877 |     },
2878 |     "natural-compare": {
2879 |       "version": "1.4.0",
2880 |       "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
2881 |       "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
2882 |       "dev": true
2883 |     },
2884 |     "nice-try": {
2885 |       "version": "1.0.5",
2886 |       "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
2887 |       "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
2888 |       "dev": true
2889 |     },
2890 |     "nise": {
2891 |       "version": "1.4.5",
2892 |       "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.5.tgz",
2893 |       "integrity": "sha512-OHRVvdxKgwZELf2DTgsJEIA4MOq8XWvpSUzoOXyxJ2mY0mMENWC66+70AShLR2z05B1dzrzWlUQJmJERlOUpZw==",
2894 |       "dev": true,
2895 |       "requires": {
2896 |         "@sinonjs/formatio": "3.0.0",
2897 |         "just-extend": "^3.0.0",
2898 |         "lolex": "^2.3.2",
2899 |         "path-to-regexp": "^1.7.0",
2900 |         "text-encoding": "^0.6.4"
2901 |       }
2902 |     },
2903 |     "normalize-package-data": {
2904 |       "version": "2.4.0",
2905 |       "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
2906 |       "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
2907 |       "dev": true,
2908 |       "requires": {
2909 |         "hosted-git-info": "^2.1.4",
2910 |         "is-builtin-module": "^1.0.0",
2911 |         "semver": "2 || 3 || 4 || 5",
2912 |         "validate-npm-package-license": "^3.0.1"
2913 |       }
2914 |     },
2915 |     "normalize-path": {
2916 |       "version": "2.1.1",
2917 |       "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
2918 |       "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
2919 |       "dev": true,
2920 |       "requires": {
2921 |         "remove-trailing-separator": "^1.0.1"
2922 |       }
2923 |     },
2924 |     "number-is-nan": {
2925 |       "version": "1.0.1",
2926 |       "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
2927 |       "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
2928 |       "dev": true
2929 |     },
2930 |     "object-assign": {
2931 |       "version": "4.1.1",
2932 |       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
2933 |       "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
2934 |       "dev": true
2935 |     },
2936 |     "object-keys": {
2937 |       "version": "1.0.12",
2938 |       "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
2939 |       "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
2940 |       "dev": true
2941 |     },
2942 |     "object.assign": {
2943 |       "version": "4.1.0",
2944 |       "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
2945 |       "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
2946 |       "dev": true,
2947 |       "requires": {
2948 |         "define-properties": "^1.1.2",
2949 |         "function-bind": "^1.1.1",
2950 |         "has-symbols": "^1.0.0",
2951 |         "object-keys": "^1.0.11"
2952 |       }
2953 |     },
2954 |     "object.entries": {
2955 |       "version": "1.0.4",
2956 |       "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz",
2957 |       "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=",
2958 |       "dev": true,
2959 |       "requires": {
2960 |         "define-properties": "^1.1.2",
2961 |         "es-abstract": "^1.6.1",
2962 |         "function-bind": "^1.1.0",
2963 |         "has": "^1.0.1"
2964 |       }
2965 |     },
2966 |     "object.omit": {
2967 |       "version": "2.0.1",
2968 |       "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
2969 |       "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
2970 |       "dev": true,
2971 |       "optional": true,
2972 |       "requires": {
2973 |         "for-own": "^0.1.4",
2974 |         "is-extendable": "^0.1.1"
2975 |       }
2976 |     },
2977 |     "once": {
2978 |       "version": "1.4.0",
2979 |       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2980 |       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
2981 |       "dev": true,
2982 |       "requires": {
2983 |         "wrappy": "1"
2984 |       }
2985 |     },
2986 |     "onetime": {
2987 |       "version": "2.0.1",
2988 |       "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
2989 |       "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
2990 |       "dev": true,
2991 |       "requires": {
2992 |         "mimic-fn": "^1.0.0"
2993 |       }
2994 |     },
2995 |     "optionator": {
2996 |       "version": "0.8.2",
2997 |       "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
2998 |       "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
2999 |       "dev": true,
3000 |       "requires": {
3001 |         "deep-is": "~0.1.3",
3002 |         "fast-levenshtein": "~2.0.4",
3003 |         "levn": "~0.3.0",
3004 |         "prelude-ls": "~1.1.2",
3005 |         "type-check": "~0.3.2",
3006 |         "wordwrap": "~1.0.0"
3007 |       }
3008 |     },
3009 |     "os-homedir": {
3010 |       "version": "1.0.2",
3011 |       "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
3012 |       "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
3013 |       "dev": true
3014 |     },
3015 |     "os-tmpdir": {
3016 |       "version": "1.0.2",
3017 |       "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
3018 |       "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
3019 |       "dev": true
3020 |     },
3021 |     "output-file-sync": {
3022 |       "version": "1.1.2",
3023 |       "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz",
3024 |       "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=",
3025 |       "dev": true,
3026 |       "requires": {
3027 |         "graceful-fs": "^4.1.4",
3028 |         "mkdirp": "^0.5.1",
3029 |         "object-assign": "^4.1.0"
3030 |       }
3031 |     },
3032 |     "p-limit": {
3033 |       "version": "1.3.0",
3034 |       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
3035 |       "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
3036 |       "dev": true,
3037 |       "requires": {
3038 |         "p-try": "^1.0.0"
3039 |       }
3040 |     },
3041 |     "p-locate": {
3042 |       "version": "2.0.0",
3043 |       "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
3044 |       "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
3045 |       "dev": true,
3046 |       "requires": {
3047 |         "p-limit": "^1.1.0"
3048 |       }
3049 |     },
3050 |     "p-try": {
3051 |       "version": "1.0.0",
3052 |       "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
3053 |       "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
3054 |       "dev": true
3055 |     },
3056 |     "parse-glob": {
3057 |       "version": "3.0.4",
3058 |       "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
3059 |       "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
3060 |       "dev": true,
3061 |       "optional": true,
3062 |       "requires": {
3063 |         "glob-base": "^0.3.0",
3064 |         "is-dotfile": "^1.0.0",
3065 |         "is-extglob": "^1.0.0",
3066 |         "is-glob": "^2.0.0"
3067 |       }
3068 |     },
3069 |     "parse-json": {
3070 |       "version": "2.2.0",
3071 |       "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
3072 |       "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
3073 |       "dev": true,
3074 |       "requires": {
3075 |         "error-ex": "^1.2.0"
3076 |       }
3077 |     },
3078 |     "path-exists": {
3079 |       "version": "2.1.0",
3080 |       "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
3081 |       "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
3082 |       "dev": true,
3083 |       "requires": {
3084 |         "pinkie-promise": "^2.0.0"
3085 |       }
3086 |     },
3087 |     "path-is-absolute": {
3088 |       "version": "1.0.1",
3089 |       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
3090 |       "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
3091 |       "dev": true
3092 |     },
3093 |     "path-is-inside": {
3094 |       "version": "1.0.2",
3095 |       "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
3096 |       "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
3097 |       "dev": true
3098 |     },
3099 |     "path-key": {
3100 |       "version": "2.0.1",
3101 |       "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
3102 |       "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
3103 |       "dev": true
3104 |     },
3105 |     "path-parse": {
3106 |       "version": "1.0.6",
3107 |       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
3108 |       "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
3109 |       "dev": true
3110 |     },
3111 |     "path-to-regexp": {
3112 |       "version": "1.7.0",
3113 |       "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
3114 |       "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
3115 |       "dev": true,
3116 |       "requires": {
3117 |         "isarray": "0.0.1"
3118 |       },
3119 |       "dependencies": {
3120 |         "isarray": {
3121 |           "version": "0.0.1",
3122 |           "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
3123 |           "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
3124 |           "dev": true
3125 |         }
3126 |       }
3127 |     },
3128 |     "path-type": {
3129 |       "version": "2.0.0",
3130 |       "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
3131 |       "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
3132 |       "dev": true,
3133 |       "requires": {
3134 |         "pify": "^2.0.0"
3135 |       }
3136 |     },
3137 |     "pathval": {
3138 |       "version": "1.1.0",
3139 |       "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
3140 |       "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
3141 |       "dev": true
3142 |     },
3143 |     "pify": {
3144 |       "version": "2.3.0",
3145 |       "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
3146 |       "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
3147 |       "dev": true
3148 |     },
3149 |     "pinkie": {
3150 |       "version": "2.0.4",
3151 |       "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
3152 |       "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
3153 |       "dev": true
3154 |     },
3155 |     "pinkie-promise": {
3156 |       "version": "2.0.1",
3157 |       "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
3158 |       "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
3159 |       "dev": true,
3160 |       "requires": {
3161 |         "pinkie": "^2.0.0"
3162 |       }
3163 |     },
3164 |     "pkg-dir": {
3165 |       "version": "1.0.0",
3166 |       "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
3167 |       "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
3168 |       "dev": true,
3169 |       "requires": {
3170 |         "find-up": "^1.0.0"
3171 |       }
3172 |     },
3173 |     "pluralize": {
3174 |       "version": "7.0.0",
3175 |       "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
3176 |       "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
3177 |       "dev": true
3178 |     },
3179 |     "prelude-ls": {
3180 |       "version": "1.1.2",
3181 |       "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
3182 |       "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
3183 |       "dev": true
3184 |     },
3185 |     "preserve": {
3186 |       "version": "0.2.0",
3187 |       "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
3188 |       "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
3189 |       "dev": true,
3190 |       "optional": true
3191 |     },
3192 |     "private": {
3193 |       "version": "0.1.8",
3194 |       "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
3195 |       "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
3196 |       "dev": true
3197 |     },
3198 |     "process-nextick-args": {
3199 |       "version": "2.0.0",
3200 |       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
3201 |       "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
3202 |       "dev": true,
3203 |       "optional": true
3204 |     },
3205 |     "progress": {
3206 |       "version": "2.0.0",
3207 |       "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
3208 |       "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=",
3209 |       "dev": true
3210 |     },
3211 |     "punycode": {
3212 |       "version": "2.1.1",
3213 |       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
3214 |       "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
3215 |       "dev": true
3216 |     },
3217 |     "randomatic": {
3218 |       "version": "3.1.0",
3219 |       "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz",
3220 |       "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==",
3221 |       "dev": true,
3222 |       "optional": true,
3223 |       "requires": {
3224 |         "is-number": "^4.0.0",
3225 |         "kind-of": "^6.0.0",
3226 |         "math-random": "^1.0.1"
3227 |       },
3228 |       "dependencies": {
3229 |         "is-number": {
3230 |           "version": "4.0.0",
3231 |           "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
3232 |           "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
3233 |           "dev": true,
3234 |           "optional": true
3235 |         },
3236 |         "kind-of": {
3237 |           "version": "6.0.2",
3238 |           "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
3239 |           "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
3240 |           "dev": true,
3241 |           "optional": true
3242 |         }
3243 |       }
3244 |     },
3245 |     "read-pkg": {
3246 |       "version": "2.0.0",
3247 |       "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
3248 |       "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
3249 |       "dev": true,
3250 |       "requires": {
3251 |         "load-json-file": "^2.0.0",
3252 |         "normalize-package-data": "^2.3.2",
3253 |         "path-type": "^2.0.0"
3254 |       }
3255 |     },
3256 |     "read-pkg-up": {
3257 |       "version": "2.0.0",
3258 |       "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
3259 |       "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
3260 |       "dev": true,
3261 |       "requires": {
3262 |         "find-up": "^2.0.0",
3263 |         "read-pkg": "^2.0.0"
3264 |       },
3265 |       "dependencies": {
3266 |         "find-up": {
3267 |           "version": "2.1.0",
3268 |           "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
3269 |           "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
3270 |           "dev": true,
3271 |           "requires": {
3272 |             "locate-path": "^2.0.0"
3273 |           }
3274 |         }
3275 |       }
3276 |     },
3277 |     "readable-stream": {
3278 |       "version": "2.3.6",
3279 |       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
3280 |       "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
3281 |       "dev": true,
3282 |       "optional": true,
3283 |       "requires": {
3284 |         "core-util-is": "~1.0.0",
3285 |         "inherits": "~2.0.3",
3286 |         "isarray": "~1.0.0",
3287 |         "process-nextick-args": "~2.0.0",
3288 |         "safe-buffer": "~5.1.1",
3289 |         "string_decoder": "~1.1.1",
3290 |         "util-deprecate": "~1.0.1"
3291 |       }
3292 |     },
3293 |     "readdirp": {
3294 |       "version": "2.1.0",
3295 |       "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
3296 |       "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
3297 |       "dev": true,
3298 |       "optional": true,
3299 |       "requires": {
3300 |         "graceful-fs": "^4.1.2",
3301 |         "minimatch": "^3.0.2",
3302 |         "readable-stream": "^2.0.2",
3303 |         "set-immediate-shim": "^1.0.1"
3304 |       }
3305 |     },
3306 |     "regenerate": {
3307 |       "version": "1.4.0",
3308 |       "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
3309 |       "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
3310 |       "dev": true
3311 |     },
3312 |     "regenerator-runtime": {
3313 |       "version": "0.11.1",
3314 |       "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
3315 |       "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
3316 |       "dev": true
3317 |     },
3318 |     "regenerator-transform": {
3319 |       "version": "0.10.1",
3320 |       "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
3321 |       "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
3322 |       "dev": true,
3323 |       "requires": {
3324 |         "babel-runtime": "^6.18.0",
3325 |         "babel-types": "^6.19.0",
3326 |         "private": "^0.1.6"
3327 |       }
3328 |     },
3329 |     "regex-cache": {
3330 |       "version": "0.4.4",
3331 |       "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
3332 |       "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
3333 |       "dev": true,
3334 |       "optional": true,
3335 |       "requires": {
3336 |         "is-equal-shallow": "^0.1.3"
3337 |       }
3338 |     },
3339 |     "regexpp": {
3340 |       "version": "2.0.0",
3341 |       "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.0.tgz",
3342 |       "integrity": "sha512-g2FAVtR8Uh8GO1Nv5wpxW7VFVwHcCEr4wyA8/MHiRkO8uHoR5ntAA8Uq3P1vvMTX/BeQiRVSpDGLd+Wn5HNOTA==",
3343 |       "dev": true
3344 |     },
3345 |     "regexpu-core": {
3346 |       "version": "2.0.0",
3347 |       "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
3348 |       "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
3349 |       "dev": true,
3350 |       "requires": {
3351 |         "regenerate": "^1.2.1",
3352 |         "regjsgen": "^0.2.0",
3353 |         "regjsparser": "^0.1.4"
3354 |       }
3355 |     },
3356 |     "regjsgen": {
3357 |       "version": "0.2.0",
3358 |       "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
3359 |       "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
3360 |       "dev": true
3361 |     },
3362 |     "regjsparser": {
3363 |       "version": "0.1.5",
3364 |       "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
3365 |       "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
3366 |       "dev": true,
3367 |       "requires": {
3368 |         "jsesc": "~0.5.0"
3369 |       },
3370 |       "dependencies": {
3371 |         "jsesc": {
3372 |           "version": "0.5.0",
3373 |           "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
3374 |           "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
3375 |           "dev": true
3376 |         }
3377 |       }
3378 |     },
3379 |     "remove-trailing-separator": {
3380 |       "version": "1.1.0",
3381 |       "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
3382 |       "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
3383 |       "dev": true
3384 |     },
3385 |     "repeat-element": {
3386 |       "version": "1.1.2",
3387 |       "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
3388 |       "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
3389 |       "dev": true
3390 |     },
3391 |     "repeat-string": {
3392 |       "version": "1.6.1",
3393 |       "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
3394 |       "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
3395 |       "dev": true,
3396 |       "optional": true
3397 |     },
3398 |     "repeating": {
3399 |       "version": "2.0.1",
3400 |       "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
3401 |       "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
3402 |       "dev": true,
3403 |       "requires": {
3404 |         "is-finite": "^1.0.0"
3405 |       }
3406 |     },
3407 |     "require-uncached": {
3408 |       "version": "1.0.3",
3409 |       "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
3410 |       "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
3411 |       "dev": true,
3412 |       "requires": {
3413 |         "caller-path": "^0.1.0",
3414 |         "resolve-from": "^1.0.0"
3415 |       }
3416 |     },
3417 |     "resolve": {
3418 |       "version": "1.8.1",
3419 |       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz",
3420 |       "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
3421 |       "dev": true,
3422 |       "requires": {
3423 |         "path-parse": "^1.0.5"
3424 |       }
3425 |     },
3426 |     "resolve-from": {
3427 |       "version": "1.0.1",
3428 |       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
3429 |       "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
3430 |       "dev": true
3431 |     },
3432 |     "restore-cursor": {
3433 |       "version": "2.0.0",
3434 |       "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
3435 |       "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
3436 |       "dev": true,
3437 |       "requires": {
3438 |         "onetime": "^2.0.0",
3439 |         "signal-exit": "^3.0.2"
3440 |       }
3441 |     },
3442 |     "rimraf": {
3443 |       "version": "2.6.2",
3444 |       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
3445 |       "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
3446 |       "dev": true,
3447 |       "requires": {
3448 |         "glob": "^7.0.5"
3449 |       }
3450 |     },
3451 |     "run-async": {
3452 |       "version": "2.3.0",
3453 |       "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
3454 |       "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
3455 |       "dev": true,
3456 |       "requires": {
3457 |         "is-promise": "^2.1.0"
3458 |       }
3459 |     },
3460 |     "rxjs": {
3461 |       "version": "6.3.3",
3462 |       "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
3463 |       "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
3464 |       "dev": true,
3465 |       "requires": {
3466 |         "tslib": "^1.9.0"
3467 |       }
3468 |     },
3469 |     "safe-buffer": {
3470 |       "version": "5.1.2",
3471 |       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
3472 |       "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
3473 |       "dev": true
3474 |     },
3475 |     "safer-buffer": {
3476 |       "version": "2.1.2",
3477 |       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
3478 |       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
3479 |       "dev": true
3480 |     },
3481 |     "semver": {
3482 |       "version": "5.5.0",
3483 |       "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
3484 |       "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
3485 |       "dev": true
3486 |     },
3487 |     "set-immediate-shim": {
3488 |       "version": "1.0.1",
3489 |       "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
3490 |       "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
3491 |       "dev": true,
3492 |       "optional": true
3493 |     },
3494 |     "shebang-command": {
3495 |       "version": "1.2.0",
3496 |       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
3497 |       "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
3498 |       "dev": true,
3499 |       "requires": {
3500 |         "shebang-regex": "^1.0.0"
3501 |       }
3502 |     },
3503 |     "shebang-regex": {
3504 |       "version": "1.0.0",
3505 |       "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
3506 |       "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
3507 |       "dev": true
3508 |     },
3509 |     "signal-exit": {
3510 |       "version": "3.0.2",
3511 |       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
3512 |       "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
3513 |       "dev": true
3514 |     },
3515 |     "sinon": {
3516 |       "version": "6.3.4",
3517 |       "resolved": "https://registry.npmjs.org/sinon/-/sinon-6.3.4.tgz",
3518 |       "integrity": "sha512-NIaR56Z1mefuRBXYrf4otqBxkWiKveX+fvqs3HzFq2b07HcgpkMgIwmQM/owNjNFAHkx0kJXW+Q0mDthiuslXw==",
3519 |       "dev": true,
3520 |       "requires": {
3521 |         "@sinonjs/commons": "^1.0.2",
3522 |         "@sinonjs/formatio": "^3.0.0",
3523 |         "@sinonjs/samsam": "^2.1.1",
3524 |         "diff": "^3.5.0",
3525 |         "lodash.get": "^4.4.2",
3526 |         "lolex": "^2.7.4",
3527 |         "nise": "^1.4.5",
3528 |         "supports-color": "^5.5.0",
3529 |         "type-detect": "^4.0.8"
3530 |       },
3531 |       "dependencies": {
3532 |         "supports-color": {
3533 |           "version": "5.5.0",
3534 |           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
3535 |           "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
3536 |           "dev": true,
3537 |           "requires": {
3538 |             "has-flag": "^3.0.0"
3539 |           }
3540 |         }
3541 |       }
3542 |     },
3543 |     "slash": {
3544 |       "version": "1.0.0",
3545 |       "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
3546 |       "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
3547 |       "dev": true
3548 |     },
3549 |     "slice-ansi": {
3550 |       "version": "1.0.0",
3551 |       "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
3552 |       "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
3553 |       "dev": true,
3554 |       "requires": {
3555 |         "is-fullwidth-code-point": "^2.0.0"
3556 |       }
3557 |     },
3558 |     "source-map": {
3559 |       "version": "0.5.7",
3560 |       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
3561 |       "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
3562 |       "dev": true
3563 |     },
3564 |     "source-map-support": {
3565 |       "version": "0.4.18",
3566 |       "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
3567 |       "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
3568 |       "dev": true,
3569 |       "requires": {
3570 |         "source-map": "^0.5.6"
3571 |       }
3572 |     },
3573 |     "spdx-correct": {
3574 |       "version": "3.0.1",
3575 |       "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.1.tgz",
3576 |       "integrity": "sha512-hxSPZbRZvSDuOvADntOElzJpenIR7wXJkuoUcUtS0erbgt2fgeaoPIYretfKpslMhfFDY4k0MZ2F5CUzhBsSvQ==",
3577 |       "dev": true,
3578 |       "requires": {
3579 |         "spdx-expression-parse": "^3.0.0",
3580 |         "spdx-license-ids": "^3.0.0"
3581 |       }
3582 |     },
3583 |     "spdx-exceptions": {
3584 |       "version": "2.1.0",
3585 |       "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
3586 |       "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==",
3587 |       "dev": true
3588 |     },
3589 |     "spdx-expression-parse": {
3590 |       "version": "3.0.0",
3591 |       "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
3592 |       "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
3593 |       "dev": true,
3594 |       "requires": {
3595 |         "spdx-exceptions": "^2.1.0",
3596 |         "spdx-license-ids": "^3.0.0"
3597 |       }
3598 |     },
3599 |     "spdx-license-ids": {
3600 |       "version": "3.0.1",
3601 |       "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz",
3602 |       "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==",
3603 |       "dev": true
3604 |     },
3605 |     "sprintf-js": {
3606 |       "version": "1.0.3",
3607 |       "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
3608 |       "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
3609 |       "dev": true
3610 |     },
3611 |     "string-width": {
3612 |       "version": "2.1.1",
3613 |       "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
3614 |       "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
3615 |       "dev": true,
3616 |       "requires": {
3617 |         "is-fullwidth-code-point": "^2.0.0",
3618 |         "strip-ansi": "^4.0.0"
3619 |       },
3620 |       "dependencies": {
3621 |         "ansi-regex": {
3622 |           "version": "3.0.0",
3623 |           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
3624 |           "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
3625 |           "dev": true
3626 |         },
3627 |         "strip-ansi": {
3628 |           "version": "4.0.0",
3629 |           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
3630 |           "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
3631 |           "dev": true,
3632 |           "requires": {
3633 |             "ansi-regex": "^3.0.0"
3634 |           }
3635 |         }
3636 |       }
3637 |     },
3638 |     "string_decoder": {
3639 |       "version": "1.1.1",
3640 |       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
3641 |       "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
3642 |       "dev": true,
3643 |       "optional": true,
3644 |       "requires": {
3645 |         "safe-buffer": "~5.1.0"
3646 |       }
3647 |     },
3648 |     "strip-ansi": {
3649 |       "version": "3.0.1",
3650 |       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
3651 |       "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
3652 |       "dev": true,
3653 |       "requires": {
3654 |         "ansi-regex": "^2.0.0"
3655 |       }
3656 |     },
3657 |     "strip-bom": {
3658 |       "version": "3.0.0",
3659 |       "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
3660 |       "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
3661 |       "dev": true
3662 |     },
3663 |     "strip-json-comments": {
3664 |       "version": "2.0.1",
3665 |       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
3666 |       "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
3667 |       "dev": true
3668 |     },
3669 |     "supports-color": {
3670 |       "version": "2.0.0",
3671 |       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
3672 |       "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
3673 |       "dev": true
3674 |     },
3675 |     "table": {
3676 |       "version": "4.0.3",
3677 |       "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz",
3678 |       "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==",
3679 |       "dev": true,
3680 |       "requires": {
3681 |         "ajv": "^6.0.1",
3682 |         "ajv-keywords": "^3.0.0",
3683 |         "chalk": "^2.1.0",
3684 |         "lodash": "^4.17.4",
3685 |         "slice-ansi": "1.0.0",
3686 |         "string-width": "^2.1.1"
3687 |       },
3688 |       "dependencies": {
3689 |         "ansi-styles": {
3690 |           "version": "3.2.1",
3691 |           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
3692 |           "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
3693 |           "dev": true,
3694 |           "requires": {
3695 |             "color-convert": "^1.9.0"
3696 |           }
3697 |         },
3698 |         "chalk": {
3699 |           "version": "2.4.1",
3700 |           "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
3701 |           "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
3702 |           "dev": true,
3703 |           "requires": {
3704 |             "ansi-styles": "^3.2.1",
3705 |             "escape-string-regexp": "^1.0.5",
3706 |             "supports-color": "^5.3.0"
3707 |           }
3708 |         },
3709 |         "supports-color": {
3710 |           "version": "5.5.0",
3711 |           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
3712 |           "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
3713 |           "dev": true,
3714 |           "requires": {
3715 |             "has-flag": "^3.0.0"
3716 |           }
3717 |         }
3718 |       }
3719 |     },
3720 |     "text-encoding": {
3721 |       "version": "0.6.4",
3722 |       "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz",
3723 |       "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=",
3724 |       "dev": true
3725 |     },
3726 |     "text-table": {
3727 |       "version": "0.2.0",
3728 |       "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
3729 |       "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
3730 |       "dev": true
3731 |     },
3732 |     "through": {
3733 |       "version": "2.3.8",
3734 |       "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
3735 |       "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
3736 |       "dev": true
3737 |     },
3738 |     "tmp": {
3739 |       "version": "0.0.33",
3740 |       "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
3741 |       "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
3742 |       "dev": true,
3743 |       "requires": {
3744 |         "os-tmpdir": "~1.0.2"
3745 |       }
3746 |     },
3747 |     "to-fast-properties": {
3748 |       "version": "1.0.3",
3749 |       "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
3750 |       "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
3751 |       "dev": true
3752 |     },
3753 |     "trim-right": {
3754 |       "version": "1.0.1",
3755 |       "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
3756 |       "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
3757 |       "dev": true
3758 |     },
3759 |     "tslib": {
3760 |       "version": "1.9.3",
3761 |       "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
3762 |       "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
3763 |       "dev": true
3764 |     },
3765 |     "type-check": {
3766 |       "version": "0.3.2",
3767 |       "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
3768 |       "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
3769 |       "dev": true,
3770 |       "requires": {
3771 |         "prelude-ls": "~1.1.2"
3772 |       }
3773 |     },
3774 |     "type-detect": {
3775 |       "version": "4.0.8",
3776 |       "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
3777 |       "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
3778 |       "dev": true
3779 |     },
3780 |     "uglify-js": {
3781 |       "version": "3.4.9",
3782 |       "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz",
3783 |       "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==",
3784 |       "dev": true,
3785 |       "requires": {
3786 |         "commander": "~2.17.1",
3787 |         "source-map": "~0.6.1"
3788 |       },
3789 |       "dependencies": {
3790 |         "source-map": {
3791 |           "version": "0.6.1",
3792 |           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
3793 |           "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
3794 |           "dev": true
3795 |         }
3796 |       }
3797 |     },
3798 |     "uri-js": {
3799 |       "version": "4.2.2",
3800 |       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
3801 |       "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
3802 |       "dev": true,
3803 |       "requires": {
3804 |         "punycode": "^2.1.0"
3805 |       }
3806 |     },
3807 |     "user-home": {
3808 |       "version": "1.1.1",
3809 |       "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
3810 |       "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
3811 |       "dev": true
3812 |     },
3813 |     "util-deprecate": {
3814 |       "version": "1.0.2",
3815 |       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
3816 |       "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
3817 |       "dev": true,
3818 |       "optional": true
3819 |     },
3820 |     "v8flags": {
3821 |       "version": "2.1.1",
3822 |       "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
3823 |       "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
3824 |       "dev": true,
3825 |       "requires": {
3826 |         "user-home": "^1.1.1"
3827 |       }
3828 |     },
3829 |     "validate-npm-package-license": {
3830 |       "version": "3.0.4",
3831 |       "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
3832 |       "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
3833 |       "dev": true,
3834 |       "requires": {
3835 |         "spdx-correct": "^3.0.0",
3836 |         "spdx-expression-parse": "^3.0.0"
3837 |       }
3838 |     },
3839 |     "which": {
3840 |       "version": "1.3.1",
3841 |       "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
3842 |       "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
3843 |       "dev": true,
3844 |       "requires": {
3845 |         "isexe": "^2.0.0"
3846 |       }
3847 |     },
3848 |     "wordwrap": {
3849 |       "version": "1.0.0",
3850 |       "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
3851 |       "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
3852 |       "dev": true
3853 |     },
3854 |     "wrappy": {
3855 |       "version": "1.0.2",
3856 |       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
3857 |       "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
3858 |       "dev": true
3859 |     },
3860 |     "write": {
3861 |       "version": "0.2.1",
3862 |       "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
3863 |       "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
3864 |       "dev": true,
3865 |       "requires": {
3866 |         "mkdirp": "^0.5.1"
3867 |       }
3868 |     }
3869 |   }
3870 | }
3871 | 
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "name": "loglevel-plugin-remote",
 3 |   "description": "A loglevel plugin for sending browser logs to a server",
 4 |   "author": {
 5 |     "name": "kutuluk"
 6 |   },
 7 |   "keywords": [
 8 |     "loglevel",
 9 |     "plugin"
10 |   ],
11 |   "homepage": "https://github.com/kutuluk/loglevel-plugin-remote",
12 |   "bugs": {
13 |     "url": "https://github.com/kutuluk/loglevel-plugin-remote/issues"
14 |   },
15 |   "repository": {
16 |     "type": "git",
17 |     "url": "git@github.com:kutuluk/loglevel-plugin-remote.git"
18 |   },
19 |   "license": "MIT",
20 |   "version": "0.6.8",
21 |   "main": "./lib/loglevel-plugin-remote",
22 |   "babel": {
23 |     "presets": [
24 |       [
25 |         "env",
26 |         {
27 |           "targets": {
28 |             "browsers": [
29 |               "ie >= 7"
30 |             ]
31 |           }
32 |         }
33 |       ]
34 |     ],
35 |     "plugins": [
36 |       "add-module-exports",
37 |       "transform-es2015-modules-umd"
38 |     ]
39 |   },
40 |   "scripts": {
41 |     "eslint": "eslint src/remote.js",
42 |     "test": "mocha",
43 |     "babel": "babel ./src/remote.js --out-file ./lib/loglevel-plugin-remote.js",
44 |     "uglifyjs": "uglifyjs ./lib/loglevel-plugin-remote.js -o ./dist/loglevel-plugin-remote.min.js -c -m reserved=[remote]",
45 |     "build": "npm run eslint && npm run babel && npm run uglifyjs",
46 |     "release": "npm install && npm run build && npm test && npm publish"
47 |   },
48 |   "devDependencies": {
49 |     "babel-cli": "^6.26.0",
50 |     "babel-plugin-add-module-exports": "^0.2.1",
51 |     "babel-plugin-transform-es2015-modules-umd": "^6.24.1",
52 |     "babel-preset-env": "^1.7.0",
53 |     "chai": "^4.2.0",
54 |     "eslint": "^5.6.0",
55 |     "eslint-config-airbnb-base": "^13.1.0",
56 |     "eslint-plugin-chai-friendly": "^0.4.1",
57 |     "eslint-plugin-import": "^2.14.0",
58 |     "loglevel": "^1.6.1",
59 |     "loglevel-plugin-mock": "^0.1.0",
60 |     "mocha": "^5.2.0",
61 |     "sinon": "^6.3.4",
62 |     "uglify-js": "^3.4.9"
63 |   },
64 |   "dependencies": {}
65 | }
66 | 
--------------------------------------------------------------------------------
/src/remote.js:
--------------------------------------------------------------------------------
  1 | const win = window;
  2 | 
  3 | if (!win) {
  4 |   throw new Error('Plugin for browser usage only');
  5 | }
  6 | 
  7 | let CIRCULAR_ERROR_MESSAGE;
  8 | 
  9 | // https://github.com/nodejs/node/blob/master/lib/util.js
 10 | function tryStringify(arg) {
 11 |   try {
 12 |     return JSON.stringify(arg);
 13 |   } catch (error) {
 14 |     // Populate the circular error message lazily
 15 |     if (!CIRCULAR_ERROR_MESSAGE) {
 16 |       try {
 17 |         const a = {};
 18 |         a.a = a;
 19 |         JSON.stringify(a);
 20 |       } catch (circular) {
 21 |         CIRCULAR_ERROR_MESSAGE = circular.message;
 22 |       }
 23 |     }
 24 |     if (error.message === CIRCULAR_ERROR_MESSAGE) {
 25 |       return '[Circular]';
 26 |     }
 27 |     throw error;
 28 |   }
 29 | }
 30 | 
 31 | function getConstructorName(obj) {
 32 |   if (!Object.getOwnPropertyDescriptor || !Object.getPrototypeOf) {
 33 |     return Object.prototype.toString.call(obj).slice(8, -1);
 34 |   }
 35 | 
 36 |   // https://github.com/nodejs/node/blob/master/lib/internal/util.js
 37 |   while (obj) {
 38 |     const descriptor = Object.getOwnPropertyDescriptor(obj, 'constructor');
 39 |     if (
 40 |       descriptor !== undefined
 41 |       && typeof descriptor.value === 'function'
 42 |       && descriptor.value.name !== ''
 43 |     ) {
 44 |       return descriptor.value.name;
 45 |     }
 46 | 
 47 |     obj = Object.getPrototypeOf(obj);
 48 |   }
 49 | 
 50 |   return '';
 51 | }
 52 | 
 53 | function interpolate(array) {
 54 |   let result = '';
 55 |   let index = 0;
 56 | 
 57 |   if (array.length > 1 && typeof array[0] === 'string') {
 58 |     result = array[0].replace(/(%?)(%([sdjo]))/g, (match, escaped, ptn, flag) => {
 59 |       if (!escaped) {
 60 |         index += 1;
 61 |         const arg = array[index];
 62 |         let a = '';
 63 |         switch (flag) {
 64 |           case 's':
 65 |             a += arg;
 66 |             break;
 67 |           case 'd':
 68 |             a += +arg;
 69 |             break;
 70 |           case 'j':
 71 |             a = tryStringify(arg);
 72 |             break;
 73 |           case 'o': {
 74 |             let obj = tryStringify(arg);
 75 |             if (obj[0] !== '{' && obj[0] !== '[') {
 76 |               obj = `<${obj}>`;
 77 |             }
 78 |             a = getConstructorName(arg) + obj;
 79 |             break;
 80 |           }
 81 |         }
 82 |         return a;
 83 |       }
 84 |       return match;
 85 |     });
 86 | 
 87 |     // update escaped %% values
 88 |     result = result.replace(/%{2,2}/g, '%');
 89 | 
 90 |     index += 1;
 91 |   }
 92 | 
 93 |   // arguments remaining after formatting
 94 |   if (array.length > index) {
 95 |     if (result) result += ' ';
 96 |     result += array.slice(index).join(' ');
 97 |   }
 98 | 
 99 |   return result;
100 | }
101 | 
102 | const { hasOwnProperty } = Object.prototype;
103 | 
104 | // Light deep Object.assign({}, ...sources)
105 | function assign() {
106 |   const target = {};
107 |   for (let s = 0; s < arguments.length; s += 1) {
108 |     const source = Object(arguments[s]);
109 |     for (const key in source) {
110 |       if (hasOwnProperty.call(source, key)) {
111 |         target[key] = typeof source[key] === 'object' && !Array.isArray(source[key])
112 |           ? assign(target[key], source[key])
113 |           : source[key];
114 |       }
115 |     }
116 |   }
117 |   return target;
118 | }
119 | 
120 | function getStacktrace() {
121 |   try {
122 |     throw new Error();
123 |   } catch (trace) {
124 |     return trace.stack;
125 |   }
126 | }
127 | 
128 | function Queue(capacity) {
129 |   let queue = [];
130 |   let sent = [];
131 | 
132 |   this.length = () => queue.length;
133 |   this.sent = () => sent.length;
134 | 
135 |   this.push = (message) => {
136 |     queue.push(message);
137 |     if (queue.length > capacity) {
138 |       queue.shift();
139 |     }
140 |   };
141 | 
142 |   this.send = () => {
143 |     if (!sent.length) {
144 |       sent = queue;
145 |       queue = [];
146 |     }
147 |     return sent;
148 |   };
149 | 
150 |   this.confirm = () => {
151 |     sent = [];
152 |     this.content = '';
153 |   };
154 | 
155 |   this.fail = () => {
156 |     const overflow = 1 + queue.length + sent.length - capacity;
157 | 
158 |     if (overflow > 0) {
159 |       sent.splice(0, overflow);
160 |       queue = sent.concat(queue);
161 |       this.confirm();
162 |     }
163 |     // if (queue.length + sent.length >= capacity) this.confirm();
164 |   };
165 | }
166 | 
167 | const hasStacktraceSupport = !!getStacktrace();
168 | 
169 | let loglevel;
170 | let originalFactory;
171 | let pluginFactory;
172 | 
173 | function plain(log) {
174 |   return `[${log.timestamp}] ${log.level.label.toUpperCase()}${
175 |     log.logger ? ` (${log.logger})` : ''
176 |   }: ${log.message}${log.stacktrace ? `\n${log.stacktrace}` : ''}`;
177 | }
178 | 
179 | function json(log) {
180 |   log.level = log.level.label;
181 |   return log;
182 | }
183 | 
184 | function setToken() {
185 |   throw new Error("You can't set token for a not appled plugin");
186 | }
187 | 
188 | const save = win.remote;
189 | 
190 | const defaultCapacity = 500;
191 | const defaults = {
192 |   url: '/logger',
193 |   method: 'POST',
194 |   headers: {},
195 |   token: '',
196 |   onUnauthorized: () => {},
197 |   timeout: 0,
198 |   interval: 1000,
199 |   level: 'trace',
200 |   backoff: {
201 |     multiplier: 2,
202 |     jitter: 0.1,
203 |     limit: 30000,
204 |   },
205 |   capacity: 0,
206 |   stacktrace: {
207 |     levels: ['trace', 'warn', 'error'],
208 |     depth: 3,
209 |     excess: 0,
210 |   },
211 |   timestamp: () => new Date().toISOString(),
212 |   format: plain,
213 | };
214 | 
215 | const remote = {
216 |   noConflict() {
217 |     if (win.remote === remote) {
218 |       win.remote = save;
219 |     }
220 |     return remote;
221 |   },
222 |   plain,
223 |   json,
224 |   apply(logger, options) {
225 |     if (!logger || !logger.getLogger) {
226 |       throw new TypeError('Argument is not a root loglevel object');
227 |     }
228 | 
229 |     if (loglevel) {
230 |       throw new Error('You can assign a plugin only one time');
231 |     }
232 | 
233 |     if (!win.XMLHttpRequest) return logger;
234 | 
235 |     loglevel = logger;
236 | 
237 |     const config = assign(defaults, options);
238 | 
239 |     config.capacity = config.capacity || defaultCapacity;
240 | 
241 |     const { backoff } = config;
242 | 
243 |     const backoffFunc = typeof backoff === 'object'
244 |       ? (duration) => {
245 |         let next = duration * backoff.multiplier;
246 |         if (next > backoff.limit) next = backoff.limit;
247 |         next += next * backoff.jitter * Math.random();
248 |         return next;
249 |       }
250 |       : backoff;
251 | 
252 |     let { interval } = config;
253 |     let contentType;
254 |     let isJSON;
255 |     let isSending = false;
256 |     let isSuspended = false;
257 | 
258 |     const queue = new Queue(config.capacity);
259 | 
260 |     function send() {
261 |       if (isSuspended || isSending || config.token === undefined) {
262 |         return;
263 |       }
264 | 
265 |       if (!queue.sent()) {
266 |         if (!queue.length()) {
267 |           return;
268 |         }
269 | 
270 |         const logs = queue.send();
271 | 
272 |         queue.content = isJSON ? `{"logs":[${logs.join(',')}]}` : logs.join('\n');
273 |       }
274 | 
275 |       isSending = true;
276 | 
277 |       const xhr = new win.XMLHttpRequest();
278 |       xhr.open(config.method, config.url, true);
279 |       xhr.setRequestHeader('Content-Type', contentType);
280 |       if (config.token) {
281 |         xhr.setRequestHeader('Authorization', `Bearer ${config.token}`);
282 |       }
283 | 
284 |       const { headers } = config;
285 |       for (const header in headers) {
286 |         if (hasOwnProperty.call(headers, header)) {
287 |           const value = headers[header];
288 |           if (value) {
289 |             xhr.setRequestHeader(header, value);
290 |           }
291 |         }
292 |       }
293 | 
294 |       function suspend(successful) {
295 |         if (!successful) {
296 |           // interval = config.backoff(interval || 1);
297 |           interval = backoffFunc(interval || 1);
298 |           queue.fail();
299 |         }
300 | 
301 |         isSuspended = true;
302 |         win.setTimeout(() => {
303 |           isSuspended = false;
304 |           send();
305 |         }, interval);
306 |       }
307 | 
308 |       let timeout;
309 |       if (config.timeout) {
310 |         timeout = win.setTimeout(() => {
311 |           isSending = false;
312 |           xhr.abort();
313 |           suspend();
314 |         }, config.timeout);
315 |       }
316 | 
317 |       xhr.onreadystatechange = () => {
318 |         if (xhr.readyState !== 4) {
319 |           return;
320 |         }
321 | 
322 |         isSending = false;
323 |         win.clearTimeout(timeout);
324 | 
325 |         if (xhr.status === 200) {
326 |           // eslint-disable-next-line prefer-destructuring
327 |           interval = config.interval;
328 |           queue.confirm();
329 |           suspend(true);
330 |         } else {
331 |           if (xhr.status === 401) {
332 |             const { token } = config;
333 |             config.token = undefined;
334 |             config.onUnauthorized(token);
335 |           }
336 |           suspend();
337 |         }
338 |       };
339 | 
340 |       xhr.send(queue.content);
341 |     }
342 | 
343 |     originalFactory = logger.methodFactory;
344 | 
345 |     pluginFactory = function remoteMethodFactory(methodName, logLevel, loggerName) {
346 |       const rawMethod = originalFactory(methodName, logLevel, loggerName);
347 |       const needStack = hasStacktraceSupport
348 |         && config.stacktrace.levels.some(level => level === methodName);
349 |       const levelVal = loglevel.levels[methodName.toUpperCase()];
350 |       const needLog = levelVal >= loglevel.levels[config.level.toUpperCase()];
351 | 
352 |       return (...args) => {
353 |         if (needLog) {
354 |           const timestamp = config.timestamp();
355 | 
356 |           let stacktrace = needStack ? getStacktrace() : '';
357 |           if (stacktrace) {
358 |             const lines = stacktrace.split('\n');
359 |             lines.splice(0, config.stacktrace.excess + 3);
360 |             const { depth } = config.stacktrace;
361 |             if (depth && lines.length !== depth + 1) {
362 |               const shrink = lines.splice(0, depth);
363 |               stacktrace = shrink.join('\n');
364 |               if (lines.length) stacktrace += `\n    and ${lines.length} more`;
365 |             } else {
366 |               stacktrace = lines.join('\n');
367 |             }
368 |           }
369 | 
370 |           const log = config.format({
371 |             message: interpolate(args),
372 |             level: {
373 |               label: methodName,
374 |               value: levelVal,
375 |             },
376 |             logger: loggerName || '',
377 |             timestamp,
378 |             stacktrace,
379 |           });
380 | 
381 |           if (isJSON === undefined) {
382 |             isJSON = typeof log !== 'string';
383 |             contentType = isJSON ? 'application/json' : 'text/plain';
384 |           }
385 | 
386 |           let content = '';
387 |           if (isJSON) {
388 |             try {
389 |               content += JSON.stringify(log);
390 |             } catch (error) {
391 |               rawMethod(...args);
392 |               loglevel.getLogger('logger').error(error);
393 |               return;
394 |             }
395 |           } else {
396 |             content += log;
397 |           }
398 | 
399 |           queue.push(content);
400 |           send();
401 |         }
402 | 
403 |         rawMethod(...args);
404 |       };
405 |     };
406 | 
407 |     logger.methodFactory = pluginFactory;
408 |     logger.setLevel(logger.getLevel());
409 | 
410 |     remote.setToken = (token) => {
411 |       config.token = token;
412 |       send();
413 |     };
414 | 
415 |     return logger;
416 |   },
417 |   disable() {
418 |     if (!loglevel) {
419 |       throw new Error("You can't disable a not appled plugin");
420 |     }
421 | 
422 |     if (pluginFactory !== loglevel.methodFactory) {
423 |       throw new Error("You can't disable a plugin after appling another plugin");
424 |     }
425 | 
426 |     loglevel.methodFactory = originalFactory;
427 |     loglevel.setLevel(loglevel.getLevel());
428 |     loglevel = undefined;
429 |     remote.setToken = setToken;
430 |   },
431 |   setToken,
432 | };
433 | 
434 | export default remote;
435 | 
--------------------------------------------------------------------------------
/test/.eslintrc.json:
--------------------------------------------------------------------------------
 1 | {
 2 |     "extends": "airbnb-base",
 3 |     "plugins": [
 4 |         "chai-friendly"
 5 |     ],
 6 |     "env": {
 7 |         "mocha": true,
 8 |         "es6": true
 9 |     },
10 |     "rules": {
11 |         "no-unused-expressions": "off",
12 |         "chai-friendly/no-unused-expressions": 2,
13 |         "comma-dangle": "off"
14 |     }
15 | }
--------------------------------------------------------------------------------
/test/test.js:
--------------------------------------------------------------------------------
  1 | const { expect } = require('chai');
  2 | const loglevel = require('loglevel');
  3 | const sinon = require('sinon');
  4 | 
  5 | global.window = {
  6 |   XMLHttpRequest: sinon.useFakeXMLHttpRequest(),
  7 |   setTimeout(fn) {
  8 |     fn();
  9 |   },
 10 |   clearTimeout() {}
 11 | };
 12 | 
 13 | const other = require('loglevel-plugin-mock');
 14 | const plugin = require('../lib/loglevel-plugin-remote');
 15 | 
 16 | loglevel.setLevel('info');
 17 | 
 18 | describe('API', () => {
 19 |   afterEach(() => {
 20 |     try {
 21 |       plugin.disable();
 22 |       // eslint-disable-next-line no-empty
 23 |     } catch (ignore) {}
 24 |     try {
 25 |       other.disable();
 26 |       // eslint-disable-next-line no-empty
 27 |     } catch (ignore) {}
 28 |     try {
 29 |       plugin.disable();
 30 |       // eslint-disable-next-line no-empty
 31 |     } catch (ignore) {}
 32 |   });
 33 | 
 34 |   it('Methods', () => {
 35 |     expect(plugin)
 36 |       .to.have.property('apply')
 37 |       .with.be.a('function');
 38 |     expect(plugin)
 39 |       .to.have.property('noConflict')
 40 |       .with.be.a('function');
 41 |     expect(plugin)
 42 |       .to.have.property('plain')
 43 |       .with.be.a('function');
 44 |     expect(plugin)
 45 |       .to.have.property('json')
 46 |       .with.be.a('function');
 47 |     expect(plugin)
 48 |       .to.have.property('disable')
 49 |       .with.be.a('function');
 50 |     expect(plugin)
 51 |       .to.have.property('setToken')
 52 |       .with.be.a('function');
 53 |   });
 54 | 
 55 |   it('Empty arguments', () => {
 56 |     expect(plugin.apply).to.throw(TypeError, 'Argument is not a root loglevel object');
 57 |   });
 58 | 
 59 |   it('Not root loglevel argument', () => {
 60 |     expect(() => plugin.apply(loglevel.getLogger('log'))).to.throw(
 61 |       TypeError,
 62 |       'Argument is not a root loglevel object'
 63 |     );
 64 |   });
 65 | 
 66 |   it('Right applying', () => {
 67 |     expect(() => plugin.apply(loglevel)).to.not.throw();
 68 |   });
 69 | 
 70 |   it('Reapplying should throw an exception', () => {
 71 |     plugin.apply(loglevel);
 72 | 
 73 |     expect(() => plugin.apply(loglevel)).to.throw(Error, 'You can assign a plugin only one time');
 74 |   });
 75 | 
 76 |   it('Right disabling', () => {
 77 |     plugin.apply(loglevel);
 78 | 
 79 |     expect(plugin.disable).to.not.throw();
 80 |   });
 81 | 
 82 |   it('Disabling a not appled plugin should throw an exception', () => {
 83 |     expect(plugin.disable).to.throw(Error, "You can't disable a not appled plugin");
 84 |   });
 85 | 
 86 |   it('setToken for a not appled plugin should throw an exception', () => {
 87 |     expect(plugin.setToken).to.throw(Error, "You can't set token for a not appled plugin");
 88 |   });
 89 | 
 90 |   it('Disabling after using another plugin should throw an exception', () => {
 91 |     plugin.apply(loglevel);
 92 |     other.apply(loglevel);
 93 | 
 94 |     expect(plugin.disable).to.throw(
 95 |       Error,
 96 |       "You can't disable a plugin after appling another plugin"
 97 |     );
 98 |   });
 99 | });
100 | 
101 | describe('Common', () => {
102 |   it('All methods of the previous plugin should be called', () => {
103 |     const spy = sinon.spy();
104 | 
105 |     other.apply(loglevel, { method: spy });
106 |     plugin.apply(loglevel, { interval: 0 });
107 | 
108 |     loglevel.enableAll();
109 |     loglevel.trace('trace');
110 |     loglevel.debug('debug');
111 |     loglevel.info('info');
112 |     loglevel.warn('warn');
113 |     loglevel.error('error');
114 |     expect(spy.callCount).to.equal(5);
115 | 
116 |     plugin.disable();
117 |     other.disable();
118 |     spy.resetHistory();
119 |   });
120 | });
121 | 
122 | describe('Requests', () => {
123 |   let server;
124 |   const successful = [200, { 'Content-Type': 'text/plain', 'Content-Length': 2 }, 'OK'];
125 |   const fail = [404, {}, ''];
126 |   const unauthorized = [401, {}, ''];
127 | 
128 |   const quote = '"';
129 |   const acute = '`';
130 |   const apos = "'";
131 |   const bs = '\\';
132 |   const escape = `escape-${bs}n${bs}${quote}${bs}${acute}${bs}${apos}${bs}${bs}`;
133 | 
134 |   const time = new Date().toISOString();
135 |   const timestamp = () => time;
136 | 
137 |   const simple = log => `${log.message}${log.stacktrace ? `\n${log.stacktrace}` : ''}`;
138 | 
139 |   function requests() {
140 |     const result = [];
141 |     server.requests.forEach((request) => {
142 |       result.push(`${request.status}: ${request.requestBody.replace(/\n/g, '')}`);
143 |     });
144 |     return result;
145 |   }
146 | 
147 |   function receivedPlain() {
148 |     let result = [];
149 |     server.requests.forEach((request) => {
150 |       if (request.status === 200) {
151 |         result = result.concat(request.requestBody.split('\n'));
152 |       }
153 |     });
154 |     return result;
155 |   }
156 | 
157 |   function receivedJSON() {
158 |     let result = [];
159 |     server.requests.forEach((request) => {
160 |       if (request.status === 200) {
161 |         result = result.concat(JSON.parse(request.requestBody).logs);
162 |       }
163 |     });
164 |     return result;
165 |   }
166 | 
167 |   beforeEach(() => {
168 |     other.apply(loglevel);
169 |     server = sinon.fakeServer.create();
170 |   });
171 | 
172 |   afterEach(() => {
173 |     plugin.disable();
174 |     other.disable();
175 |   });
176 | 
177 |   it('The plain log must be received', () => {
178 |     plugin.apply(loglevel, { format: simple });
179 | 
180 |     loglevel.info(`plain-${escape}`);
181 | 
182 |     server.respondWith(successful);
183 |     server.respond();
184 | 
185 |     const expected = [`plain-${escape}`];
186 | 
187 |     expect(expected).to.eql(receivedPlain());
188 |   });
189 | 
190 |   it('The log must be received', () => {
191 |     plugin.apply(loglevel, { format: simple, level: 'info' });
192 | 
193 |     loglevel.info(`plain-${escape}`);
194 | 
195 |     server.respondWith(successful);
196 |     server.respond();
197 | 
198 |     const expected = [`plain-${escape}`];
199 | 
200 |     expect(expected).to.eql(receivedPlain());
201 |   });
202 | 
203 |   it('The log should not be received', () => {
204 |     plugin.apply(loglevel, { format: simple, level: 'error' });
205 | 
206 |     loglevel.info(`plain-${escape}`);
207 | 
208 |     server.respondWith(successful);
209 |     server.respond();
210 | 
211 |     expect(server.requests.length).to.eql(0);
212 |   });
213 | 
214 |   it('The json log must be received', () => {
215 |     plugin.apply(loglevel, {
216 |       format: plugin.json,
217 |       timestamp
218 |     });
219 | 
220 |     loglevel.info(`json-${escape}`);
221 | 
222 |     server.respondWith(successful);
223 |     server.respond();
224 | 
225 |     const expected = [
226 |       {
227 |         message: `json-${escape}`,
228 |         level: 'info',
229 |         logger: '',
230 |         timestamp: time,
231 |         stacktrace: ''
232 |       }
233 |     ];
234 | 
235 |     expect(expected).to.eql(receivedJSON());
236 |   });
237 | 
238 |   it('Custom header must be received', () => {
239 |     plugin.apply(loglevel, { format: simple, headers: { 'my-header': 'my-header-value' } });
240 | 
241 |     loglevel.info('header test');
242 | 
243 |     server.respondWith(successful);
244 |     server.respond();
245 | 
246 |     expect(server.requests[0].requestHeaders['my-header']).to.eql('my-header-value');
247 |   });
248 | 
249 |   it('The log from child logger must be received', () => {
250 |     plugin.apply(loglevel, {
251 |       format: plugin.json,
252 |       timestamp
253 |     });
254 | 
255 |     loglevel.getLogger('child').info('child logger');
256 | 
257 |     server.respondWith(successful);
258 |     server.respond();
259 | 
260 |     const expected = [
261 |       {
262 |         message: 'child logger',
263 |         level: 'info',
264 |         logger: 'child',
265 |         timestamp: time,
266 |         stacktrace: ''
267 |       }
268 |     ];
269 | 
270 |     expect(expected).to.eql(receivedJSON());
271 |   });
272 | 
273 |   it('Custom plain', () => {
274 |     const getCounter = () => {
275 |       let count = 1;
276 |       // eslint-disable-next-line no-plusplus
277 |       return () => count++;
278 |     };
279 |     const counter = getCounter();
280 | 
281 |     const custom = log => `[${counter()}] ${log.message}`;
282 | 
283 |     plugin.apply(loglevel, {
284 |       format: custom,
285 |       timestamp
286 |     });
287 | 
288 |     server.respondWith(successful);
289 | 
290 |     loglevel.info('Message one');
291 |     server.respond();
292 |     loglevel.info('Message two');
293 |     server.respond();
294 | 
295 |     const expected = ['[1] Message one', '[2] Message two'];
296 | 
297 |     expect(expected).to.eql(receivedPlain());
298 |   });
299 | 
300 |   it('Custom JSON', () => {
301 |     const getCounter = () => {
302 |       let count = 1;
303 |       // eslint-disable-next-line no-plusplus
304 |       return () => count++;
305 |     };
306 |     const counter = getCounter();
307 | 
308 |     const custom = log => ({
309 |       msg: log.message,
310 |       lvl: log.level.value,
311 |       log: log.logger,
312 |       loc: 'home',
313 |       count: counter()
314 |     });
315 | 
316 |     plugin.apply(loglevel, {
317 |       format: custom,
318 |       timestamp
319 |     });
320 | 
321 |     server.respondWith(successful);
322 | 
323 |     loglevel.info('Message one');
324 |     server.respond();
325 |     loglevel.info('Message two');
326 |     server.respond();
327 | 
328 |     const expected = [
329 |       {
330 |         msg: 'Message one',
331 |         lvl: 2,
332 |         log: '',
333 |         loc: 'home',
334 |         count: 1
335 |       },
336 |       {
337 |         msg: 'Message two',
338 |         lvl: 2,
339 |         log: '',
340 |         loc: 'home',
341 |         count: 2
342 |       }
343 |     ];
344 | 
345 |     expect(expected).to.eql(receivedJSON());
346 |   });
347 | 
348 |   it('Stacktrace', () => {
349 |     plugin.apply(loglevel, {
350 |       format: simple,
351 |       // stacktrace: { depth: 4, excess: 1 }
352 |       stacktrace: { depth: 4 }
353 |     });
354 | 
355 |     function fn3() {
356 |       loglevel.trace('Stacktrace');
357 |     }
358 | 
359 |     function fn2() {
360 |       fn3();
361 |     }
362 | 
363 |     function fn1() {
364 |       fn2();
365 |     }
366 | 
367 |     fn1();
368 | 
369 |     server.respondWith(successful);
370 |     server.respond();
371 | 
372 |     expect(receivedPlain()[0]).to.include('Stacktrace');
373 |     expect(receivedPlain()[1]).to.include('fn3');
374 |     expect(receivedPlain()[2]).to.include('fn2');
375 |     expect(receivedPlain()[3]).to.include('fn1');
376 |     expect(receivedPlain()[4]).to.include('Context.it');
377 |     expect(receivedPlain()[5]).to.include('more');
378 |   });
379 | 
380 |   it('Undefined token', () => {
381 |     plugin.apply(loglevel, {
382 |       format: simple,
383 |       token: undefined
384 |     });
385 | 
386 |     server.respondWith(successful);
387 | 
388 |     loglevel.info('A');
389 |     server.respond();
390 |     loglevel.info('B');
391 |     server.respond();
392 | 
393 |     const expectedBefore = [];
394 | 
395 |     expect(expectedBefore).to.eql(receivedPlain());
396 | 
397 |     plugin.setToken('token');
398 | 
399 |     server.respond();
400 | 
401 |     const expectedAfter = ['A', 'B'];
402 | 
403 |     expect(expectedAfter).to.eql(receivedPlain());
404 |   });
405 | 
406 |   it('onUnauthorized must be called', () => {
407 |     const spy = sinon.spy();
408 | 
409 |     plugin.apply(loglevel, {
410 |       format: simple,
411 |       onUnauthorized: spy
412 |     });
413 | 
414 |     server.respondWith(unauthorized);
415 | 
416 |     loglevel.info('auth');
417 |     server.respond();
418 |     loglevel.info('auth');
419 |     server.respond();
420 | 
421 |     expect(spy.callCount).to.equal(1);
422 | 
423 |     spy.resetHistory();
424 |   });
425 | 
426 |   it('Test down server', () => {
427 |     plugin.apply(loglevel, {
428 |       format: simple,
429 |       capacity: 3
430 |     });
431 | 
432 |     server.respondWith(fail);
433 |     loglevel.info('A');
434 |     server.respond();
435 |     loglevel.info('B');
436 |     server.respond();
437 |     loglevel.info('C');
438 |     server.respond();
439 |     loglevel.info('D');
440 |     server.respond();
441 | 
442 |     server.respondWith(successful);
443 |     loglevel.info('E');
444 |     server.respond();
445 |     server.respond();
446 | 
447 |     /*
448 |                          | sent | queue |                   | sent | queue |
449 |     ------------------------------------------------------------------------
450 |     info(A)              |      |     A |-> send(A)         |    A |       |
451 |     respond(A)-> fail    |    A |       |-> send(A)         |    A |       |
452 |     info(B)              |    A |     B |  !send (sending)  |--------------|
453 |     respond(A)-> fail    |    A |     B |-> send(A)         |    A |     B |
454 |     info(C)              |    A |    BC |  !send (sending)  |--------------|
455 |     respond(A)-> fail    |      |    BC |-> send(BC)        |   BC |       |
456 |     info(D)              |   BC |     D |  !send (sending)  |--------------|
457 |     respond(BC)-> fail   |      |    CD |-> send(CD)        |   CD |       |
458 |     info(E)              |   CD |     E |  !send (sending)  |--------------|
459 |     respond(CD)-> succ   |      |     E |-> send(E)         |    E |       |
460 |     respond(E)-> succ    |      |       |  !send (empty)    |--------------|
461 |     */
462 | 
463 |     // const expected = ['404: A', '404: A', '404: A', '404: BC', '200: CD', '200: E'];
464 |     const expected = ['C', 'D', 'E'];
465 | 
466 |     expect(expected).to.eql(receivedPlain());
467 |   });
468 | 
469 |   it('Test fast sending', () => {
470 |     plugin.apply(loglevel, {
471 |       format: simple,
472 |       capacity: 3
473 |     });
474 | 
475 |     server.respondWith(successful);
476 |     loglevel.info('A');
477 |     loglevel.info('B');
478 |     loglevel.info('C');
479 |     loglevel.info('D');
480 |     loglevel.info('E');
481 |     loglevel.info('F');
482 |     server.respond();
483 |     server.respond();
484 | 
485 |     /*
486 |                          | sent | queue |                   | sent | queue |
487 |     ------------------------------------------------------------------------
488 |     info(A)              |      |     A |-> send(A)         |    A |       |
489 |     info(B)              |    A |     B |  !send (sending)  |--------------|
490 |     info(C)              |    A |    BC |  !send (sending)  |--------------|
491 |     info(D)              |    A |   BCD |  !send (sending)  |--------------|
492 |     info(E)              |    A |   CDE |  !send (sending)  |--------------|
493 |     info(F)              |    A |   DEF |  !send (sending)  |--------------|
494 |     respond(A)->(succ)   |      |   DEF |-> send(DEF)       |  DEF |       |
495 |     respond(DEF)->(succ) |      |       |  !send (empty)    |--------------|
496 |     */
497 |     const expected = ['200: A', '200: DEF'];
498 | 
499 |     expect(expected).to.eql(requests());
500 |   });
501 | });
502 | 
--------------------------------------------------------------------------------