From 36506de12aef1538535cbd6e3c4a8bce1d998e16 Mon Sep 17 00:00:00 2001 From: Stijn de Witt Date: Sat, 14 Nov 2020 19:35:39 +0100 Subject: [PATCH] 2.0.0-beta.8: Completely rewritten from the ground up --- .gitignore | 7 +- .travis.yml | 13 - LICENSE | 21 + LICENSE.md | 161 - README.md | 712 +-- _config.yml | 1 - browser.js | 22 - build.js | 27 + build/build-umd.js | 28 - core/grab.js | 12 + core/index.js | 111 + core/test.js | 136 + debug.js | 65 - debug.spec.js | 75 - docs/_config.yml | 1 - example.js | 13 + full.bundle.js | 9 + full.js | 9 + full.min.js | 1 + main.bundle.js | 8 + main.js | 6 + microscopical.spec.js | 10 - mods/config/args.browser.js | 6 + mods/config/args.js | 5 + mods/config/env.browser.js | 1 + mods/config/env.js | 1 + mods/config/index.js | 33 + mods/config/parse.js | 15 + mods/config/read.browser.js | 13 + mods/config/read.js | 30 + mods/config/test.config | 3 + mods/config/test.js | 58 + mods/config/update.js | 16 + mods/config/watch.browser.js | 15 + mods/config/watch.js | 29 + mods/formats/index.js | 47 + mods/formats/json.js | 5 + mods/formats/lvl.js | 5 + mods/formats/name.js | 5 + mods/formats/pad.js | 8 + mods/formats/record.js | 19 + mods/formats/simple.browser.js | 7 + mods/formats/simple.js | 8 + mods/formats/structured.js | 25 + mods/formats/test.js | 38 + mods/index.js | 9 + mods/kurly/date.js | 9 + mods/kurly/format.js | 9 + mods/kurly/index.js | 24 + mods/kurly/lvl.js | 5 + mods/kurly/name.js | 5 + mods/kurly/perf.js | 12 + mods/kurly/time.js | 8 + mods/levels/default.browser.js | 1 + mods/levels/default.js | 1 + mods/levels/index.js | 47 + mods/levels/test.js | 72 + mods/options/index.js | 125 + mods/options/test.js | 96 + mods/outputs/index.js | 40 + mods/outputs/test.js | 50 + mods/props/index.js | 70 + mods/props/test.js | 100 + mods/settings/index.js | 80 + mods/settings/test.js | 55 + mods/test.js | 7 + node.js | 90 - package-lock.json | 6953 ++++++++++++---------------- package.json | 104 +- screenshot.jpg | Bin 0 -> 69258 bytes test.js | 143 + test/browser-source-map-support.js | 89 - test/console.js | 19 - test/debug.html | 11 - test/index.html | 11 - tutorial.html | 222 + ulog.js | 85 - ulog.min.js | 2 +- ulog.min.js.map | 1 - ulog.spec.js | 642 --- ulog.umd.js | 112 - ulog.umd.js.map | 1 - webpack.config.js | 31 +- 83 files changed, 5354 insertions(+), 5827 deletions(-) delete mode 100644 .travis.yml create mode 100644 LICENSE delete mode 100644 LICENSE.md delete mode 100644 _config.yml delete mode 100644 browser.js create mode 100644 build.js delete mode 100644 build/build-umd.js create mode 100644 core/grab.js create mode 100644 core/index.js create mode 100644 core/test.js delete mode 100644 debug.js delete mode 100644 debug.spec.js delete mode 100644 docs/_config.yml create mode 100644 example.js create mode 100644 full.bundle.js create mode 100644 full.js create mode 100644 full.min.js create mode 100644 main.bundle.js create mode 100644 main.js delete mode 100644 microscopical.spec.js create mode 100644 mods/config/args.browser.js create mode 100644 mods/config/args.js create mode 100644 mods/config/env.browser.js create mode 100644 mods/config/env.js create mode 100644 mods/config/index.js create mode 100644 mods/config/parse.js create mode 100644 mods/config/read.browser.js create mode 100644 mods/config/read.js create mode 100644 mods/config/test.config create mode 100644 mods/config/test.js create mode 100644 mods/config/update.js create mode 100644 mods/config/watch.browser.js create mode 100644 mods/config/watch.js create mode 100644 mods/formats/index.js create mode 100644 mods/formats/json.js create mode 100644 mods/formats/lvl.js create mode 100644 mods/formats/name.js create mode 100644 mods/formats/pad.js create mode 100644 mods/formats/record.js create mode 100644 mods/formats/simple.browser.js create mode 100644 mods/formats/simple.js create mode 100644 mods/formats/structured.js create mode 100644 mods/formats/test.js create mode 100644 mods/index.js create mode 100644 mods/kurly/date.js create mode 100644 mods/kurly/format.js create mode 100644 mods/kurly/index.js create mode 100644 mods/kurly/lvl.js create mode 100644 mods/kurly/name.js create mode 100644 mods/kurly/perf.js create mode 100644 mods/kurly/time.js create mode 100644 mods/levels/default.browser.js create mode 100644 mods/levels/default.js create mode 100644 mods/levels/index.js create mode 100644 mods/levels/test.js create mode 100644 mods/options/index.js create mode 100644 mods/options/test.js create mode 100644 mods/outputs/index.js create mode 100644 mods/outputs/test.js create mode 100644 mods/props/index.js create mode 100644 mods/props/test.js create mode 100644 mods/settings/index.js create mode 100644 mods/settings/test.js create mode 100644 mods/test.js delete mode 100644 node.js create mode 100644 screenshot.jpg create mode 100644 test.js delete mode 100644 test/browser-source-map-support.js delete mode 100644 test/console.js delete mode 100644 test/debug.html delete mode 100644 test/index.html create mode 100644 tutorial.html delete mode 100644 ulog.js delete mode 100644 ulog.min.js.map delete mode 100644 ulog.spec.js delete mode 100644 ulog.umd.js delete mode 100644 ulog.umd.js.map diff --git a/.gitignore b/.gitignore index 66fd66c..fb12865 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ -node_modules -npm-debug.log* +/dist +/node_modules +/ulog.min.js +/.nyc_output +/test.min.js diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 9308537..0000000 --- a/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: node_js -node_js: - - "node" - - "6" - - "5" - - "4" - - "0.10" -# https://github.com/greenkeeperio/greenkeeper-lockfile -before_install: -- npm install -g npm@5 -- npm install -g greenkeeper-lockfile@1 -before_script: greenkeeper-lockfile-update -after_script: greenkeeper-lockfile-upload \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..efe9b30 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Stijn de Witt + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 1dec0b0..0000000 --- a/LICENSE.md +++ /dev/null @@ -1,161 +0,0 @@ -## creative commons - -# Attribution 4.0 International - -Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. - -### Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. - -* __Considerations for licensors:__ Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. [More considerations for licensors](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensors). - -* __Considerations for the public:__ By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. [More considerations for the public](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensees). - -## Creative Commons Attribution 4.0 International Public License - -By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. - -### Section 1 – Definitions. - -a. __Adapted Material__ means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. - -b. __Adapter's License__ means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. - -c. __Copyright and Similar Rights__ means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. - -d. __Effective Technological Measures__ means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. - -e. __Exceptions and Limitations__ means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. - -f. __Licensed Material__ means the artistic or literary work, database, or other material to which the Licensor applied this Public License. - -g. __Licensed Rights__ means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. - -h. __Licensor__ means the individual(s) or entity(ies) granting rights under this Public License. - -i. __Share__ means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. - -j. __Sui Generis Database Rights__ means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. - -k. __You__ means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. - -### Section 2 – Scope. - -a. ___License grant.___ - - 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: - - A. reproduce and Share the Licensed Material, in whole or in part; and - - B. produce, reproduce, and Share Adapted Material. - - 2. __Exceptions and Limitations.__ For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. - - 3. __Term.__ The term of this Public License is specified in Section 6(a). - - 4. __Media and formats; technical modifications allowed.__ The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. - - 5. __Downstream recipients.__ - - A. __Offer from the Licensor – Licensed Material.__ Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. - - B. __No downstream restrictions.__ You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. - - 6. __No endorsement.__ Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). - -b. ___Other rights.___ - - 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this Public License. - - 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. - -### Section 3 – License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the following conditions. - -a. ___Attribution.___ - - 1. If You Share the Licensed Material (including in modified form), You must: - - A. retain the following if it is supplied by the Licensor with the Licensed Material: - - i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of warranties; - - v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; - - B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and - - C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. - - 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. - - 4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License. - -### Section 4 – Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: - -a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; - -b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and - -c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. - -### Section 5 – Disclaimer of Warranties and Limitation of Liability. - -a. __Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.__ - -b. __To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.__ - -c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. - -### Section 6 – Term and Termination. - -a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. - -b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. - -c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. - -d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. - -### Section 7 – Other Terms and Conditions. - -a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. - -b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. - -### Section 8 – Interpretation. - -*a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. - -b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. - -c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. - -d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. - -``` -Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at [creativecommons.org/policies](http://creativecommons.org/policies), Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. - -Creative Commons may be contacted at creativecommons.org -``` \ No newline at end of file diff --git a/README.md b/README.md index 80c36d5..98976d4 100644 --- a/README.md +++ b/README.md @@ -1,207 +1,291 @@ -# ulog v2.0.0-beta.7 -### Microscopically small universal logging library +# ulog v2.0.0-beta.8 +### The Universal Logger [![npm](https://img.shields.io/npm/v/ulog.svg)](https://npmjs.com/package/ulog) -[![license](https://img.shields.io/npm/l/ulog.svg)](https://creativecommons.org/licenses/by/4.0/) +[![license](https://img.shields.io/npm/l/ulog.svg)](https://opensource.org/licenses/MIT) [![travis](https://img.shields.io/travis/Download/ulog.svg)](https://travis-ci.org/Download/ulog) -[![greenkeeper](https://img.shields.io/david/Download/ulog.svg)](https://greenkeeper.io/) ![mind BLOWN](https://img.shields.io/badge/mind-BLOWN-ff69b4.svg) . -![logo](https://cdn.rawgit.com/download/ulog/1.0.0/ulog.png) +![logo](https://unpkg.com/ulog@2.0.0-beta.8/ulog.png) -`ulog` started as [Picolog](https://npmjs.com/package/picolog), the smallest -possible logging library I could build that could act as a drop-in replacement -for the native console (which varied wildly across environments back then). -Compared to `picolog`, `ulog` adds some features from -[debug](https://npmjs.com/package/debug) that I missed. Even with these extra -features, `ulog` is still **very** small, weighing in just over 1 kB minified -and gzipped. +## The logger for applications -## ulog v2 +`ulog` is *the* logger for Javascript applications. It's universal, meaning it runs everywhere. You can use `ulog` in your Express server application running on Node JS just as well as in your React single page application running in the browser. It just works. -In version 2, `ulog` is more compatible with `debug` than ever before. -The biggest change is that the logger objects returned from `ulog()` are no -longer objects. They are functions, just like in `debug`. But unlike the -functions returned by `debug`, those from `ulog` are *also* fully functional -logger objects will all methods we have on the native console and more. +![screenshot](https://unpkg.com/ulog@2.0.0-beta.8/screenshot.jpg) -For most code using `ulog` v1 or `debug`, upgrading to `ulog` v2 should be -relatively painless. The only backward-incompatibility this version introduces -compared to `ulog` v1 is the fact that the statement `typeof log == 'object'` -is no longer true for `ulog` v2 loggers. For code -[using `ulog` as a replacement for `debug`](#using-ulog-as-a-replacement-for-debug), -the upgrade path should be easier than for `ulog` v1, because of the improved -compatibility in v2. -### beta -Please try out the latest v2 beta. To do so, you need to add a beta flag to the -npm install command: +## Install ```sh -npm install --save ulog@beta +npm i -S anylogger ulog ``` -I do recommend trying out the beta, but if you just need the tried and tested -v1, switch branch to the latest 1.x tag for the docs for that release and just -don't add the beta flag to your npm install command. +### Add to entry point +In the entry point of your application import `ulog`: +*index.js* +```js +import "ulog" +``` -## Install -I recommend installing `ulog` with NPM: +## Use -```sh -npm install --save ulog +In your code, import `anylogger` and use it to create loggers and do logging: + +```js +import anylogger from 'anylogger' +const log = anylogger('my-app') +log('Logging is easy!') ``` -You should also be able to use e.g. Yarn etc. +This way, your code is decoupled from `ulog` and if you ever want to switch to another logging library, you will be able to do so without having to change any of that code. +> **anylogger** +> [`anylogger`](https://npmjs.com/package/anylogger) is a logging facade that allows code to use logging without getting coupled to a specific logging system. You can use that code with any logging system out there. -## Download -If you want the file for the browser to include in your project yourself, -you can download it from here. +## The logger for libraries -* [ulog.umd.js](https://cdn.rawgit.com/download/ulog/2.0.0-beta.7/ulog.umd.js) (~3kB, source) -* [ulog.min.js](https://cdn.rawgit.com/download/ulog/2.0.0-beta.7/ulog.min.js) (~2kB, minified) +When we write a library to be used by other libraries or applications, we typically don't want to decide which logger these libraries or applications should use. Instead, we want to use whatever logging framework the client code is using. +### Install ulog as a dev dependency -## Include in your app +We can have the cake and eat it to. We can decouple our library from `ulog` +for the client code, while still using it in development. To do so, we install +`anylogger` as a regular dependency and `ulog` as a dev dependency: -I recommend using `require` or `import` in your projects and bundling a browser -version with Webpack. +```sh +npm install --save anylogger && npm install --save-dev ulog +``` -### require -*my-module.js* +In our tests: + +*test.js* ```js -var ulog = require('ulog') -var log = ulog('my-module') -// or, shorthand -var log = require('ulog')('my-module') + import `ulog` ``` -### import -*my-module.js* -```sh -import ulog from 'ulog' -const log = ulog('my-module') +In our library code: + +*my-lib.js* +```js + import anylogger + const log = anylogger('my-lib') + log('Logging is easy') ``` -### Script tag + +## Script tag + If you want, you can import `ulog` with a script tag: ```html - + + ``` *myscript.js* ```js - var log = ulog('my-module') + var log = anylogger('my-module') + log('Logging is easy!') ``` +Or, if you want the full version: -## Logging methods - -`ulog` defines 6 logging methods, which correspond with available log levels: -```js -log.error('This logs an ERROR message') -log.warn('This logs a WARN message') -log.info('This logs an INFO message') -log.log('This logs a LOG message') -log.debug('This logs a DEBUG message') -log.trace('This logs a TRACE message') +```html + ``` -Note how these methods are all from the -[standard console API](https://console.spec.whatwg.org/). -Whenever possible, calls to these methods go directly to the corresponding -native method. -> On some systems, `debug()` is not natively available. -In addition, ulog v2 defines some additional methods that map to native -functions and are there to increase compatibility with other popular logging -libraries: +## Download + +If you want the file for the browser to include in your project yourself, you can download it from here. + +* [ulog.min.js](https://unpkg.com/ulog@2.0.0-beta.8) (~2.8kB minified and gzipped) +* [full.min.js](https://unpkg.com/ulog@2.0.0-beta.8/full.min.js) (~3.5kB minified and gzipped) + + +## Why `ulog` + +The two most popular logging libraries on NPM at the moment are [`debug`](https://npmjs.com/package/debug) and [`loglevel`](https://npmjs.com/package/loglevel), with 85.6M and 8.8M weekly downloads, respectively. They are both great loggers, but neither of them completely satisfied my requirements for a logging library. + +`debug` has a simple API and is configurable on both Node JS via environment variables and in the browser via localStorage, though not dynamic, requiring a restart before changes take effect. It's simplicity makes it an excellent choice for debug logging (as it's name implies), but it lacks support for log levels, so if you want to log error messages for example, you end up needing another library for that. It offers nicely formatted (and even colored!) log messages, but because of that mangles the call stack, which is a huge downside in the browser imho. It offers some rudimentary support for configuring the destination of log messages, allowing you to send logging to a file instead of the console. Weighing in at 3.1kB minified and gzipped, it's a bit large for the feature set that it offers. And it's not very extensible either, basically being a monolith. + +`loglevel` does offer log levels. These names start to make sense now right? It's API is also simple, but it has a global logger which is a downside imho as it allows for 'anonymous' logging, making it less suitable for debug logging. Also, though it's API is modeled after that of the console (a good thing imho), it does not have the `console.log` method, so it's not quitte a drop-in replacement for the console. It's configurable via localStorage but not via environment variables and just like `debug` requires a restart before configuration changes take effect. By default, it leaves your call stack alone, making the filename/line number entries in the browser console that much more useful. It does not offer alternative log destinations or formatters out of the box. It can be extended via plugins and there are some good plugins out there, but it's base feature set is coded as a monolith, so you cannot easily remove features. You probably won't have to though as it weighs only 1.4kB. + +Both these loggers lack the ability to configure the logger from the querystring, which I found to be a very desirable feature for web development as it allows you to create a URL that has the log config embedded, which you can then send to other developers or users etc. E.g: `https://example.com/page?log=debug`. + +Finally, both these loggers couple your code to the logging library. What I mean by that is that when you install a library using one of these loggers, that logger gets pulled in to your codebase. The downside of this is that in a more complex application using many libraries, you often end up with **both** loggers included in your app. In fact you often end up with 3 or even 4 logging libraries... which is a bit wasteful! + +What I want is a logging library that combines the best aspects of both these loggers and adds the features that I miss in both, without coupling the client code to it. Specifically here are the features that I want in my ultimate logging library: + +* Simple API (nothing can beat `debug`'s single log function, but `ulog` gets close) +* Supports all `console` log methods +* No 'anonymous' logging +* Configurable at runtime (without requiring a restart) +* Accepts configuration from the querystring +* Leaves the call stack alone +* Formatted log messages +* Configurable log output and formatting options built in +* Extensible +* Decoupled from client code +* Compact + +`ulog` is my attempt at building this library. It's base API is compatible with that of `debug` and `loglevel` and with the console, making it a drop-in replacement for all of these in many cases. It does not support 'anonymous' logging, so no hunting down where a log message came from and no log messages that cannot be suppressed. And it has a configuration mechanism that is compatible with that of `debug`, but that is more powerful and is monitored for changes at runtime. It accepts configuration from the querystring allowing you to craft URLs with log config embedded in it. And even though it uses a simple formatter by default, I found a way to do this without mangling the call stack, so the filename/line number entries in the browser console remain unharmed. You can specify where the log output should go and where it should drain. It's completely modular, so you can not only easily add features through 'mods', but you can actually even drop features you don't need by not loading the mods those features are in. It has native `anylogger` support, decoupling the client code from the logger. And even with `anylogger` included, it still weighs just 2.8kB. Substantially smaller than `debug`, but offering way more features. + + +## API + +`ulog` is very natural to use: ```js -log.verbose('This logs a message at level LOG using method log()') -log.silly('This logs a message at level TRACE using method log()') +var log = require('anylogger')('my-module') // same as with `debug` + +log('A log message') // same as with `debug` +log('info', 'An info message') // not possible with `debug` +log('warn', 'A warning message') // not possible with `debug` +log.info('Starting...') // same as with `loglevel` or console +log.log('Yeah!') // same as with console +log.error('Something went wrong', new Error('Oh no!')) +if (log.enabledFor('warn')) { + log.warn(expensiveArguments()) +} ``` +> Note that in the code above, we import `anylogger` and not `ulog`. This way the client code is decoupled from the logger. -Calls to all these methods will be direct calls to the native logging -functions if available and enabled. This means that there will be no code in -the callstack that is not yours. This helps with debugging because browsers -tend to show the file name and line number of the point the log call was made -from. When logging using these methods, line numbers shown in the console will -be from your code, not from some wrapper function. +`ulog` inherits it's API from `anylogger`. If you are able to restrict yourself to the [Anylogger API](https://www.npmjs.com/package/anylogger#anylogger-api), your code will be framework independent and will work with any supported logging library. -> In recent years, browsers have been adding features to ignore some parts of the call stack +Note that any logging code written for either `debug`, `loglevel` or the console should be able to do it's logging just like it did before, but now using a `ulog` logger instead. This backward compatibility should make migrating from any of these to `ulog` very easy. And because this is just the `anylogger` API, you should even be able to migrate back to `debug` or `loglevel` without any changes at all, by just including the right adapter in your entry point. Of course once you get used to `ulog`, you will never want to go back! :p -## log() +## Configure -In v2, the logger objects returned by `ulog` are functions. We can call them to -log messages, like so: +`ulog` features a simple, yet powerful and flexible configuration mechanism. On Node JS, we can configure `ulog` via program arguments, environment variables or a configuration file. On browsers, we use querystring arguments or localStorage. On both platforms, the configuration is monitored and changes to it are picked up by `ulog` at runtime without the need to restart the application. -```js -log('This logs a DEBUG message') +`ulog`'s configuration mechanism is an extension to that of [`debug`](https://npmjs.com/package/debug) and is compatible with it. `debug` is one of the most popular logging packages in the NPM ecosystem, with tens of thousands of packages depending on it, so having `ulog`'s configuration mechanism be compatible with it makes for a very smooth migration path. If your app or library is currently using `debug`, you should be able to replace it with `ulog` with no or only minor changes. + +We configure `ulog` by adjusting configuration options. Those options include (but are not limited to): +* [`log`](#config_option_log): The main setting to control logger's levels with +* [`debug`](#config_option_debug): For compatibility with `debug` +* [`log_config`](#config_option_log_config): To specify the configuration file (Node JS only) +* [`log_output`](#config_option_log_output): To configure where logging should go (defaults to `console`) +* [`log_drain`](#config_option_log_drain): To configure where logs should drain (defaults to `drain`) +* [`log_format`](#config_option_log_format): To configure the format for log messages + +### Via program arguments +On Node JS we can pass log configuration options as program arguments: +```sh +node ./myapp log=debug +``` +This should be helpful when making CLI applications. These strongly rely on console messages, but are also often used in scripted setups where we would actually want to suppress that logging. Don't go and build in all kinds of custom methods to configure the logging but just use `ulog` and rely on it's powerful configuration mechanism instead. + +### Via environment variables +On Node JS we can pass log configuration options via environment variables: +```sh +log=debug node ./myapp ``` -By default, this will log a message at level `DEBUG`. But we can change that -by specifying the desired log level as the first argument: +### Via a config file +On Node JS we can place our log configuration in a file that will be read at startup and monitored for changes at runtime: +*./log.config* +``` +log=debug +``` +### Via querystring parameters +In browsers, we can pass log configuration options as querystring parameters in the URL: +``` +https://example.com/page?log=debug +``` + +### Via localStorage +In browsers, we can place our log configuration in localStorage and it will be read at startup and monitored for changes at runtime: ```js -log('info', 'This logs an INFO message') +localStorage.setItem('log', 'debug') ``` +### Log configuration syntax +`debug` has a simple but powerful configuration mechanism. You set an environment variable or localStorage option named `DEBUG` and you assign it a value that expresses which loggers to enable. E.g.: -## Formatting +```sh +DEBUG=test,my:*,-my:lib +``` +The format is basically a comma-separated list of logger names, using the asterisk as a wildcard character and optionally negating the expression by preceding it with a minus sign. So the expression above includes `test` and `my:*` loggers, except for `my:lib` which is excluded. -In the section about [logging methods](#logging-methods) we discussed how calls to -these methods will be direct native calls whenever possible. This is great for our -line numbers. But this also means `ulog` can't do any formatting on these log calls. -And formatting log messages can be a great feature. +`ulog` extends this configuration mechanism. With `debug`, you can only turn loggers on and off, but `ulog` allows for a much more varied range of options. This is achieved by extending the configuration syntax so it also accepts the value applicable for the loggers matching the expression. Also we allow a semicolon-separated list of such expression=value pairs. For example, to set the logger `test` to debug and `my:*` loggers except for `my:lib` to info, we could write: -So for v2, calls to the new logger function will be intercepted, so we can do some -formatting if we want. No formatting is applied by default, but you can easily add -your own formatter like this: +```sh +log=test=debug;my:*,-my:lib=info +``` -```js -import ulog from 'ulog' +If an option only contains a value, `ulog` implicitly adds `*` as the expression. So we can write: +```sh +log=info +``` +and it's equivalent to +```sh +log=*=info +``` +We can even combine this. So we could write: +```sh +log=info;my:*=debug +``` +and it will set the level for all loggers to info, except for the ones starting with `my:`, which are set to debug. + +A special case is the config option [debug](#config_option_debug), which is designed to be compatible with `debug` so code using `ulog` will react to that setting in the same way. -function myFormat(logger, method, args){ - // add the logger name to the call - args.unshift(logger.name + ': ') -} -ulog.formats.push(myFormat) // from here on, our format is used +### Config option `log` +Configure the levels loggers should be filtered at. +```sh +log=test=debug;my:*,-my:lib=info ``` -Any code calling the logger function will have the formatting applied: +### Config option `debug` +Enables debug mode for the selected loggers. +```sh +debug=test,my:*,-my:lib +``` +This option is compatible with that of `debug`. -```js -import ulog from 'ulog' -const log = ulog('my-module') -log.level = log.DEBUG -log('Hello, World') // > 'my-module: Hello World' +### Config option `log_config` +Specify the path to the log configuration file, absolute or relative to the current working directory. Node JS only. Default to `./log.config`. This option does not support expressions. +```sh +log_config=./my.log.config ``` -Calls to native methods are not formatted: +### Config option `log_output` +Specify the name of the output logs should be written to. Defaults to `'console'`. +```sh +log_output=my:*,-my:lib=console +``` -```js -log.info('Hello, World') // > 'Hello World' +### Config option `log_drain` +Specify the name of the output logs should be drained to. Defaults to `drain`. +When log messages are filtered out, they are sent to the drain instead of to the normal output. The default `drain` output is just a noop, but you could override this to send them to a separate file for example. +```sh +log_drain=my:*,-my:lib=console +``` + +### Config option `log_format` +Specify the named format to use, or a custom format string. Defaults to `simple`. +```sh +log_format=simple;some-lib=none;my:*,-my:lib={date}{time}{lvl}{name}{message}{perf} ``` +This sets `simple` as the default format, while assigning `none` to `some-lib` and a custom format string to all loggers starting with `my:` except for `my:lib`. -Adding the option to add formatters came at a cost of ~50 bytes on the total -file but I feel it is worth it. +For more details, refer to the [section on formatting](#formatting) ## Logging levels -ulog defines 6 logging levels, which correspond with the natively available -logging functions: +`anylogger` defines 6 logging levels, which correspond with the natively available +logging functions on the console. `ulog` creates constants for these levels on all loggers: ```js log.ERROR // 1 @@ -212,14 +296,26 @@ log.DEBUG // 5 log.TRACE // 6 ``` -In addition, there is a 7th level that completely disables all logging: +In addition, `ulog` adds constants for pseudo-levels that enable or completely disable all logging: ```js +log.ALL // 9007199254740991 (Number.MAX_SAFE_INTEGER) log.NONE // 0 ``` -### log.level -To get or set the log level, we use the `log.level` property: +### `log.enabledFor` +`anylogger` defines `log.enabledFor` and `ulog` implements it by checking the logger's current log level and whether it's in debug mode. Normally, you should not have to use this method, unless you are doing some expensive calculations only to write log output. In such a case you can write: + +```js +import anylogger from 'anylogger' +const log = anylogger('my-app') +if (log.enabledFor('info')) { + log.info(calculateResults()) +} +``` + +### `log.level` +`ulog` adds a property `level` to each logger that is a numeric representation of the current log level. ```js if (log.level >= log.INFO) { @@ -232,247 +328,269 @@ log.level = log.NONE log.error('Logging is completely disabled.') ``` -> In general, code should not set the log level directly, but instead rely on -> the host environment for the log level. See the sections below about the -> [default log level](#default-log-level), the related -> [startup parameter](#changing-the-log-level-via-a-startup-parameter) and -> [debug mode](#debug-mode). +> In general, code should not set the log level directly, but instead should rely on the host environment for the log level. See the section on [configuring ulog](#configure). - -## Default log level - -I've found that it makes sense to have different default log levels in -the browser and in Node. In Node, logging is often the only UI we have -available and we (the devs) are the only ones that will see that logging. -In the browser, we have an alternative UI (the webpage itself), so +### Default log level +I've found that it makes sense to have different default log levels in the +browser and in Node. In Node, logging is often the only UI we have available +and we (the devs/admins) are the only ones that will see that logging. +In the browser, we have an alternative UI (the webpage itself), so logging will be less useful for normal users. -### In Node -In Node, the log level defaults to `log.INFO`. This allows you to use -INFO, WARN and ERROR when informing the user of stuff that happened. -With Picolog I found I had to resort to logging informational messages -at WARN because I wanted them to be visible with the default settings -and this did not feel right. +#### In Node +In Node, the log level defaults to `info`. This allows you to use +`info`, `warn` and `error` when informing the user of stuff that happened. -### In the browser -In the browser the log level defaults to `log.WARN`. This means INFO -messages will be excluded, but for most users these messages won't be -relevant anyway and we can easily change the log level in the browser -using a query parameter in the URL or localStorage (see next section). +#### In the browser +In the browser the log level defaults to `warn`. This means `info` +messages will be excluded, but for most users these messages won't be +relevant anyway. +> Attention! Chrome these days has it's own level filter and by default, debug messages are filtered away. -## Changing the log level -Changing the log level can be done in two ways: - 1. Programmatically, through the API - 2. Via a startup parameter +## Debug mode -### Changing the log level via the API -We can set the global log level directly on the `ulog` function: +Debug mode is a feature that `ulog` copied from `debug` and it responds to the +same [config option](#config_option_debug). Setting a logger to debug mode +effectively means forcing it's log level to be at least debug: -```js -import ulog from 'ulog' -ulog.level = ulog.DEBUG +```sh +DEBUG=my:app ``` -But this is not recommended for most code! It is much better to set the -log level directly on a single module and leave the global settings alone. - -We can set the level of a specific module in much the same way: ```js -import ulog from 'ulog' -const log = ulog('my-module') -log.level = log.DEBUG +import anylogger from 'anylogger' +const log = anylogger('my-app') +log('Hi!') // is output because logger is in debug mode ``` -For most code, it is best to treat `log.level` as if it was read-only, -and rely upon the environment to set the log level, using the startup -parameters described below. +## Outputs -### Changing the log level via a startup parameter -We can set the initial global log level with a startup parameter. In -Node we use an environment variable, whereas in the browser we use a -querystring parameter in the url or a key in localStorage. +Outputs is a feature that separates `ulog` from `debug` and `loglevel`. This corresponds with what other libraries sometimes refer to as 'appenders'. In `ulog`, where messages are going is completely configurable at runtime. You can even configure where discarded messages are going! -#### Environment variable -Set the environment variable `LOG` to the desired log level. +By default, all log methods on a logger are associated with one of two outputs, `output` and `drain`. To configure these, two properties are added on each logger: + +* `log.output`, defaults to `'console'` +* `log.drain`, defaults to `'drain'` + +These correspond with config options [`log_output`](#config_option_log_output) and [`log_drain`](#config_option_log_drain) respectively. + +By using a separate output for the drain, we can override the default behavior of using noops for all log levels that are outside of the active levels. We could for example send *all* logging to a database and only later filter it, when we display it for example. + +When the logger is created, each log method is sent either to the `output`, or to the `drain`, based on the current log level for that logger and whether that logger is in debug mode. + +To configure the output for a logger, we assign the name of the output to use +to the relevant logger: ```sh -$ LOG=info && node ./myapp.js -``` -or, in Windows: -```sh -$ set LOG=INFO && node ./myapp.js +log_output=console ``` -#### Querystring parameter -Add the parameter `log` to the querystring of the page: +By default, the following outputs are included: + +### Output `console` +This actually is the native console object. Using the native console directly is what allows us to leave the call stack intact in the browser developer tools. -`http://www.example.com/?log=debug` +### Output `drain` +This is just an object with a noop `log` function -Both the uppercase and lowercase names of the log levels work, -as well as their numerical values. +### Custom outputs +The default outputs are not very special, but the entire machinery is in place for you to easily add any custom outputs you could ever need. You can define additional outputs by making `ulog` use a mod with an `outputs` key: -#### localStorage key -Add the key `log` to the localStorage of the page: +*index.js* ```js -localStorage.setItem('log', 'info') +import ulog from 'ulog' +ulog.use({ + outputs: { + custom: { log: function(){ + var args = [].slice.call(arguments) + args.shift('Custom!!') + console.log.apply(console, args) + }} + } +}) ``` -then refresh the page. -Both the uppercase and lowercase names of the log levels work, -as well as their numerical values. +This way you can add outputs that send log messages to memory, a file, localStorage, a database etc etc. -## Debug mode +## Formatting -In addition to setting the global log level and setting the log levels of -individual loggers, you can also enable debug mode for a group of loggers. -When in debug mode, the logger's individual log level will only be used if -it is set to TRACE. Otherwise it will be ignored and the module will behave -as if its level was set to DEBUG. +Formatting is another feature that separates `ulog` from `debug` and `loglevel`. `debug` has formatting, but it is hardcoded and messes up the call stack and there is not much you can do about it. `loglevel` does not mess up the call stack, but it also has no formatting at all out of the box. If we are giving all loggers names, it would at least be good to see those names in the log output right? How else do we know which loggers to enable and disable? -### Enabling debug mode via the API -The `ulog` function has 3 methods that allow us to control debug mode: -* `ulog.enable(str)` - Enables debug mode for the loggers listed in `str` -* `ulog.enabled(name)` - Tests whether the logger is currently in debug mode -* `ulog.disable()` - Disables debug mode for all loggers +Turns out you can have the cake and eat it to. We can have formatted messages that do not mess up the call stack. The way we do it is by `bind`ing the extra information into the log methods at logger creation/extension time. Granted, you cannot do this with dynamic info that changes on every call, but the logger name is static for each log method so we can add this without disrupting the call stack. -The `*` character may be used as a wildcard. Suppose for example your module has -loggers named "connect:bodyParser", "connect:compress" and "connect:session". -Instead of listing all three with `connect:bodyParser,connect:compress,connect:session`, -you may simply use `connect:*`. +Below is a list of formats that come bundled with `ulog` and it is mentioned for each of them whether it leaves the call stack intact. -You can also exclude specific loggers by prefixing them with a "-" character. -For example, `*,-connect:*` would include all debuggers except those -starting with "connect:". +### Format `none` +This is a noop format that does not do anything. Leaves the call stack intact. -```js -// given modules app, lib, connect:bodyParser, connect:compress and connect:session -ulog.enable('app,connect:*') -ulog.enabled('app') // true -ulog.enabled('lib') // false -ulog.enabled('connect:compress') // true -ulog.enable('app,connect:*,-connect:compress') // negation symbol means 'except' -ulog.enabled('app') // true -ulog.enabled('lib') // false -ulog.enabled('connect:compress') // false -ulog.disable() -ulog.enabled('app') // false -``` - -### Enabling debug mode via a startup parameter -We can enable debug mode for some loggers using a startup parameter. On Node -we use environment variables and on the browser we use querystring parameters -or localStorage keys. - -#### Environment variable -Set the environment variable `DEBUG` to the string with logger names: +### Format `simple` +Adds the logger name (and level on Node JS) into the log methods. Leaves the call stack intact. + +Output looks like this on Node JS: -```sh -$ DEBUG=my-module && node ./myapp.js ``` -or, in Windows: -```sh -$ set DEBUG=my-module && node ./myapp.js +i my:logger This is an INFO message ``` -#### Querystring parameter -Add the parameter `debug` to the querystring of the page: - -`http://www.example.com/?`**`debug=my-module`** +and like this in browsers: -#### localStorage key -Add the key `debug` to the localStorage of the page: -```js -localStorage.setItem('debug', 'my-module') ``` -then refresh the page. +my:logger This is an INFO message +``` +> Most browsers already do an excellent job in showing the level a message was logged at, so here we don't add the level indicator. -## Using ulog as a replacement for debug +### Format `json` +Logs messages as JSON strings. Messes up the call stack. -If you are using `ulog` as a replacement for `debug`, you may want to try the -new endpoint `ulog/debug` introduced in v2: +Sometimes we prefer that all data is logged in some structured format. `json` is an example of how to do that. -```js -import ulog from 'ulog/debug' -const log = ulog('my-module') -const other = ulog('other-module') -log('Message') // > '20:15 my-module Message' -other('Another message') // > '20:15 other-module Another message' -``` +Output looks like this: -It is not doing that much at the moment but I plan to make this a -compatibility endpoint for debug. +``` +{"time":"2020-11-14T14:42:29.839Z","name":"my:logger","message":["This is a WARN message"],"level":2,"levelName":"warn","log_output":"console","log_drain":"drain","log_level":5,"log_format":"json"} +``` -You can also use this as a Webpack alias, to make all modules that use `debug` -switch to `ulog/debug` instead. Compatibility is not guaranteed though so your -mileage may vary: +### Make your own custom format +You can easily add your own custom format to the list above. To do so, just `ulog.use` a mod with a `formats` property including your format, like so: +*index.js* ```js -{ - resolve: { - alias: { - 'debug': 'ulog/debug' - } +import ulog from 'ulog' +ulog.use({ + formats: { + cool: function(logger) { + // will be called on logger creation/extension + // replace the default log methods with formatters + // use bind so we leave the call stack intact. + // only works for static info like our 'Cool!' message + for (var level in this.levels) logger[level] = logger[level].bind(logger, 'Cool!') + // don't forget to format the drain as well! + logger.drain = logger.drain.bind(logger, 'Cool!') } -} + } +}) ``` +### Custom format strings using kurly +To keep the base bundle size down, `ulog` only bundles the formats above in the default build. But you can very easily make `ulog` understand custom format strings. For example you could set: + +```sh +log_format={date}{time}{lvl}{name}{message}{perf} +``` +To get log output looking like this: -## Using ulog as a polyfill +``` +2020/10/14 15:46 i my:logger This is an INFO message +``` -ulog supports all functions in the -[NodeJS Console API](https://nodejs.org/api/console.html), so you should be -able to use it as a polyfill in environments where there is no `console` -available (e.g. Nashorn): +To support this, we need to include the mod `kurly`, which uses the template engine [`kurly`](https://npmjs.com/package/kurly) behind the surface to parse the custom format string. In our entry point, change this: +*index.js* ```js -// assuming you already made sure there is a `global` object -global.console = log; -console.info('Nashorn can do logging to!'); +import ulog ``` -Since v2, the logger objects are functions and not objects, which may affect -code testing for the existence of the console like: +to +*index.js* ```js -if (typeof console == 'object') { - // use the console -} + import ulog from 'ulog' + import kurly from 'ulog/mods/kurly' + ulog.use(kurly) ``` -Such tests will fail as of v2. I am hoping to solve this with a dedicated -`ulog/polyfill` endpoint, but have not yet got around to implementing it. -In the mean time you can use some `extend` function to create an object -from a logger function: +or, use the `ulog/full` endpoint instead: + +*index.js* +```js +import `ulog/full` +``` + +#### Kurly formatters +In the example above we were using tags like `{name}`, `{lvl}` etc. +The following is a list of such tags that are built in to the `kurly` mod: + +##### Formatter `date` +Returns the date part of the time the message was logged as `yyyy/MM/dd`. + +##### Formatter `time` +Returns the time part of the time the message was logged as `hh:mm`. + +##### Formatter `lvl` +Returns the level of the message as a single character: +* `'x'` for error messages +* `'!'` for warning messages +* `'i'` for info messages +* `' '` (space) for log, debug and trace messages + +##### Formatter `name` +Returns the name of the logger, right-padded with spaces for alignment. + +##### Formatter `perf` +Returns the difference in ms between two invocations to the same logger, only if this difference is larger than 1ms. Produces output that looks like `+62ms`. + +##### Fallback formatter +Any unrecognized tags are being interpreted by the fallback formatter. This just returns the field on the log record whose name matches. In the example above we were using `{message}`. This is an unrecognized tag so the wildcard formatter is used, which just returns the `message` field from the log record. To get an idea for what fields are available on the log record, use the [json](#format_json) format. + +#### Custom kurly formatters + +With custom kurly formatters we customize on a higher level of abstraction. Instead of replacing the entire format with a custom one, we write small functions that format just a part of the message, leaving the composition of the message as a whole to be configured with a custom format string. We can add custom `kurly` formatters in much the same way as we add custom formats: + +*index.js* ```js -// assuming you have some `extend` function: -global.console = extend({}, log) -console.info('Nashorn can do logging to!'); +import ulog from 'ulog' +import kurly from 'ulog/mods/kurly' +ulog.use(kurly) +ulog.use({ + formatters: { + custom: function(ctx) { + return function(rec) { + return 'Custom!' + } + } + } +}) ``` +To read more about kurly and custom kurly tags, refer to the kurly documentation on [creating kurly tags](https://www.npmjs.com/package/kurly#creating-tags) -## `assert` does not throw -ulog patches the [different behavior](https://github.com/jasnell/node/blob/master/doc/api/console.md#consoleassertvalue-message-args) -of `console.assert` in Node compared to browsers. In ulog, `assert` behaves -just like in the browsers and never throws. + +## Decoupling code from `debug` + +As I said before, `debug` is excellent for debug logging and there are tens of thousands of packages using it. The downside of this is that you will more or less get `debug` shoved through your throat if you include any of these libraries because they are *tighly coupled* to it. But we can uncouple them with the magic of bundlers like Webpack. + +To replace `debug` with `anylogger` everywhere, you can use this Webpack alias to make all modules that use `debug` switch to `anylogger` instead: + +```js +{ + resolve: { + alias: { + 'debug': 'anylogger' + } + } +} +``` + +This works because the anylogger API is backwards compatible with that of `debug`. And because `ulog` has native `anylogger` support, once you import `ulog` in your entry point, all those libraries that were using `debug` start to use `ulog` automagically! ## Performance considerations -The logging methods on the `log` object that correspond to a log level which -is higher than the currently set level, are replaced by no-op methods. As such, -you generally don't have to worry about the performance overhead of leaving +By default, the logging methods on the `log` object that correspond to a log level +which is higher than the currently set level, are replaced by no-op methods. As such, +you generally don't have to worry about the performance overhead of leaving the log statements in the production code. There is one exception to this rule though. If preparing the message itself is a costly operation, you may want to -surround the log code with an `if (log.level >= myLevel)` statement: +surround the log code with an `if (log.enabledFor(level))` statement: ```js -if (log.level >= log.INFO) { +if (log.enabledFor('info')) { var message = doLotsOfWorkToGenerateLogMessage(); log.info(message); } @@ -488,17 +606,19 @@ to let me know of any problems you find, or questions you may have. ## Credits Credits go to: -* Felix Geisendörfer from [debuggable.com](http://debuggable.com/) for kindly +* Felix Geisendörfer from [debuggable.com](http://debuggable.com/) for kindly giving up the `ulog` namespace on NPM. Thanks Felix! -* TJ Holowaychuk for creating [debug](https://github.com/visionmedia/debug), +* TJ Holowaychuk for creating [debug](https://npmjs.com/package/debug), which was a great inspiration for ulog. +* Tim Perry for creating [loglevel](https://npmjs.com/package/loglevel), + which was another great inspiration for ulog. ## Copyright -Copyright 2018 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved. +Copyright 2020 by [Stijn de Witt](https://stijndewitt.com). ## License -Licensed under the [Creative Commons Attribution 4.0 International (CC-BY-4.0)](https://creativecommons.org/licenses/by/4.0/) Open Source license. +Licensed under the [MIT](https://opensource.org/licenses/MIT) Open Source license. diff --git a/_config.yml b/_config.yml deleted file mode 100644 index 259a24e..0000000 --- a/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-tactile \ No newline at end of file diff --git a/browser.js b/browser.js deleted file mode 100644 index 141954d..0000000 --- a/browser.js +++ /dev/null @@ -1,22 +0,0 @@ -var log = require('./ulog') - -var qs = location.search.substring(1), - args = qs && qs.split('&'), - lvl, dbg, i, m - -try { - lvl = localStorage.getItem('log') - dbg = localStorage.getItem('debug') -} catch(e) {} - -for (i=0; m=args && args[i] && args[i].split('='); i++) { - m[0] == 'log' ? lvl = m[1] : 0 - m[0] == 'debug' ? dbg = m[1] : 0 -} - -log.con = function(){return window.console} -dbg && log.enable(dbg) -log() -log.level = lvl || log.WARN - -module.exports = log diff --git a/build.js b/build.js new file mode 100644 index 0000000..fed734f --- /dev/null +++ b/build.js @@ -0,0 +1,27 @@ +var fs = require('fs') +var path = require('path') + +var gzipSize = require('gzip-size') +// be cool and use ulog to print the logging in the build of ulog :) +var log = require('./')('ulog:build') + +var [ processName, script, command, ...args ] = process.argv +var pkg = JSON.parse(fs.readFileSync('./package.json', 'utf-8')) +var v = pkg.version + +;(function(){ + var data = fs.readFileSync(path.resolve(__dirname, pkg.unpkg), 'utf8') + var gzip = (gzipSize.sync(data) / 1024).toFixed(1) + log.info(`Built ${pkg.unpkg} (~${gzip} kB minified and gzipped)`) + data = fs.readFileSync(path.resolve(__dirname, 'full.min.js'), 'utf8') + var fullzip = (gzipSize.sync(data) / 1024).toFixed(1) + log.info(`Built full.min.js (~${fullzip} kB minified and gzipped)`) + var readme = fs.readFileSync('README.md', 'utf-8') + readme = readme.replace(/ulog@\d(\d)?\.\d(\d)?\.\d(\d)?(-[a-z]+\.\d(\d)?)?/g, `ulog@${v}`) + readme = readme.replace(/\\v\d(\d)?\.\d(\d)?\.\d(\d)?(-[a-z]+\.\d(\d)?)?/g, `v${v}`) + readme = readme.replace(/ulog@\d(\d)?\.\d(\d)?\.\d(\d)?(-[a-z]+\.\d(\d)?)?\) \(~\d\.\dkB/g, `ulog@${v}) (~${gzip}kB`) + readme = readme.replace(/just 2.7kB/g, `just ${gzip}kB`) + readme = readme.replace(/ulog@\d(\d)?\.\d(\d)?\.\d(\d)?(-[a-z]+\.\d(\d)?)?\/full\.min\.js\) \(~\d\.\dkB/g, `ulog@${v}/full.min.js) (~${fullzip}kB`) + fs.writeFileSync('README.md', readme, 'utf8') + log.info(`Updated README.md`) +})() \ No newline at end of file diff --git a/build/build-umd.js b/build/build-umd.js deleted file mode 100644 index ea714a5..0000000 --- a/build/build-umd.js +++ /dev/null @@ -1,28 +0,0 @@ -var fs = require('fs') -var path = require('path') - -var root = path.resolve(process.cwd()) - -var commonScript = fs.readFileSync(path.resolve(root, 'ulog.js'), 'utf8') -commonScript = commonScript.replace('module.exports = ulog', '') - -var browserScript = fs.readFileSync(path.resolve(root, 'browser.js'), 'utf8') -browserScript = browserScript.replace("var log = require('./ulog')", '') -browserScript = browserScript.replace('module.exports = log', 'return log') - -var combinedScript = commonScript + browserScript - -var umdScript = - "(function(u,m,d){\n" + - "\ttypeof define == 'function' && define.amd ? define(m,[],d) : (u[m] = d())\n" + - "})(this, \'ulog\', function(){'use strict'\n" + - combinedScript + '\n' + - "}) // umd\n" - -fs.writeFile(path.resolve(root, 'ulog.umd.js'), umdScript, function(err) { - if (err) console.log(err) - else { - var stats = fs.statSync("ulog.umd.js") - console.info("Saved ulog.umd.js: " + stats.size + ' bytes.'); - } -}); \ No newline at end of file diff --git a/core/grab.js b/core/grab.js new file mode 100644 index 0000000..36df19f --- /dev/null +++ b/core/grab.js @@ -0,0 +1,12 @@ +module.exports = function(ulog, name, result) { + ulog.mods.reduce(function(r,item){ + if (Array.isArray(r) && (name in item)) { + r.push(item[name]) + } else { + for (var o in item[name]) + r[o] = item[name][o] + } + return r + }, result) + return result +} diff --git a/core/index.js b/core/index.js new file mode 100644 index 0000000..ecb5517 --- /dev/null +++ b/core/index.js @@ -0,0 +1,111 @@ +var ulog = require('anylogger') +var grab = require('./grab') + +// ulog.levels.none = 0 +// ulog.levels.all = 9007199254740991 // Number.MAX_SAFE_INTEGER +// var ext = ulog.ext // save for later + +/** + * `ulog.ext(logger) => logger` + * + * Called when a logger needs to be extended, either because it was newly + * created, or because it's configuration or settings changed in some way. + * + * This method must ensure that a log method is available on the logger + * for each level in `ulog.levels`. + * + * This override calls `ext` on all mods when a logger is extended and + * enables calling ext on all loggers by passing no arguments. + */ +ulog.ext = function(logger) { + if (logger) { +// ext(logger) // create default methods + grab(ulog, 'ext', []).map(function(ext){ + ext.call(ulog, logger) // call hook on registered mods + }) + return logger + } else { + for (logger in ulog()) { + ulog.ext(ulog(logger)) + } + } +} + +ulog.mods = [] + +/** + * ### `ulog.use(mod: Object|Array): Number` + * + * Makes ulog use `mod`. + * + * The mod(s) is/are added to `ulog.mods`. This function checks whether `mod` + * is already in use and only adds it if needed. Checks whether `mod` has a key + * `use` containing mods `mod` depends on and adding those first, guaranteeing + * the order in which mods are added. Returns the total number of mods added, + * including transitive dependencies. + * + * @param mod A single mod object or an array of mod objects. + * @returns The number of mods that were added + * + * E.g.: + * ``` + * var mod = require('./mod') + * var solo = {} // the simplest mod is just an empty object + * var using = { + * // you can declare a dependency on other mods + * use: [ + * mod + * ] + * } + * + * ulog.add(solo) // returns 1 + * ulog.add(solo) // returns 0, because mods are only added once + * ulog.add(using) // returns 2, because `using` depends on `mod` + * ulog.add(mod) // returns 0, because `mod` was already added by `using` + * ``` + */ +ulog.use = function(mod) { + // handle mod being an array of mods + if (Array.isArray(mod)) { + return mod.reduce(function(r,mod){return r + ulog.use(mod)}, 0) + } + // handle mod being a single mod + var result = ulog.mods.indexOf(mod) === -1 ? 1 : 0 + if (result) { + if (mod.use) { + // use dependencies + result += ulog.use(mod.use) + } + if (mod.extend) { + for (var name in mod.extend) { + ulog[name] = mod.extend[name] + } + } + if (mod.init) { + mod.init.call(ulog) + } + ulog.mods.push(mod) + } + return result +} + +// ulog.grab = function(name){ +// return ulog.mods.reduce(function(r,mod){ +// for (var o in mod[name]) { +// r[o] = mod[name][o] +// } +// return r +// }, {}) +// } + +// var recorders = [] +// for (var i=0,mod; mod=ulog.mods[i]; i++) { +// if (mod.record) recorders.push(mod.record) +// } + + +// ulog.enabled = ulog.get.bind(ulog, 'debug') +// ulog.enable = ulog.set.bind(ulog, 'debug') +// ulog.disable = ulog.set.bind(ulog, 'debug', undefined) + +module.exports = ulog diff --git a/core/test.js b/core/test.js new file mode 100644 index 0000000..c371c8f --- /dev/null +++ b/core/test.js @@ -0,0 +1,136 @@ +var test = require('tape') +var sinon = require('sinon'); + +var ulog = require('./') + +test('ulog(name?: String, options?: Object): Object|Function', function(t) { + t.equal(typeof ulog, 'function', 'is a function') + t.ok('mods' in ulog, 'has a property `mods`') + t.equal(typeof ulog.ext, 'function', 'has a method `ext()`') + t.equal(typeof ulog.use, 'function', 'has a method `use()`') + t.equal(typeof ulog('test'), 'function', 'returns a Logger when called with a name as argument') + t.ok(typeof ulog() === 'object' && ('test' in ulog()), 'returns an object containing entries for all loggers when called without arguments') + delete ulog().test + + t.test('ulog.mods', function(t){ + t.ok(Array.isArray(ulog.mods), 'is an array') + t.end() + }) + + t.test('ulog.ext(logger: Function): Function', function(t){ + var mod = { ext: sinon.stub() } + ulog.use(mod) + var logger = ulog('test') + t.equal(mod.ext.callCount, 1, 'calls the `ext` handler on all registered mods') + delete ulog().test + ulog.mods.splice(0, ulog.mods.length) + t.end() + }) + + t.test('ulog.use(mod: Object|Array): Number', function (t) { + var mod = {} + var result = ulog.use(mod) + t.equal(ulog.mods.indexOf(mod), 0, 'adds single mods to `ulog.mods`') + t.equal(result, 1, 'returns 1 to indicate a single mod was added') + var result = ulog.use(mod) + t.equal(ulog.mods.length, 1, 'does not add the same mod twice') + t.equal(result, 0, 'returns 0 to indicate no mods were added') + ulog.mods.splice(0, ulog.mods.length) + + var anotherMod = {} + result = ulog.use([ mod, anotherMod ]) + t.equal(ulog.mods.length, 2, 'adds arrays with mods to `ulog.mods`') + t.equal(result, 2, 'returns 2 to indicate two mods were added') + ulog.mods.splice(0, ulog.mods.length) + + var dependency = {} + var modWithDeps = { + use: [ dependency ] + } + result = ulog.use(modWithDeps) + t.equal(ulog.mods.length, 2, 'adds dependencies for mods that have a `use` property') + t.equal(ulog.mods.indexOf(dependency), 0, 'adds dependencies before dependants') + t.equal(result, 2, 'returns 2 to indicate two mods were added') + ulog.mods.splice(0, ulog.mods.length) + + var modWithExtensions = { + extend: { + test: 'test' + } + } + ulog.use(modWithExtensions) + t.equal(ulog.test, 'test', 'extends ulog for mods that have a `extend` property') + ulog.mods.splice(0, ulog.mods.length) + + // ulog.add('mods', { stub: { add: sinon.stub() } }) + // t.equal(ulog.mods.stub.add.callCount, 1, 'when adding a mod with an `add()` method, that method is called') + // ulog.add('whatever', { c:'component', b:'another', a:'yet another' }) + // t.equal(ulog.mods.stub.add.callCount, 2, 'when adding components, mods with an `add()` method are called') + // delete ulog.whatever + // delete ulog.mods.stub + t.end() + }) + + // t.test('ulog.set(name: String, value: String)', function (t) { + // var mod = { set: sinon.spy() } + // ulog.add(mod) + + // ulog.set('whatever', 'test') + // t.ok(mod.set.called, 'calls set on all registered mods') + + // ulog.mods.splice(0, ulog.mods.length) + // t.end() + // }) + + // t.test('ulog.get(name: String, loggerName: String)', function (t) { + // var mod = { get: sinon.spy() } + // ulog.add(mod) + + // ulog.get('whatever') + // t.ok(mod.get.called, 'calls get on all registered mods') + + // ulog.mods.splice(0, ulog.mods.length) + // t.end() + // }) + + t.end() +}) + +// test('Logger(level?: String = \'log\', ...args)', function(t) { +// var log = ulog('test') +// t.equal(typeof log, 'function', 'is a function') +// t.equal(log.name, 'test', 'has a property `name` that matches the given `name`') +// t.equal(typeof log.error, 'function', 'has a method `error()`') +// t.equal(typeof log.warn, 'function', 'has a method `warn()`') +// t.equal(typeof log.info, 'function', 'has a method `info()`') +// t.equal(typeof log.log, 'function', 'has a method `log()`') +// t.equal(typeof log.debug, 'function', 'has a method `debug()`') +// t.equal(typeof log.trace, 'function', 'has a method `trace()`') +// var sandbox = sinon.createSandbox() +// sandbox.stub(log, 'error') +// sandbox.stub(log, 'warn') +// sandbox.stub(log, 'info') +// sandbox.stub(log, 'log') +// sandbox.stub(log, 'debug') +// sandbox.stub(log, 'trace') +// try { +// log('a log message') +// t.equal(log.log.callCount, 1, 'when called without a level name as first argument, calls Logger.log()') +// log('error', 'an error message') +// t.equal(log.error.callCount, 1, 'when called with \'error\' as first argument, calls Logger.error()') +// log('warn', 'a warning message') +// t.equal(log.warn.callCount, 1, 'when called with \'warn\' as first argument, calls Logger.warn()') +// log('info', 'an info message') +// t.equal(log.info.callCount, 1, 'when called with \'info\' as first argument, calls Logger.info()') +// log('log', 'a log message') +// t.equal(log.log.callCount, 2, 'when called with \'log\' as first argument, calls Logger.log()') +// log('debug', 'a debug message') +// t.equal(log.debug.callCount, 1, 'when called with \'debug\' as first argument, calls Logger.debug()') +// log('trace', 'a trace message') +// t.equal(log.trace.callCount, 1, 'when called with \'trace\' as first argument, calls Logger.trace()') +// } +// finally { +// sandbox.restore() +// } +// t.end() +// }) diff --git a/debug.js b/debug.js deleted file mode 100644 index a7ba226..0000000 --- a/debug.js +++ /dev/null @@ -1,65 +0,0 @@ -var ulog = require('./') - -ulog.formats.push(format); - -module.exports = ulog; - -function format(logger, method, args) { - var t = new Date().getTime(), - p = format.prev && format.prev.t || t - format.prev = { t } - args.unshift( - time(t,1,1,1), - diff(t,p), - name(logger.name) - ) -} - -function time(t,h,m,s){ - var d = new Date(t) - return '' + - (h ? pad(LEFT, d.getHours(), 2, '0') + (m || s ? ':' : '') : '') + - (m ? pad(LEFT, d.getMinutes(), 2, '0') + (s ? ':' : '') : '') + - (s ? pad(LEFT, d.getSeconds(), 2, '0') : '') -} - -function diff(t,p) { - var d = new Date(t - p), - days = d.getUTCDate() - 1, - h = d.getUTCHours(), - m = d.getUTCMinutes(), - s = d.getUTCSeconds(), - f = Math.floor, - ms = (t - p - s*1000) - return pad(LEFT, ( - t-p<1000?(t-p>10? '.' + pad(LEFT, f((t-p)/10), 2, '0') : '') : // ms - days ? days + 'd' + pad(LEFT, h, 2, '0') : - h ? h + 'h' + pad(LEFT, m, 2, '0') : - m ? m + 'm' + pad(LEFT, s, 2, '0') : - s ? s + '.' + pad(LEFT, f(ms/10), 2, '0') : - '' - ), 5) -} - -function name(n) { - return pad(RIGHT, n.substring(0, 24), 24) -} - -var LEFT=1, - RIGHT=0 - -function pad(s,x,l,p) { - x = String(x) - p = p || ' ' - if (x.length > l || (s && x.length == l)) return x - l -= x.length - p = (p + repeat(p, l / p.length)).slice(0,l) - return (s?p:'') + x + (s?'':p); -} - -function repeat(x,c,s) { - if (!x.length || !c) return '' - s = '' - while(c>0) {s+=x; c--} - return s; -} diff --git a/debug.spec.js b/debug.spec.js deleted file mode 100644 index a0559d1..0000000 --- a/debug.spec.js +++ /dev/null @@ -1,75 +0,0 @@ -var expect = require('chai').expect -var sinon = require('sinon') - -var testConsole = require('./test/console') - -var ulog = require('./debug') -var oldGlobalLevel = ulog.level -ulog.con = function(){return testConsole} -ulog.level = ulog.level // trigger patch, so testConsole is used - -var debug = ulog('my-module-name') -var oldLevel = debug.level - -describe('debug = require(\'ulog/debug\')(named)', function(){ - it('yields a function `debug`', function(){ - expect(debug).to.be.a('function') - }) - - it('uses a format by default', function(){ - expect(ulog.formats.length).to.equal(1) - expect(ulog.con() === testConsole).to.equal(true) - }) - - it('adds the current time to the log call', function(){ - testConsole.reset() - try { - debug.level = ulog.DEBUG - expect(debug.level).to.equal(debug.DEBUG) - expect(testConsole.debug.callCount).to.equal(0) - var message = 'Message' - debug(message) - expect(testConsole.debug.callCount).to.equal(1) - expect(testConsole.debug.getCall(0).args[0]).to.be.a('string') - expect(testConsole.debug.getCall(0).args[0].length).to.equal(8) - } finally { - debug.level = oldLevel - testConsole.reset() - } - }) - - it('adds the time elapsed since the previous call to the log call', function(){ - testConsole.reset() - try { - debug.level = ulog.DEBUG - expect(debug.level).to.equal(debug.DEBUG) - expect(testConsole.debug.callCount).to.equal(0) - var message = 'Message' - debug(message) - expect(testConsole.debug.callCount).to.equal(1) - expect(testConsole.debug.getCall(0).args[1]).to.be.a('string') - expect(testConsole.debug.getCall(0).args[1].length).to.equal(5) - } finally { - debug.level = oldLevel - testConsole.reset() - } - }) - - it('adds the logger name to the log call', function(){ - testConsole.reset() - try { - debug.level = ulog.DEBUG - expect(debug.level).to.equal(debug.DEBUG) - expect(testConsole.debug.callCount).to.equal(0) - var message = 'Message' - debug(message) - expect(testConsole.debug.callCount).to.equal(1) - expect(testConsole.debug.getCall(0).args[2]).to.be.a('string') - expect(testConsole.debug.getCall(0).args[2].length).to.equal(24) - expect(testConsole.debug.getCall(0).args[2]).to.equal(debug.name.padEnd(24, ' ')) - } finally { - debug.level = oldLevel - testConsole.reset() - } - }) -}) diff --git a/docs/_config.yml b/docs/_config.yml deleted file mode 100644 index fc24e7a..0000000 --- a/docs/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-hacker \ No newline at end of file diff --git a/example.js b/example.js new file mode 100644 index 0000000..7452fd0 --- /dev/null +++ b/example.js @@ -0,0 +1,13 @@ +var ulog = require('./full') + +var log +log = ulog('test:log1') +for (var level in ulog.levels) { + log[level]('This is a ' + level.toUpperCase() + ' message') +} + +log = ulog('test:log2') +for (var level in ulog.levels) { + log[level]('This is a ' + level.toUpperCase() + ' message') +} + diff --git a/full.bundle.js b/full.bundle.js new file mode 100644 index 0000000..e041711 --- /dev/null +++ b/full.bundle.js @@ -0,0 +1,9 @@ +// ulog - the universal logger +// © 2020 by Stijn de Witt +// License: MIT + +// This is the bundled version of ulog/full, for use as an old-fashioned script-include. +// Bundlers and node will use full.js directly +var kurly = require('./mods/kurly') +var ulog = module.exports = require('./main.bundle') +ulog.use(kurly) diff --git a/full.js b/full.js new file mode 100644 index 0000000..5d0f7c0 --- /dev/null +++ b/full.js @@ -0,0 +1,9 @@ +// ulog - the universal logger +// © 2020 by Stijn de Witt +// License: MIT + +// This is the full version of ulog, with kurly included. +// require('ulog/full') to include +var kurly = require('./mods/kurly') +var ulog = module.exports = require('./') +ulog.use(kurly) diff --git a/full.min.js b/full.min.js new file mode 100644 index 0000000..4ea321b --- /dev/null +++ b/full.min.js @@ -0,0 +1 @@ +!function(t){var n={};function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var i in t)e.d(r,i,function(n){return t[n]}.bind(null,i));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p="",e(e.s=26)}([function(t,n){t.exports=function(t,n,e){return t.mods.reduce((function(t,e){if(Array.isArray(t)&&n in e)t.push(e[n]);else for(var r in e[n])t[r]=e[n][r];return t}),e),e}},function(t,n,e){var r=e(0);t.exports={extend:{settings:{},get:function(){var t=this,n=[].slice.call(arguments),e=n[0];return e?(n.unshift(t.settings[e]),r(t,"get",[]).map((function(e){n[0]=e.apply(t,n)})),n[0]):t.settings},set:function(t,n){var e=this,i=e.settings[t]!==n;e.settings[t]=n,r(e,"set",[]).map((function(r){r.call(e,t,n)})),i&&e.ext()}}}},function(t,n,e){var r=e(0),i=t.exports={use:[e(5)],ext:function(t){var n=r(this,"settings",{});for(var e in n)n[e].prop&&i.new.call(this,t,e,n[e].prop)},new:function(t,n,e){if(n in t)return t;var r,i=this;return Object.defineProperty(t,e.name||n,{get:function(){var o=void 0!==r?r:i.get(n,t.name);return o=void 0!==o?o:e.default,o=e.fromStr?e.fromStr.call(t,o,i):o,o=e.get?e.get.call(t,o,i):o},set:function(n){n=e.toStr?e.toStr.call(t,n,i):n,r!==n&&(r=n,i.ext(t)),e.set&&e.set.call(t,n,i)}})}}},function(t,n){var e=t.exports=function(t,n,e,r){for(var i=n-(t=t.substring(0,n)).length;i>0;i--)t=r?(e||" ")+t:t+(e||" ");return t};e.RIGHT=0,e.LEFT=1},function(t,n,e){var r=e(0);t.exports=function(t,n){var e=r(t,"settings",{}),i={};for(var o in e)try{var u=e[o].config||o;u in localStorage&&(i[u]=localStorage.getItem(u))}catch(t){}return n?n(i):i}},function(t,n,e){var r=t.exports={use:[e(1)],get:function(t,n,e){return void 0===e?t:r.eval(r.parse(t,n),e)},parse:function(t,n){for(var e,r,i="debug"==n&&n,o=[],u=(t||"").trim().split(/(?=t[n.toUpperCase()]},this.levels)t.enabledFor(n)||(t[n]=t.discard)}}},function(t,n,e){var r=e(0);t.exports={use:[e(7)],settings:{format:{config:"log_format",prop:{default:"simple"}}},formats:{none:function(){},simple:e(23),json:e(24),"*":function(){}},ext:function(t){var n=r(this,"formats",{});(n[t.format]||n["*"]).call(this,t)},record:function(t,n,e,i){i.time=new Date,i.name=t.name,i.message=e,i.level=t[n.toUpperCase()],i.levelName=n;var o=r(this,"settings",{});for(var u in o)o[u].prop&&(i["log_"+u]=t[u]);i.logger=t}}},function(t,n,e){var r=e(3);t.exports=function(t){return r(t.name,19)}},function(t,n,e){var r=e(25);t.exports=function(t,n,e){var i=function(i,o){return function(){var u=[].slice.call(arguments),s=r(t,n,i,u);u=e(s),Array.isArray(u)||(u=[u]),o.apply(n,u)}};for(var o in t.levels)n[o]=i.call(t,o,n[o]);n.discard=i.call(t,o,n.discard)}},function(t,n,e){t.exports=window.ulog=window.anylogger=e(12)},function(t,n,e){(t.exports=e(13)).use(e(15))},function(t,n,e){var r=e(14),i=e(0);r.ext=function(t){if(t)return i(r,"ext",[]).map((function(n){n.call(r,t)})),t;for(t in r())r.ext(r(t))},r.mods=[],r.use=function(t){if(Array.isArray(t))return t.reduce((function(t,n){return t+r.use(n)}),0);var n=-1===r.mods.indexOf(t)?1:0;if(n){if(t.use&&(n+=r.use(t.use)),t.extend)for(var e in t.extend)r[e]=t.extend[e];t.init&&t.init.call(r),r.mods.push(t)}return n},t.exports=r},function(t,n){var e=Object.create(null),r=function(t,n){return t?e[t]||(e[t]=r.ext(r.new(t,n))):e};r.levels={error:1,warn:2,info:3,log:4,debug:5,trace:6},r.new=function(t,n){var e=new Function("a","n","return {'"+t+"':function(){a.log(n,[].slice.call(arguments))}}[n]")(r,t);try{Object.defineProperty(e,"name",{get:function(){return t}})}catch(t){}return e},r.log=function(t,n){var i=n.length>1&&r.levels[n[0]]?n.shift():"log";e[t][i].apply(e[t],n)},r.ext=function(t){var n="undefined"!=typeof console&&console;for(var e in t.enabledFor=function(){return!0},r.levels)t[e]=n&&(n[e]||n.log)||function(){};return t},t.exports=r},function(t,n,e){t.exports=[e(1),e(16),e(5),e(2),e(6),e(7),e(8)]},function(t,n,e){var r=e(0),i=e(17),o=e(19),u=e(4),s=e(20);t.exports={use:[e(1)],get:function(t,n){if(this.config||(this.config={},this.config=u(this),s(this)),!t){var e=r(this,"settings",{});n=e[n]&&e[n].config||n}return t||this.config[n]||i[n]||o[n],t||this.config[n]||i[n]||o[n]},set:function(t){"log_config"===t&&(this.config=u(this))}}},function(t,n,e){var r=e(18);t.exports=r(location.search.replace(/^(\?|#|&)/,"").split("&"),/\+/g," ",decodeURIComponent)},function(t,n){t.exports=function(t,n,e,r){return t.reduce((function(t,i){var o=(i=i.replace(n,e)).indexOf("=");if(-1!==o){var u=i.substring(0,o).replace(/^\s+|\s+$/g,"");if(u){var s=i.substring(o+1).replace(/^\s+|\s+$/g,"");r&&(s=r(s)),t[u]=s}}return t}),{})}},function(t,n){t.exports={}},function(t,n,e){var r=e(4),i=e(21);t.exports=function(t){setInterval((function(){if(t.config){var n=r(t);i(t.config,n)&&t.ext()}}),350)}},function(t,n){t.exports=function(t,n){var e,r=0;for(e in t)e in n||(delete t[e],r++);for(e in n)e in t&&t[e]===n[e]||(t[e]=n[e],r++);return r}},function(t,n){t.exports="warn"},function(t,n,e){var r=e(9);t.exports=function(t){var n=r(t);for(var e in this.levels)t[e]=t[e].bind(t,n);t.discard=t.discard.bind(t,n)}},function(t,n,e){var r=e(10);t.exports=function(t){r(this,t,JSON.stringify)}},function(t,n,e){var r=e(0);t.exports=function(t,n,e,i){return r(t,"record",[]).reduce((function(r,o){return o.call(t,n,e,i,r),r}),{})}},function(t,n,e){var r=e(27);(t.exports=e(11)).use(r)},function(t,n,e){t.exports={use:[e(8)],formats:{"*":e(28)},formatters:{name:e(30),lvl:e(31),date:e(33),time:e(34),perf:e(35),"*":function(t){return function(n){return n[t.name]}}}}},function(t,n,e){var r=e(29),i=e(0),o=e(10);t.exports=function(t){var n=r.parse(t.format),e=r.compile(n,i(this,"formatters",{}));o(this,t,e)}},function(t,n,e){function r(t){var n,e=t.match(/\{[_a-zA-Z][_a-zA-Z0-9]*([^_a-zA-Z0-9].*)?\}/);if(e){var r=e[1]?e[0].substring(1,e[0].indexOf(e[1])):e[0].substring(1,e[0].indexOf("}"));n={name:r,index:e.index,end:-1,text:""};for(var i=!1,o=1,u=e.index+r.length+1;u1&&(n="+"+(t.time.getTime()-t.logger.lastCalled.getTime())+"ms"),t.logger.lastCalled=t.time,r(n,8)}}}]); \ No newline at end of file diff --git a/main.bundle.js b/main.bundle.js new file mode 100644 index 0000000..5ecdac4 --- /dev/null +++ b/main.bundle.js @@ -0,0 +1,8 @@ +// ulog - the universal logger +// © 2020 by Stijn de Witt +// License: MIT + +// This is the bundled version of ulog, for use as an old-fashioned script-include. +// Bundlers and node will use main.js directly +module.exports = window.ulog = window.anylogger = require('./main') +// module.exports = window.anylogger = require('./main') diff --git a/main.js b/main.js new file mode 100644 index 0000000..49725b9 --- /dev/null +++ b/main.js @@ -0,0 +1,6 @@ +// ulog - the universal logger +// © 2020 by Stijn de Witt +// License: MIT + +var ulog = module.exports = require('./core') +ulog.use(require('./mods')) diff --git a/microscopical.spec.js b/microscopical.spec.js deleted file mode 100644 index f606125..0000000 --- a/microscopical.spec.js +++ /dev/null @@ -1,10 +0,0 @@ -var expect = require('chai').expect -var fs = require('fs') -var node = typeof window != 'object' - -describe('ulog', function(){ - it('is microscopically small (~2kB minified, ~1kB gzipped)', function(){ - var stats = fs.statSync("ulog.min.js") - expect(stats.size).to.be.below(2500) - }) -}) diff --git a/mods/config/args.browser.js b/mods/config/args.browser.js new file mode 100644 index 0000000..7982e00 --- /dev/null +++ b/mods/config/args.browser.js @@ -0,0 +1,6 @@ +var parse = require('./parse') + +module.exports = parse( + location.search.replace(/^(\?|#|&)/, '').split('&'), + /\+/g, ' ', decodeURIComponent +) diff --git a/mods/config/args.js b/mods/config/args.js new file mode 100644 index 0000000..b771400 --- /dev/null +++ b/mods/config/args.js @@ -0,0 +1,5 @@ +var parse = require('./parse') + +module.exports = parse( + process.argv.slice(2) +) diff --git a/mods/config/env.browser.js b/mods/config/env.browser.js new file mode 100644 index 0000000..4ba52ba --- /dev/null +++ b/mods/config/env.browser.js @@ -0,0 +1 @@ +module.exports = {} diff --git a/mods/config/env.js b/mods/config/env.js new file mode 100644 index 0000000..5bb848c --- /dev/null +++ b/mods/config/env.js @@ -0,0 +1 @@ +module.exports = process.env diff --git a/mods/config/index.js b/mods/config/index.js new file mode 100644 index 0000000..7497fdc --- /dev/null +++ b/mods/config/index.js @@ -0,0 +1,33 @@ +var grab = require('../../core/grab') +var args = require('./args') +var env = require('./env') +var read = require('./read') +var watch = require('./watch') + +module.exports = { + use: [ + require('../settings'), + ], + + get: function(result, name) { + var ulog = this + if (!ulog.config) { + ulog.config = {}; + ulog.config = read(ulog) + watch(ulog) + } + if (!result) { + var settings = grab(ulog, 'settings', {}) + name = settings[name] && settings[name].config || name + } + result || ulog.config[name] || args[name] || env[name] + + // var settings = this.grab('settings') + // name = settings[name] && settings[name].config || name + return result || ulog.config[name] || args[name] || env[name] + }, + + set: function(name) { + if (name === 'log_config') this.config = read(this) + } +} diff --git a/mods/config/parse.js b/mods/config/parse.js new file mode 100644 index 0000000..b9ec596 --- /dev/null +++ b/mods/config/parse.js @@ -0,0 +1,15 @@ +module.exports = function parse(data, regex, replacement, decode) { + return data.reduce(function(result,value){ + value = value.replace(regex, replacement) + var i = value.indexOf('=') + if (i !== -1) { + var n = value.substring(0, i).replace(/^\s+|\s+$/g, '') + if (n) { + var v = value.substring(i + 1).replace(/^\s+|\s+$/g, '') + if (decode) v = decode(v) + result[n] = v + } + } + return result + }, {}) +} diff --git a/mods/config/read.browser.js b/mods/config/read.browser.js new file mode 100644 index 0000000..3432f59 --- /dev/null +++ b/mods/config/read.browser.js @@ -0,0 +1,13 @@ +var grab = require('../../core/grab') + +module.exports = function(ulog, callback) { + var settings = grab(ulog, 'settings', {}) + var cfg = {} + for (var setting in settings) { + try { + var name = settings[setting].config || setting + if (name in localStorage) cfg[name] = localStorage.getItem(name) + } catch(ignore){} + } + return callback ? callback(cfg) : cfg +} diff --git a/mods/config/read.js b/mods/config/read.js new file mode 100644 index 0000000..a4e385b --- /dev/null +++ b/mods/config/read.js @@ -0,0 +1,30 @@ +var fs = require('fs') +var path = require('path') +var parse = require('./parse') + +module.exports = function(ulog, callback) { + var filename = path.resolve(ulog.get('log_config') || 'log.config') + if (callback) { + fs.readFile(filename, 'utf8', function(e, data){ + if (e) return handleError(e) + else callback(parse(lines(data))) + }) + } else { + try { + var data = fs.readFileSync(filename, 'utf8') + return parse(lines(data)) + } catch(e) {return handleError(e)} + } +} + +function handleError(e, filename) { + console.warn(e.message, e) + return {} +} + +function lines(data) { + return data.split(/(\r\n|\r|\n)/).map(function(line){ + // trim and skip comments + return (line = line.trim()).indexOf('#') === 0 ? '' : line + }) +} diff --git a/mods/config/test.config b/mods/config/test.config new file mode 100644 index 0000000..94ae033 --- /dev/null +++ b/mods/config/test.config @@ -0,0 +1,3 @@ +test = pass +log = pass +log_output = console;test=drain \ No newline at end of file diff --git a/mods/config/test.js b/mods/config/test.js new file mode 100644 index 0000000..861b502 --- /dev/null +++ b/mods/config/test.js @@ -0,0 +1,58 @@ +var test = require('tape') +var path = require('path') +var fs = require('fs') + +var ulog = require('../../core') +var config = require('./') +var filename = 'test.config' + +test('mod: config', function(t) { + t.equal(typeof config, 'object', 'is an object') + t.equal(typeof config.get, 'function', 'has a method `get`') + + t.test('config.get(result: String, name?: String)', function(t){ + ulog.use(config) + ulog.set('log_config', path.resolve(__dirname, filename)) + t.equal(typeof config.get.call(ulog), 'undefined', 'when called without arguments, returns undefined') + t.equal(config.get.call(ulog, 'test', 'test'), 'test', 'when called with a truthy result, returns that result') + ulog.use({ + settings: { + test: { } + } + }) + t.equal(config.get.call(ulog, undefined, 'test'), 'pass', 'returns the value configured in the config file') + ulog.use({ + settings: { + level: { + config: 'log' + } + } + }) + t.equal(config.get.call(ulog, undefined, 'level'), 'pass', 'when the setting has a config key, uses that key') + ulog.mods.splice(0, ulog.mods.length) + t.end() + }) + + t.test('ulog.use(config)', function(t){ + ulog.use(config) + ulog.set('log_config', path.resolve(__dirname, filename)) + t.ok(ulog.mods.indexOf(config) !== -1, 'adds mod `config` to `ulog.mods`') + ulog.use({ + settings: { + test: { } + } + }) + t.equal(ulog.get('test'), 'pass', 'reads in the config automatically') + var data = fs.readFileSync(path.resolve(__dirname, filename), 'utf8') + fs.writeFileSync(path.resolve(__dirname, filename), 'test=ok', 'utf8') + // allow ulog 250 ms to process the settings change + setTimeout(function(){ + t.equal(ulog.get('test'), 'ok', 'watches the config and updates automatically') + fs.writeFileSync(path.resolve(__dirname, filename), data, 'utf8') + ulog.mods.splice(0, ulog.mods.length) + t.end() + }, 250) + }) + + t.end() +}) diff --git a/mods/config/update.js b/mods/config/update.js new file mode 100644 index 0000000..cb5b7c6 --- /dev/null +++ b/mods/config/update.js @@ -0,0 +1,16 @@ +module.exports = function(cfg, newCfg) { + var prop, changes = 0 + for (prop in cfg) { + if (! (prop in newCfg)) { + delete cfg[prop] + changes++ + } + } + for (prop in newCfg) { + if ((! (prop in cfg)) || (cfg[prop] !== newCfg[prop])) { + cfg[prop] = newCfg[prop] + changes++ + } + } + return changes +} diff --git a/mods/config/watch.browser.js b/mods/config/watch.browser.js new file mode 100644 index 0000000..11f5d8a --- /dev/null +++ b/mods/config/watch.browser.js @@ -0,0 +1,15 @@ +var read = require('./read') +var update = require('./update') + +module.exports = function(ulog) { + // storage events unfortunately only fire on events triggered by other windows... + // so we need to poll here... + setInterval(function(){ + if (ulog.config) { + var cfg = read(ulog) + if (update(ulog.config, cfg)) { + ulog.ext() + } + } + }, 350) +} diff --git a/mods/config/watch.js b/mods/config/watch.js new file mode 100644 index 0000000..db6ebab --- /dev/null +++ b/mods/config/watch.js @@ -0,0 +1,29 @@ +var fs = require('fs') +var path = require('path') + +var read = require('./read') +var update = require('./update') + +module.exports = function(ulog) { + var filename = path.resolve(ulog.get('log_config') || 'log.config') + try { + fs.watch(filename, { persistent: false }, function() { + read(ulog, function(cfg){ + if (update(ulog.config, cfg)) ulog.ext() + }) + }) + // debounce(100, ) + } catch(ignore){} +} + +function debounce(ms, callback) { + var wait + return function() { + if (wait) clearTimeout(wait) + var args = arguments + wait = setTimeout(function(){ + wait = null + callback.apply(null, args) + }, ms) + } +} diff --git a/mods/formats/index.js b/mods/formats/index.js new file mode 100644 index 0000000..f892105 --- /dev/null +++ b/mods/formats/index.js @@ -0,0 +1,47 @@ +var grab = require('../../core/grab') + +module.exports = { + use: [ + require('../levels'), + ], + + settings: { + format: { + config: 'log_format', + prop: { + default: 'simple', + } + }, + }, + + formats: { + none: function(){}, + simple: require('./simple'), + json: require('./json'), + '*': function(){} + }, + + ext: function(logger) { + var formats = grab(this, 'formats', {}) + var format = formats[logger.format] || formats['*'] + format.call(this, logger) + }, + + // for structured formats, the default record function + record: function(logger, level, args, rec) { + rec.time = new Date() + rec.name = logger.name + rec.message = args + rec.level = logger[level.toUpperCase()] + rec.levelName = level + + // properties like output, format, level... + var settings = grab(this, 'settings', {}) + for (var name in settings) { + if (settings[name].prop) { + rec['log_' + name] = logger[name] + } + } + rec.logger = logger + }, +} diff --git a/mods/formats/json.js b/mods/formats/json.js new file mode 100644 index 0000000..6a0a9bc --- /dev/null +++ b/mods/formats/json.js @@ -0,0 +1,5 @@ +var structured = require('./structured') + +module.exports = function(logger) { + structured(this, logger, JSON.stringify) +} diff --git a/mods/formats/lvl.js b/mods/formats/lvl.js new file mode 100644 index 0000000..257ae41 --- /dev/null +++ b/mods/formats/lvl.js @@ -0,0 +1,5 @@ +var LVL = [' ', 'x', '!', 'i', ' ', ' ', ' '] + +module.exports = function(rec) { + return LVL[rec.level] +} diff --git a/mods/formats/name.js b/mods/formats/name.js new file mode 100644 index 0000000..6048e8a --- /dev/null +++ b/mods/formats/name.js @@ -0,0 +1,5 @@ +var pad = require('../formats/pad') + +module.exports = function(rec) { + return pad(rec.name, 19) +} diff --git a/mods/formats/pad.js b/mods/formats/pad.js new file mode 100644 index 0000000..6634337 --- /dev/null +++ b/mods/formats/pad.js @@ -0,0 +1,8 @@ +var pad = module.exports = function(s, len, c, left){ + var s = s.substring(0, len) + for (var i=len-s.length; i>0; i--) + s = left ? (c || ' ') + s : s + (c || ' ') + return s +} +pad.RIGHT = 0 +pad.LEFT = 1 diff --git a/mods/formats/record.js b/mods/formats/record.js new file mode 100644 index 0000000..b1caf04 --- /dev/null +++ b/mods/formats/record.js @@ -0,0 +1,19 @@ +var grab = require('../../core/grab') + +/** + * Records a record for a log call based on the ulog instance, the logger and leven and the call arguments. + * + * Collects all record functions from all mods and allows each of them to contribute to the result. + * + * @param {} ulog Ulog instance + * @param {*} logger Logger instance + * @param {*} level The level of the current call + * @param {*} args The arguments of the log call + */ +module.exports = function(ulog, logger, level, args){ + var recorders = grab(ulog, 'record', []) + return recorders.reduce(function(r, record){ + record.call(ulog, logger, level, args, r) + return r + }, {}) +} diff --git a/mods/formats/simple.browser.js b/mods/formats/simple.browser.js new file mode 100644 index 0000000..5e46701 --- /dev/null +++ b/mods/formats/simple.browser.js @@ -0,0 +1,7 @@ +var name = require('./name') + +module.exports = function(logger){ + var loggerName = name(logger) + for (var level in this.levels) logger[level] = logger[level].bind(logger, loggerName) + logger.discard = logger.discard.bind(logger, loggerName) +} diff --git a/mods/formats/simple.js b/mods/formats/simple.js new file mode 100644 index 0000000..6852d2e --- /dev/null +++ b/mods/formats/simple.js @@ -0,0 +1,8 @@ +var name = require('./name') +var lvl = require('./lvl') + +module.exports = function(logger){ + var loggerName = name(logger) + for (var level in this.levels) logger[level] = logger[level].bind(logger, lvl({ level: logger[level.toUpperCase()] }), loggerName) + logger.discard = logger.discard.bind(logger, ' ', loggerName) +} diff --git a/mods/formats/structured.js b/mods/formats/structured.js new file mode 100644 index 0000000..749fe99 --- /dev/null +++ b/mods/formats/structured.js @@ -0,0 +1,25 @@ +var record = require('./record') + +/** + * Creates a format function based on a structured formatter + * + * The structured formatter function can be any function that accepts an object + * as a parameter and returns the thing to be logged. If the result of the call + * to the structured formatting function is not an array, it will be wrapped in + * one. The resulting array will be used as the final arguments in the log call + * + * @param {*} formatter The structured formatter function + */ +module.exports = function(ulog, logger, formatter){ + var format = function(level, fn){ + return function(){ + var args = [].slice.call(arguments) + var rec = record(ulog, logger, level, args) + args = formatter(rec) + if (! Array.isArray(args)) args = [args] + fn.apply(logger, args) + } + } + for (var level in ulog.levels) logger[level] = format.call(ulog, level, logger[level]) + logger.discard = format.call(ulog, level, logger.discard) +} diff --git a/mods/formats/test.js b/mods/formats/test.js new file mode 100644 index 0000000..4ed5199 --- /dev/null +++ b/mods/formats/test.js @@ -0,0 +1,38 @@ +var test = require('tape') +var sinon = require('sinon') +var ulog = require('../../core') +var formats = require('./') +var levels = require('../levels') + +test('mod: formats', function(t) { + t.equal(typeof formats, 'object', 'is an object') + t.ok(Array.isArray(formats.use), 'has a `use` array') + t.equal(typeof formats.settings, 'object', 'has a `settings` object') + t.equal(typeof formats.formats, 'object', 'has a `formats` object') +// t.equal(typeof formats.formatters, 'object', 'has a `formatters` object') + t.equal(typeof formats.ext, 'function', 'has a method `ext`') +// t.equal(typeof formats.record, 'function', 'has a method `record`') + + t.test('ulog.use(formats)', function(t){ + ulog.use([levels, formats]) + t.ok(ulog.mods.indexOf(formats) !== -1, 'adds mod `formats` to `ulog.mods`') +// var fn = sinon.stub() +// ulog.use({ +// formats: { +// test: fn, +// } +// }) +// var logger = ulog('test') +// t.equal(fn.callCount, 1, 'when a format is selected, it\'s function is called') +// ulog.set('format', 'test') +// t.equal(fn.callCount, 1, 'when a format is selected, it\'s function is called') +// // delete ulog.get()['option'] + ulog.mods.splice(0, ulog.mods.length) + delete ulog().test + t.end() + }) + + + + t.end() +}) diff --git a/mods/index.js b/mods/index.js new file mode 100644 index 0000000..7c4bb95 --- /dev/null +++ b/mods/index.js @@ -0,0 +1,9 @@ +module.exports = [ + require('./settings'), + require('./config'), + require('./options'), + require('./props'), + require('./outputs'), + require('./levels'), + require('./formats'), +] diff --git a/mods/kurly/date.js b/mods/kurly/date.js new file mode 100644 index 0000000..6dbaeb5 --- /dev/null +++ b/mods/kurly/date.js @@ -0,0 +1,9 @@ +var pad = require('../formats/pad') + +module.exports = function(){ + return function(rec) { + return rec.time.getFullYear() + '/' + + pad(rec.time.getMonth().toString(), 2, '0', pad.LEFT) + '/' + + pad(rec.time.getDate().toString(), 2, '0', pad.LEFT) + } +} \ No newline at end of file diff --git a/mods/kurly/format.js b/mods/kurly/format.js new file mode 100644 index 0000000..b0dbaae --- /dev/null +++ b/mods/kurly/format.js @@ -0,0 +1,9 @@ +var kurly = require('kurly') +var grab = require('../../core/grab') +var structured = require('../formats/structured') + +module.exports = function(logger){ + var ast = kurly.parse(logger.format) + var template = kurly.compile(ast, grab(this, 'formatters', {})) + structured(this, logger, template) +} diff --git a/mods/kurly/index.js b/mods/kurly/index.js new file mode 100644 index 0000000..d7ff940 --- /dev/null +++ b/mods/kurly/index.js @@ -0,0 +1,24 @@ +module.exports = { + use: [ + require('../formats'), + ], + + formats: { + // this will override the default wildcard format with the kurly format + '*': require('./format'), + }, + + // some default formatters + formatters: { + name: require('./name'), + lvl: require('./lvl'), + date: require('./date'), + time: require('./time'), + perf: require('./perf'), + '*': function(ctx){ + return function(rec){ + return rec[ctx.name] + } + } + }, +} diff --git a/mods/kurly/lvl.js b/mods/kurly/lvl.js new file mode 100644 index 0000000..2d69f04 --- /dev/null +++ b/mods/kurly/lvl.js @@ -0,0 +1,5 @@ +var lvl = require('../formats/lvl') + +module.exports = function(){ + return lvl +} diff --git a/mods/kurly/name.js b/mods/kurly/name.js new file mode 100644 index 0000000..833fadf --- /dev/null +++ b/mods/kurly/name.js @@ -0,0 +1,5 @@ +var name = require('../formats/name') + +module.exports = function(){ + return name +} diff --git a/mods/kurly/perf.js b/mods/kurly/perf.js new file mode 100644 index 0000000..e7ad0fc --- /dev/null +++ b/mods/kurly/perf.js @@ -0,0 +1,12 @@ +var pad = require('../formats/pad') + +module.exports = function() { + return function(rec) { + var result = '' + if (rec.logger.lastCalled && (rec.time.getTime() - rec.logger.lastCalled.getTime() > 1)) { + result = '+' + (rec.time.getTime() - rec.logger.lastCalled.getTime()) + 'ms' + } + rec.logger.lastCalled = rec.time + return pad(result, 8) + } +} diff --git a/mods/kurly/time.js b/mods/kurly/time.js new file mode 100644 index 0000000..e31d034 --- /dev/null +++ b/mods/kurly/time.js @@ -0,0 +1,8 @@ +var pad = require('../formats/pad') + +module.exports = function(){ + return function(rec) { + return pad(rec.time.getHours().toString(), 2, '0', pad.LEFT) + ':' + + pad(rec.time.getMinutes().toString(), 2, '0', pad.LEFT) + } +} \ No newline at end of file diff --git a/mods/levels/default.browser.js b/mods/levels/default.browser.js new file mode 100644 index 0000000..4e15264 --- /dev/null +++ b/mods/levels/default.browser.js @@ -0,0 +1 @@ +module.exports = 'warn' \ No newline at end of file diff --git a/mods/levels/default.js b/mods/levels/default.js new file mode 100644 index 0000000..e91987e --- /dev/null +++ b/mods/levels/default.js @@ -0,0 +1 @@ +module.exports = 'info' \ No newline at end of file diff --git a/mods/levels/index.js b/mods/levels/index.js new file mode 100644 index 0000000..5cafc91 --- /dev/null +++ b/mods/levels/index.js @@ -0,0 +1,47 @@ +module.exports = { + use: [ + require('../props'), + require('../outputs'), + ], + + settings: { + level: { + config: 'log', + // level property + prop: { + // default value + default: require('./default.js'), + // level number from string + fromStr: function(v) { + return Number(v) === Number(v) ? Number(v) : v && this[v.toUpperCase()] + }, + // level number to string + toStr: function(v) { + for (var x in this) + if (this[x] === v) return x.toLowerCase() + return v + }, + // property getter extension, called when property on logger is read + get: function(v, ulog){ + return Math.max(ulog.get('debug', this.name) && this.DEBUG || this.NONE, v) + }, + }, + } + }, + + ext: function(logger) { + logger.NONE = 0 + logger.ALL = 9007199254740991 // Number.MAX_SAFE_INTEGER + logger.levels = ['none'] + for (var name in this.levels) { + logger[name.toUpperCase()] = this.levels[name] + logger.levels[this.levels[name]] = name + } + logger.enabledFor = function(name){ + return logger.level >= logger[name.toUpperCase()] + } + for (var name in this.levels) { + if (!logger.enabledFor(name)) logger[name] = logger.discard + } + }, +} diff --git a/mods/levels/test.js b/mods/levels/test.js new file mode 100644 index 0000000..b4cfd32 --- /dev/null +++ b/mods/levels/test.js @@ -0,0 +1,72 @@ +var test = require('tape') +var sinon = require('sinon').createSandbox() + +var ulog = require('../../core') +var settings = require('../settings') +var options = require('../options') +var props = require('../props') +var outputs = require('../outputs') +var levels = require('./') + +test('mod: levels', function (t) { + t.equal(typeof levels, 'object', 'is an object') + t.ok('use' in levels, 'has a property `use`') + t.ok('settings' in levels, 'has a property `settings`') + t.equal(typeof levels.ext, 'function', 'has a method `ext()') + + t.test('levels.use', function(t){ + t.deepEqual(levels.use, [ props, outputs ], 'contains dependencies on `props` and `outputs`') + t.end() + }) + + t.test('levels.settings', function(t){ + t.equal(typeof levels.settings, 'object', 'is an object') + t.ok('level' in levels.settings, 'contains a settings `level`') + t.ok('prop' in levels.settings.level, 'setting `level` is a prop') + t.equal(typeof levels.settings.level.prop.fromStr, 'function', 'the `level` prop has a `fromStr` handler') + t.equal(typeof levels.settings.level.prop.toStr, 'function', 'the `level` prop has a `toStr` handler') + t.equal(typeof levels.settings.level.prop.get, 'function', 'the `level` prop has a `get` handler') +// t.equal(typeof levels.settings.level.prop.set, 'function', 'the `level` prop has a `set` handler') + t.end() + }) + + t.test('levels.ext(logger: Function)', function (t) { + ulog.use(levels) + var logger = ulog('test') + t.equal(logger.NONE, 0, 'creates a property `NONE`') + for (lvl in ulog.levels) { + var prop = lvl.toUpperCase() + t.equal(logger[prop], ulog.levels[lvl], 'creates a property `' + prop + '`') + } + t.equal(logger.ALL, Number.MAX_SAFE_INTEGER, 'creates a property `ALL`') + t.equal(logger.log, logger.discard, 'log methods that are outside the logger\'s level lead to the drain') + t.notEqual(logger.error, logger.noop, 'log methods that are within the logger\'s level do not lead to the drain') + + ulog.mods.splice(0, ulog.mods.length) + delete ulog().test + t.end() + }) + + t.test('ulog.use(levels)', function(t){ + ulog.use(levels) + t.ok(ulog.mods.indexOf(levels) !== -1, 'adds the `levels` mod') + var logger = ulog('test') + t.ok('level' in logger, 'adds a property `level` to loggers') + t.equal(typeof logger.level, 'number', 'property `level` is a number') + t.ok(!Number.isNaN(logger.level), 'property `level` is not NaN') + logger.level = logger.LOG + t.equal(logger.level, logger.LOG, 'property `level` can be assigned a level number') + logger.level = 'info' + t.equal(logger.level, logger.INFO, 'property `level` can be assigned a level name') + logger.level = '' + logger.INFO + t.equal(logger.level, logger.INFO, 'property `level` can be assigned a level number as a string') + ulog.set('debug', 'test') + t.equal(logger.level, logger.DEBUG, 'property `level` correctly reflects it when a logger is in debug mode') + ulog.mods.splice(0, ulog.mods.length) + delete ulog().test + t.end() + }) + + t.end() +}) + diff --git a/mods/options/index.js b/mods/options/index.js new file mode 100644 index 0000000..ae34529 --- /dev/null +++ b/mods/options/index.js @@ -0,0 +1,125 @@ +// options are smart settings.... +var options = module.exports = { + use: [ + require('../settings') + ], + + /** + * `options.get(result: String|Object, name?: String, loggerName?: String): String|Object` + * + * @param {String|Object} result The result found so far. + * @param {String} name The name of the setting to get. Optional. + * @param {String} loggerName The name of the logger to get the effective setting for. Optional. + * @returns {String|Object} The (effective) setting for the given `name` and `loggerName`. + * + * if no `loggerName` is given, returns the `result` unchanged. + * + * If a `loggerName` is given, the effective setting value for that specific + * logger name is returned. + * + * If empty string is given as `loggerName`, the effective global/default + * setting value is returned. + * + * For example, given that the following settings are active: + * + * `{ level: 'info; libA=warn; libB=error', output: 'console' }` + * + * These following statements would be true: + * + * `JSON.stringify(ulog.get()) == '{"level":"info; libA=warn; libB=error","output":"console"}'` + * `ulog.get('output') == 'console` + * `ulog.get('level') == 'info; libA=warn; libB=error'` + * `ulog.get('level', 'libA') == 'warn'` + * `ulog.get('level', 'libB') == 'error'` + * `ulog.get('level', 'libC') == 'info'` + * `ulog.get('level', '') == 'info'` + */ + get: function(result, name, loggerName) { + if (loggerName === undefined) return result + return options.eval(options.parse(result, name), loggerName) + }, + + /** + * `parse(value: string, name?: string) => Array` + * + * Parses the setting value string, returning an AST + * + * e.g `parse('warn; test=debug')` would yield: + * + * [{ + * incl: [test], + * excl: [], + * value: 'debug' + * },{ + * incl: [*], + * excl: [], + * value: 'warn' + * }]` + * + * if `debugStyle` is truthy, the setting value string is parsed debug-style + * and `impliedValue` is used as the value of the setting + * + * @param {String} value The setting value string. + * @param {String} name The name of the setting. Optional. + * + * @returns {Array} The parsed setting value objects + */ + parse: function(value, name) { + var d = (name == 'debug') && name + var settings = [] + var items = (value||'').trim().split(/(?= 1.36.0 < 2" - } - }, - "compression": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", - "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.14", - "debug": "2.6.9", - "on-headers": "~1.0.1", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - } - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1148,20 +1248,11 @@ "typedarray": "^0.0.6" } }, - "connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", - "dev": true - }, "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true }, "constants-browserify": { "version": "1.0.0", @@ -1169,29 +1260,14 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } }, "copy-concurrently": { "version": "1.0.5", @@ -1205,6 +1281,17 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "copy-descriptor": { @@ -1227,11 +1314,19 @@ "requires": { "bn.js": "^4.1.0", "elliptic": "^6.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "create-hash": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { @@ -1244,7 +1339,7 @@ }, "create-hmac": { "version": "1.1.7", - "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { @@ -1256,25 +1351,15 @@ "sha.js": "^2.4.8" } }, - "cross-env": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.3.tgz", - "integrity": "sha512-UOokgwvDzCT0mqRSLEkJzUhYXB1vK3E5UgDrD41QiXsm9UetcW2rCGHYz/O3p873lMJ1VZbFCF9Izkwh7nYR5A==", - "dev": true, - "requires": { - "cross-spawn": "^5.1.0", - "is-windows": "^1.0.0" - } - }, "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "crypto-browserify": { @@ -1296,130 +1381,19 @@ "randomfill": "^1.0.3" } }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, - "css-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.23.1.tgz", - "integrity": "sha1-n6I/K1wJZSNZEK1ezvO4o2OQ/lA=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.5.1", - "cssnano": ">=2.6.1 <4", - "loader-utils": "~0.2.2", - "lodash.camelcase": "^3.0.1", - "object-assign": "^4.0.1", - "postcss": "^5.0.6", - "postcss-modules-extract-imports": "^1.0.0", - "postcss-modules-local-by-default": "^1.0.1", - "postcss-modules-scope": "^1.0.0", - "postcss-modules-values": "^1.1.0", - "source-list-map": "^0.1.4" - }, - "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - } - } - }, - "css-selector-tokenizer": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.5.4.tgz", - "integrity": "sha1-E5uv00o1/QwUKEhwSeBpnm9qLCE=", - "dev": true, - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1" - } - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", - "dev": true - }, - "cssnano": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "dev": true, - "requires": { - "autoprefixer": "^6.3.1", - "decamelize": "^1.1.2", - "defined": "^1.0.0", - "has": "^1.0.1", - "object-assign": "^4.0.1", - "postcss": "^5.0.14", - "postcss-calc": "^5.2.0", - "postcss-colormin": "^2.1.8", - "postcss-convert-values": "^2.3.4", - "postcss-discard-comments": "^2.0.4", - "postcss-discard-duplicates": "^2.0.1", - "postcss-discard-empty": "^2.0.1", - "postcss-discard-overridden": "^0.1.1", - "postcss-discard-unused": "^2.2.1", - "postcss-filter-plugins": "^2.0.0", - "postcss-merge-idents": "^2.1.5", - "postcss-merge-longhand": "^2.0.1", - "postcss-merge-rules": "^2.0.3", - "postcss-minify-font-values": "^1.0.2", - "postcss-minify-gradients": "^1.0.1", - "postcss-minify-params": "^1.0.4", - "postcss-minify-selectors": "^2.0.4", - "postcss-normalize-charset": "^1.1.0", - "postcss-normalize-url": "^3.0.7", - "postcss-ordered-values": "^2.1.0", - "postcss-reduce-idents": "^2.2.2", - "postcss-reduce-initial": "^1.0.0", - "postcss-reduce-transforms": "^1.0.3", - "postcss-svgo": "^2.1.1", - "postcss-unique-selectors": "^2.0.2", - "postcss-value-parser": "^3.2.3", - "postcss-zindex": "^2.0.1" - } - }, - "csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "dev": true, - "requires": { - "clap": "^1.0.9", - "source-map": "^0.5.3" - } - }, "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "decamelize": { @@ -1434,29 +1408,52 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "deep-equal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.3.tgz", + "integrity": "sha512-Spqdl4H+ky45I9ByyJtXteOm9CaIrPmnIPmOhrkKGNYWeDgCvJ8jNYVCTjChxW4FqGuZnLHADc8EKRMX6+CgvA==", + "dev": true, + "requires": { + "es-abstract": "^1.17.5", + "es-get-iterator": "^1.1.0", + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.2", + "is-regex": "^1.0.5", + "isarray": "^2.0.5", + "object-is": "^1.1.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.2", + "which-boxed-primitive": "^1.0.1", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.2" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", "dev": true, "requires": { - "type-detect": "^4.0.0" + "strip-bom": "^4.0.0" } }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, - "default-gateway": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", - "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==", + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "execa": "^0.10.0", - "ip-regex": "^2.1.0" + "object-keys": "^1.0.12" } }, "define-property": { @@ -1506,100 +1503,72 @@ "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", "dev": true }, - "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "dev": true, - "requires": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "dev": true, "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, "diffie-hellman": { "version": "5.0.3", - "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, - "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dotignore": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", + "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", "dev": true, "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", - "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" + "minimatch": "^3.0.4" } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, "duplexify": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", - "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { "end-of-stream": "^1.0.0", @@ -1608,22 +1577,10 @@ "stream-shift": "^1.0.0" } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.15", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.15.tgz", - "integrity": "sha1-CDl5NIkcvPrrvRi4KpW1pIETg2k=", - "dev": true - }, "elliptic": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", - "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -1633,38 +1590,58 @@ "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { "once": "^1.4.0" } }, "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", "dev": true, "requires": { "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", + "memory-fs": "^0.5.0", "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } } }, "errno": { @@ -1676,10 +1653,63 @@ "prr": "~1.0.1" } }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-get-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", + "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", + "dev": true, + "requires": { + "es-abstract": "^1.17.4", + "has-symbols": "^1.0.1", + "is-arguments": "^1.0.4", + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, "escape-string-regexp": { @@ -1689,9 +1719,9 @@ "dev": true }, "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -1699,9 +1729,9 @@ } }, "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esrecurse": { @@ -1714,38 +1744,17 @@ } }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "events": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", "dev": true }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, "evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", @@ -1756,36 +1765,6 @@ "safe-buffer": "^5.1.1" } }, - "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -1801,6 +1780,15 @@ "to-regex": "^3.0.1" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -1818,53 +1806,22 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, - "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", - "dev": true, - "requires": { - "accepts": "~1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", - "content-type": "~1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.4", - "qs": "6.5.2", - "range-parser": "~1.2.0", - "safe-buffer": "5.1.2", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - } + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" } }, "extend-shallow": { @@ -1954,38 +1911,33 @@ } }, "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "websocket-driver": ">=0.5.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -2009,75 +1961,56 @@ } } }, - "finalhandler": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "dev": true, "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" } }, - "find-cache-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", - "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "find-up": { + "findup-sync": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" } }, - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", - "dev": true - }, "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "requires": { - "debug": "=3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } + "is-callable": "^1.1.3" } }, "for-in": { @@ -2086,12 +2019,22 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", "dev": true }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -2101,12 +2044,6 @@ "map-cache": "^0.2.2" } }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -2117,6 +2054,12 @@ "readable-stream": "^2.0.0" } }, + "fromentries": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.1.tgz", + "integrity": "sha512-Xu2Qh8yqYuDhQGOhD5iJGninErSfI9A3FrriD3tjUgV5VbJFeH8vfgZ9HnC6jWN80QDVNQK5vmxRAmEAp7Mevw==", + "dev": true + }, "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", @@ -2136,670 +2079,150 @@ "dev": true }, "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, "optional": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" + "is-glob": "^4.0.1" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" }, "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, - "optional": true, "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" } }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "optional": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "isexe": "^2.0.0" } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, + } + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "optional": true, "requires": { - "ms": "2.0.0" + "isexe": "^2.0.0" } - }, - "deep-extend": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": "^2.1.0" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.2.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.1", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true } } }, - "function-bind": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", - "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "glob": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", - "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "global-modules-path": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz", - "integrity": "sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==", + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "globby": { - "version": "6.1.0", - "resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", "dev": true, "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "duplexer": "^0.1.1", + "pify": "^4.0.1" } }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true - }, - "handle-thing": { - "version": "1.2.5", - "resolved": "http://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", - "dev": true - }, "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "function-bind": "^1.0.2" + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -2809,12 +2232,26 @@ "dev": true, "requires": { "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } } }, "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, "has-value": { @@ -2850,13 +2287,33 @@ } }, "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } } }, "hash.js": { @@ -2869,11 +2326,15 @@ "minimalistic-assert": "^1.0.1" } }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true + "hasha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", + "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + } }, "hmac-drbg": { "version": "1.0.1", @@ -2886,102 +2347,31 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "html-comment-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", - "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", - "dev": true - }, - "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true - }, - "http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "parse-passwd": "^1.0.0" } }, - "http-parser-js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", - "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==", + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", - "dev": true, - "requires": { - "eventemitter3": "^3.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.18.0", - "resolved": "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", - "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", - "dev": true, - "requires": { - "http-proxy": "^1.16.2", - "is-glob": "^4.0.0", - "lodash": "^4.17.5", - "micromatch": "^3.1.9" - } - }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true - }, "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, "iferr": { @@ -2998,6 +2388,51 @@ "requires": { "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } } }, "imurmurhash": { @@ -3006,16 +2441,16 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", "dev": true }, "inflight": { @@ -3029,55 +2464,21 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "internal-ip": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-3.0.1.tgz", - "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", - "dev": true, - "requires": { - "default-gateway": "^2.6.0", - "ipaddr.js": "^1.5.2" - } - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, "is-accessor-descriptor": { @@ -3100,21 +2501,46 @@ } } }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.0.tgz", + "integrity": "sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==", + "dev": true + }, "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "optional": true, "requires": { - "binary-extensions": "^1.0.0" + "binary-extensions": "^2.0.0" } }, + "is-boolean-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz", + "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==", + "dev": true + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -3135,6 +2561,12 @@ } } }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -3166,21 +2598,36 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, + "is-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", + "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -3201,64 +2648,91 @@ } } }, - "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", "dev": true }, - "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "is-path-inside": "^1.0.0" + "isobject": "^3.0.1" } }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", "dev": true, "requires": { - "path-is-inside": "^1.0.1" + "has-symbols": "^1.0.1" } }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "is-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", + "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", "dev": true }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "dev": true, "requires": { - "isobject": "^3.0.1" + "has-symbols": "^1.0.1" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "is-typed-array": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.3.tgz", + "integrity": "sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ==", "dev": true, "requires": { - "html-comment-regex": "^1.1.0" + "available-typed-arrays": "^1.0.0", + "es-abstract": "^1.17.4", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" } }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true + }, + "is-weakset": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", + "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==", + "dev": true + }, "is-windows": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz", - "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, "is-wsl": { @@ -3285,26 +2759,125 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "js-base64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=", + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, "requires": { "argparse": "^1.0.7", - "esprima": "^2.6.0" + "esprima": "^4.0.0" } }, "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, "json-parse-better-errors": { @@ -3319,189 +2892,112 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "json-stringify-pretty-compact": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-1.2.0.tgz", + "integrity": "sha512-/11Pj1OyX814QMKO7K8l85SHPTr/KsFxHp8GE2zVa0BtJgGimDjXHfM3FhC7keQdWDea7+nXf+f1de7ATZcZkQ==", "dev": true }, "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } }, "just-extend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-3.0.0.tgz", - "integrity": "sha512-Fu3T6pKBuxjWT/p4DkqGHFRsysc8OauWr4ZRTY9dIx07Y9O0RkoR5jcv28aeD1vuAwhm3nLkDurwLXoALp4DpQ==", - "dev": true - }, - "killable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", - "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.1.tgz", + "integrity": "sha512-aWgeGFW67BP3e5181Ep1Fv2v8z//iBJfrvyTnq8wG86vEESwmonn1zPBJ0VfmT9CJq2FIT0VsETtrNFm2a+SHA==", "dev": true }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, + "kurly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/kurly/-/kurly-1.0.0.tgz", + "integrity": "sha512-LNq2KKgG2pZcPCHhhYQPM5BgI2hRKqblAn/2Aq0BcPCfdbHH3+fM3AZpod26nOr1iBBis7JrzX3mSkcPZKPptQ==", "requires": { - "invert-kv": "^2.0.0" + "anylogger": "^1.0.5" } }, "loader-runner": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz", - "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", "dev": true }, "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", "dev": true, "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "lodash._createcompounder": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._createcompounder/-/lodash._createcompounder-3.0.0.tgz", - "integrity": "sha1-XdLLVTctbnDg4jkvsjBNZjEJEHU=", - "dev": true, - "requires": { - "lodash.deburr": "^3.0.0", - "lodash.words": "^3.0.0" - } - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", "dev": true }, - "lodash.camelcase": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-3.0.1.tgz", - "integrity": "sha1-kyyLh/ikN3iXxnGXUzKC+Xrqwpg=", - "dev": true, - "requires": { - "lodash._createcompounder": "^3.0.0" - } - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, - "lodash.deburr": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-3.2.0.tgz", - "integrity": "sha1-baj1QzSjZqfPTEx2742Aqhs2XtU=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - } - }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", - "dev": true - }, - "lodash.words": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.words/-/lodash.words-3.2.0.tgz", - "integrity": "sha1-TiqGSbwIdFsXxpWxo86P7llmI7M=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - } - }, - "loglevel": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", - "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", - "dev": true - }, - "lolex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-3.0.0.tgz", - "integrity": "sha512-hcnW80h3j2lbUfFdMArd5UPA/vxZJ+G8vobd+wg3nVEQA0EigStbYcrG030FJxL6xiDDPEkoMatV9xIh5OecQQ==", - "dev": true - }, "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "yallist": "^3.0.2" } }, - "macaddress": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.9.tgz", - "integrity": "sha512-k4F1JUof6cQXxNFzx3thLby4oJzXTXQueAOOts944Vqizn+Rjc2QNFenT9FJSLU1CH3PmrHRSyZs2E+Cqw+P2w==", - "dev": true - }, "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { - "p-defer": "^1.0.0" + "semver": "^6.0.0" } }, "map-cache": { @@ -3519,12 +3015,6 @@ "object-visit": "^1.0.0" } }, - "math-expression-evaluator": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", - "dev": true - }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -3536,23 +3026,6 @@ "safe-buffer": "^5.1.2" } }, - "media-typer": { - "version": "0.3.0", - "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mem": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", - "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^1.1.0" - } - }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -3563,18 +3036,6 @@ "readable-stream": "^2.0.1" } }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true - }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -3604,35 +3065,16 @@ "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, - "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", - "dev": true - }, - "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", - "dev": true, - "requires": { - "mime-db": "~1.37.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -3646,18 +3088,18 @@ "dev": true }, "minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.0.0" + "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "mississippi": { @@ -3679,9 +3121,9 @@ } }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { "for-in": "^1.0.2", @@ -3700,113 +3142,12 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.0.1.tgz", - "integrity": "sha512-evDmhkoA+cBNiQQQdSKZa2b9+W2mpLoj50367lhy+Klnx9OV8XlCIhigUnn1gaTFLQCa0kdNhEGDr0hCXOQFDw==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - } - } - }, - "mocha-loader": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/mocha-loader/-/mocha-loader-1.1.1.tgz", - "integrity": "sha1-Ocm3jErWmrxTPtAuLas5gkTKM6s=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "css-loader": "~0.23.1", - "loader-utils": "^1.0.2", - "script-loader": "~0.7.0", - "style-loader": "~0.13.1" + "minimist": "^1.2.5" } }, "move-concurrently": { @@ -3821,37 +3162,25 @@ "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "nan": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==", - "dev": true, - "optional": true - }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -3869,80 +3198,37 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" - }, - "dependencies": { - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - } } }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true - }, "neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "nise": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.6.tgz", - "integrity": "sha512-1GedetLKzmqmgwabuMSqPsT7oumdR77SBpDfNNJhADRIeA3LN/2RVqR4fFqwvzhAqcTef6PPCzQwITE/YQ8S8A==", - "dev": true, - "requires": { - "@sinonjs/formatio": "3.0.0", - "just-extend": "^3.0.0", - "lolex": "^2.3.2", - "path-to-regexp": "^1.7.0", - "text-encoding": "^0.6.4" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "lolex": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", - "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", - "dev": true - }, - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - } - } + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true }, - "node-forge": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", - "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "nise": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.4.tgz", + "integrity": "sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^6.0.0", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "dev": true, "requires": { "assert": "^1.1.1", @@ -3952,10 +3238,10 @@ "constants-browserify": "^1.0.0", "crypto-browserify": "^3.11.0", "domain-browser": "^1.1.1", - "events": "^1.0.0", + "events": "^3.0.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", + "path-browserify": "0.0.1", "process": "^0.11.10", "punycode": "^1.2.4", "querystring-es3": "^0.2.0", @@ -3966,16 +3252,10 @@ "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", "url": "^0.11.0", - "util": "^0.10.3", - "vm-browserify": "0.0.4" + "util": "^0.11.0", + "vm-browserify": "^1.0.1" }, "dependencies": { - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -3984,47 +3264,21 @@ } } }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", - "dev": true - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" + "process-on-spawn": "^1.0.0" } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true + "optional": true }, "number-is-nan": { "version": "1.0.1", @@ -4032,6 +3286,41 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + } + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4050,922 +3339,331 @@ }, "dependencies": { "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "opn": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", - "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-locale": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", - "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", - "dev": true, - "requires": { - "execa": "^0.10.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", - "dev": true - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "pako": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.7.tgz", - "integrity": "sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ==", - "dev": true - }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parse-asn1": { - "version": "5.1.1", - "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" - } - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "dev": true, - "requires": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "portfinder": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.19.tgz", - "integrity": "sha512-23aeQKW9KgHe6citUrG3r9HjeX6vls0h713TAa+CwTKZwNIr/pD2ApaxYF4Um3ZZyq4ar+Siv3+fhoHaIwSOSw==", - "dev": true, - "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "postcss": { - "version": "5.2.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" - }, - "dependencies": { - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "has-flag": "^1.0.0" + "is-buffer": "^1.1.5" } } } }, - "postcss-calc": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", - "dev": true, - "requires": { - "postcss": "^5.0.2", - "postcss-message-helpers": "^2.0.0", - "reduce-css-calc": "^1.2.6" - } + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true }, - "postcss-colormin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", + "object-is": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", "dev": true, "requires": { - "colormin": "^1.0.5", - "postcss": "^5.0.13", - "postcss-value-parser": "^3.2.3" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, - "postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", - "dev": true, - "requires": { - "postcss": "^5.0.11", - "postcss-value-parser": "^3.1.2" - } + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true }, - "postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "postcss": "^5.0.14" + "isobject": "^3.0.0" } }, - "postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { - "postcss": "^5.0.4" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, - "postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "postcss": "^5.0.14" + "isobject": "^3.0.1" } }, - "postcss-discard-overridden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "postcss": "^5.0.16" + "wrappy": "1" } }, - "postcss-discard-unused": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", - "dev": true, - "requires": { - "postcss": "^5.0.14", - "uniqs": "^2.0.0" - } + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true }, - "postcss-filter-plugins": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", - "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "postcss": "^5.0.4", - "uniqid": "^4.0.0" + "p-try": "^2.0.0" } }, - "postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "has": "^1.0.1", - "postcss": "^5.0.10", - "postcss-value-parser": "^3.1.1" + "p-limit": "^2.2.0" } }, - "postcss-merge-longhand": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, "requires": { - "postcss": "^5.0.4" + "aggregate-error": "^3.0.0" } }, - "postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, "requires": { - "browserslist": "^1.5.2", - "caniuse-api": "^1.5.2", - "postcss": "^5.0.4", - "postcss-selector-parser": "^2.2.2", - "vendors": "^1.0.0" + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" } }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, - "postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "dev": true, "requires": { - "object-assign": "^4.0.1", - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" } }, - "postcss-minify-gradients": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", "dev": true, "requires": { - "postcss": "^5.0.12", - "postcss-value-parser": "^3.3.0" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, - "postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.2", - "postcss-value-parser": "^3.0.2", - "uniqs": "^2.0.0" - } + "parse-ms": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", + "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", + "dev": true }, - "postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.2", - "has": "^1.0.1", - "postcss": "^5.0.14", - "postcss-selector-parser": "^2.0.0" - } + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true }, - "postcss-modules-extract-imports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", - "dev": true, - "requires": { - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz", - "integrity": "sha1-CcIC1ckX7CMYjKpcnLkXnNlUd1A=", - "dev": true, - "requires": { - "color-convert": "^1.0.0" - } - }, - "chalk": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", - "integrity": "sha512-Mp+FXEI+FrwY/XYV45b2YD3E8i3HwnEAoFcM0qlZzq/RZ9RwWitt2Y/c7cqRAz70U7hfekqx6qNYthuKFO6K0g==", - "dev": true, - "requires": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "postcss": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.6.tgz", - "integrity": "sha1-u6TVjohPx4yEDRU54Q7dqruPc70=", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "source-map": "^0.5.6", - "supports-color": "^4.1.0" - } - }, - "supports-color": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.0.tgz", - "integrity": "sha512-Ts0Mu/A1S1aZxEJNG88I4Oc9rcZSBFNac5e27yh4j2mqbhZSSzR1Ah79EYwSn9Zuh7lrlGD2cVGzw1RKGzyLSg==", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - } - } + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz", - "integrity": "sha1-CcIC1ckX7CMYjKpcnLkXnNlUd1A=", - "dev": true, - "requires": { - "color-convert": "^1.0.0" - } - }, - "chalk": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", - "integrity": "sha512-Mp+FXEI+FrwY/XYV45b2YD3E8i3HwnEAoFcM0qlZzq/RZ9RwWitt2Y/c7cqRAz70U7hfekqx6qNYthuKFO6K0g==", - "dev": true, - "requires": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" - } - }, - "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", - "dev": true, - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "postcss": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.6.tgz", - "integrity": "sha1-u6TVjohPx4yEDRU54Q7dqruPc70=", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "source-map": "^0.5.6", - "supports-color": "^4.1.0" - } - }, - "supports-color": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.0.tgz", - "integrity": "sha512-Ts0Mu/A1S1aZxEJNG88I4Oc9rcZSBFNac5e27yh4j2mqbhZSSzR1Ah79EYwSn9Zuh7lrlGD2cVGzw1RKGzyLSg==", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - } - } + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", "dev": true, - "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz", - "integrity": "sha1-CcIC1ckX7CMYjKpcnLkXnNlUd1A=", - "dev": true, - "requires": { - "color-convert": "^1.0.0" - } - }, - "chalk": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", - "integrity": "sha512-Mp+FXEI+FrwY/XYV45b2YD3E8i3HwnEAoFcM0qlZzq/RZ9RwWitt2Y/c7cqRAz70U7hfekqx6qNYthuKFO6K0g==", - "dev": true, - "requires": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" - } - }, - "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", - "dev": true, - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "postcss": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.6.tgz", - "integrity": "sha1-u6TVjohPx4yEDRU54Q7dqruPc70=", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "source-map": "^0.5.6", - "supports-color": "^4.1.0" - } - }, - "supports-color": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.0.tgz", - "integrity": "sha512-Ts0Mu/A1S1aZxEJNG88I4Oc9rcZSBFNac5e27yh4j2mqbhZSSzR1Ah79EYwSn9Zuh7lrlGD2cVGzw1RKGzyLSg==", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - } - } + "optional": true }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "dev": true, - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz", - "integrity": "sha1-CcIC1ckX7CMYjKpcnLkXnNlUd1A=", - "dev": true, - "requires": { - "color-convert": "^1.0.0" - } - }, - "chalk": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", - "integrity": "sha512-Mp+FXEI+FrwY/XYV45b2YD3E8i3HwnEAoFcM0qlZzq/RZ9RwWitt2Y/c7cqRAz70U7hfekqx6qNYthuKFO6K0g==", - "dev": true, - "requires": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "postcss": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.6.tgz", - "integrity": "sha1-u6TVjohPx4yEDRU54Q7dqruPc70=", - "dev": true, - "requires": { - "chalk": "^2.0.1", - "source-map": "^0.5.6", - "supports-color": "^4.1.0" - } - }, - "supports-color": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.0.tgz", - "integrity": "sha512-Ts0Mu/A1S1aZxEJNG88I4Oc9rcZSBFNac5e27yh4j2mqbhZSSzR1Ah79EYwSn9Zuh7lrlGD2cVGzw1RKGzyLSg==", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - } - } + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true }, - "postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", - "dev": true, - "requires": { - "postcss": "^5.0.5" - } + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, - "postcss-normalize-url": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", - "dev": true, - "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^1.4.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3" - } + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true }, - "postcss-ordered-values": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", - "dev": true, - "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.1" - } + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true }, - "postcss-reduce-idents": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } } }, - "postcss-reduce-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", "dev": true, "requires": { - "postcss": "^5.0.4" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "postcss-reduce-transforms": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true, - "requires": { - "has": "^1.0.1", - "postcss": "^5.0.8", - "postcss-value-parser": "^3.0.1" - } + "optional": true }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true }, - "postcss-svgo": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "is-svg": "^2.0.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3", - "svgo": "^0.7.0" + "find-up": "^4.0.0" } }, - "postcss-unique-selectors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", - "dev": true, - "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" - } + "plur": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", + "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", + "dev": true }, - "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, - "postcss-zindex": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "pretty-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", + "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", "dev": true, "requires": { - "has": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" + "is-finite": "^1.0.1", + "parse-ms": "^1.0.0", + "plur": "^1.0.0" } }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, "process": { - "version": "0.11.9", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.9.tgz", - "integrity": "sha1-e9WtIapiU+fahoImTx4R0RwDGME=", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", "dev": true }, "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, - "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", - "dev": true, - "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.8.0" - } - }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -4978,6 +3676,14 @@ "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "pump": { @@ -5019,28 +3725,6 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "q": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", - "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - } - }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -5053,16 +3737,10 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, - "querystringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", - "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", - "dev": true - }, "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { "safe-buffer": "^5.1.0" @@ -5078,34 +3756,16 @@ "safe-buffer": "^5.1.0" } }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true - }, - "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", - "dev": true, - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", - "unpipe": "1.0.0" - } - }, - "raw-loader": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", - "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", + "re-emitter": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/re-emitter/-/re-emitter-1.1.3.tgz", + "integrity": "sha1-+p4xn/3u6zWycpbvDz03TawvUqc=", "dev": true }, "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -5118,42 +3778,15 @@ } }, "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "dev": true, - "requires": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" - } - }, - "reduce-function-call": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", - "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", "dev": true, + "optional": true, "requires": { - "balanced-match": "^0.4.2" + "picomatch": "^2.2.1" } }, - "regenerate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", - "dev": true - }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -5164,37 +3797,31 @@ "safe-regex": "^1.1.0" } }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", "dev": true, "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", "dev": true, "requires": { - "jsesc": "~0.5.0" + "es6-error": "^4.0.1" } }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true + "dev": true, + "optional": true }, "repeat-element": { "version": "1.1.3", @@ -5215,16 +3842,19 @@ "dev": true }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } }, "resolve-cwd": { "version": "2.0.0", @@ -5233,12 +3863,43 @@ "dev": true, "requires": { "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + } } }, "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "resolve-url": { @@ -5247,6 +3908,15 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "resumer": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", + "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", + "dev": true, + "requires": { + "through": "~2.3.4" + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -5254,12 +3924,12 @@ "dev": true }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "ripemd160": { @@ -5289,117 +3959,37 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { "ret": "~0.1.10" } }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", "ajv-keywords": "^3.1.0" } }, - "script-loader": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/script-loader/-/script-loader-0.7.0.tgz", - "integrity": "sha1-aF3H5waeDe56kmdPDrxbD1W6pew=", - "dev": true, - "requires": { - "raw-loader": "~0.5.1" - } - }, - "select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", - "dev": true - }, - "selfsigned": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", - "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", - "dev": true, - "requires": { - "node-forge": "0.7.5" - } - }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - } - }, "serialize-javascript": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", - "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", - "dev": true - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", "dev": true, "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" + "randombytes": "^2.1.0" } }, "set-blocking": { @@ -5409,9 +3999,9 @@ "dev": true }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -5437,15 +4027,9 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, "sha.js": { "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -5454,54 +4038,65 @@ } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "side-channel": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", + "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "object-inspect": "^1.7.0" + } + }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "sinon": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.1.1.tgz", - "integrity": "sha512-iYagtjLVt1vN3zZY7D8oH7dkjNJEjLjyuzy8daX5+3bbQl8gaohrheB9VfH1O3L6LKuue5WTJvFluHiuZ9y3nQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.2.0", - "@sinonjs/formatio": "^3.0.0", - "@sinonjs/samsam": "^2.1.2", - "diff": "^3.5.0", - "lodash.get": "^4.4.2", - "lolex": "^3.0.0", - "nise": "^1.4.6", - "supports-color": "^5.5.0", - "type-detect": "^4.0.8" + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.1.tgz", + "integrity": "sha512-naPfsamB5KEE1aiioaoqJ6MEhdUs/2vtI5w1hPAXX/UwvoPjXcwh1m5HiKx0HGgKR8lQSoFIgY5jM6KK8VrS9w==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.8.1", + "@sinonjs/fake-timers": "^6.0.1", + "@sinonjs/formatio": "^5.0.1", + "@sinonjs/samsam": "^5.2.0", + "diff": "^4.0.2", + "nise": "^4.0.4", + "supports-color": "^7.1.0" }, "dependencies": { - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } } } }, @@ -5521,6 +4116,15 @@ "use": "^3.1.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -5538,6 +4142,12 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -5608,88 +4218,29 @@ "dev": true, "requires": { "is-buffer": "^1.1.5" - } - } - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "dev": true, - "requires": { - "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" - } - }, - "sockjs-client": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", - "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", - "dev": true, - "requires": { - "debug": "^3.2.5", - "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" + } + } } }, "source-list-map": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", - "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", "dev": true }, "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "dev": true, "requires": { - "atob": "^2.1.1", + "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", @@ -5697,9 +4248,9 @@ } }, "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -5720,33 +4271,27 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, - "spdy": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, "requires": { - "debug": "^2.6.8", - "handle-thing": "^1.2.5", - "http-deceiver": "^1.2.7", - "safe-buffer": "^5.0.1", - "select-hose": "^2.0.0", - "spdy-transport": "^2.0.18" + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" } }, - "spdy-transport": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.1.tgz", - "integrity": "sha512-q7D8c148escoB3Z7ySCASadkegMmUZW8Wb/Q1u0/XBgDKMO880rLQDj8Twiew/tYi7ghemKUi/whSYOwE17f5Q==", + "split": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.0.tgz", + "integrity": "sha1-xDlc5oOrzSVLwo/h2rtuXCfc/64=", "dev": true, "requires": { - "debug": "^2.6.8", - "detect-node": "^2.0.3", - "hpack.js": "^2.1.6", - "obuf": "^1.1.1", - "readable-stream": "^2.2.9", - "safe-buffer": "^5.0.1", - "wbuf": "^1.7.2" + "through": "2" } }, "split-string": { @@ -5794,16 +4339,10 @@ } } }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - }, "stream-browserify": { - "version": "2.0.1", - "resolved": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "dev": true, "requires": { "inherits": "~2.0.1", @@ -5834,47 +4373,56 @@ } }, "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.trim": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz", + "integrity": "sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, "string_decoder": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { @@ -5882,29 +4430,20 @@ } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.0" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, - "style-loader": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.13.2.tgz", - "integrity": "sha1-dFMzhM9pjHEEx5URULSXF63C87s=", - "dev": true, - "requires": { - "loader-utils": "^1.0.2" - } - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -5912,54 +4451,232 @@ "dev": true, "requires": { "has-flag": "^3.0.0" + } + }, + "tap-nirvana": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tap-nirvana/-/tap-nirvana-1.1.0.tgz", + "integrity": "sha512-TInVjB9doaYU8f1qX5/N2szEY+1ue506T1UQANrae8RSpQvrsYhtrXcHjkfgCcBVJKY38xZHi3izOkhqY7Yz3g==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "duplexer": "^0.1.1", + "figures": "^2.0.0", + "json-stringify-pretty-compact": "^1.1.0", + "lodash": "^4.17.10", + "pretty-ms": "^3.2.0", + "repeat-string": "^1.5.2", + "tap-out": "^3.0.0", + "through2": "^2.0.0", + "variable-diff": "^1.1.0" }, "dependencies": { - "has-flag": { + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "pretty-ms": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-3.2.0.tgz", + "integrity": "sha512-ZypexbfVUGTFxb0v+m1bUyy92DHe5SyYlnyY0msyms5zd3RwyvNgyxZZsXXgoyzlxjx5MiqtXUdhUfvQbe0A2Q==", + "dev": true, + "requires": { + "parse-ms": "^1.0.0" + } + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "dev": true, + "requires": { + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "tap-out": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "resolved": "https://registry.npmjs.org/tap-out/-/tap-out-3.0.0.tgz", + "integrity": "sha512-JzlrjCL3anqI9xHGPfYb6Mo+6nYs60m0tDy6i0sWhYDlrBDVerYPNWoUo1buK3YeWQFdm42KQv8wu9qLf1tL5A==", + "dev": true, + "requires": { + "re-emitter": "1.1.3", + "readable-stream": "2.2.9", + "split": "1.0.0", + "trim": "0.0.1" + } + } + } + }, + "tap-out": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tap-out/-/tap-out-2.1.0.tgz", + "integrity": "sha512-LJE+TBoVbOWhwdz4+FQk40nmbIuxJLqaGvj3WauQw3NYYU5TdjoV3C0x/yq37YAvVyi+oeBXmWnxWSjJ7IEyUw==", + "dev": true, + "requires": { + "re-emitter": "1.1.3", + "readable-stream": "2.2.9", + "split": "1.0.0", + "trim": "0.0.1" + }, + "dependencies": { + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "dev": true + }, + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "dev": true, + "requires": { + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } } } }, - "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + "tap-spec": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tap-spec/-/tap-spec-5.0.0.tgz", + "integrity": "sha512-zMDVJiE5I6Y4XGjlueGXJIX2YIkbDN44broZlnypT38Hj/czfOXrszHNNJBF/DXR8n+x6gbfSx68x04kIEHdrw==", "dev": true, "requires": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.3.1", - "js-yaml": "~3.7.0", - "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" + "chalk": "^1.0.0", + "duplexer": "^0.1.1", + "figures": "^1.4.0", + "lodash": "^4.17.10", + "pretty-ms": "^2.1.0", + "repeat-string": "^1.5.2", + "tap-out": "^2.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } } }, "tapable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", - "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, + "tape": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/tape/-/tape-5.0.1.tgz", + "integrity": "sha512-wVsOl2shKPcjdJdc8a+PwacvrOdJZJ57cLUXlxW4TQ2R6aihXwG0m0bKm4mA4wjtQNTaLMCrYNEb4f9fjHKUYQ==", + "dev": true, + "requires": { + "deep-equal": "^2.0.3", + "defined": "^1.0.0", + "dotignore": "^0.1.2", + "for-each": "^0.3.3", + "function-bind": "^1.1.1", + "glob": "^7.1.6", + "has": "^1.0.3", + "inherits": "^2.0.4", + "is-regex": "^1.0.5", + "minimist": "^1.2.5", + "object-inspect": "^1.7.0", + "object-is": "^1.1.2", + "object.assign": "^4.1.0", + "resolve": "^1.17.0", + "resumer": "^0.0.0", + "string.prototype.trim": "^1.2.1", + "through": "^2.3.8" + } + }, "terser": { - "version": "3.10.13", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.10.13.tgz", - "integrity": "sha512-AgdHqw2leuADuHiP4Kkk1i40m10RMGguPaiCw6MVD6jtDR7N94zohGqAS2lkDXIS7eIkGit3ief3eQGh/Md+GQ==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", "dev": true, "requires": { - "commander": "~2.17.1", + "commander": "^2.20.0", "source-map": "~0.6.1", - "source-map-support": "~0.5.6" + "source-map-support": "~0.5.12" }, "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -5969,32 +4686,92 @@ } }, "terser-webpack-plugin": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz", - "integrity": "sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", + "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", "dev": true, "requires": { - "cacache": "^11.0.2", - "find-cache-dir": "^2.0.0", + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", "schema-utils": "^1.0.0", - "serialize-javascript": "^1.4.0", + "serialize-javascript": "^3.1.0", "source-map": "^0.6.1", - "terser": "^3.8.1", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" }, "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "find-up": "^3.0.0" } }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -6003,10 +4780,21 @@ } } }, - "text-encoding": { - "version": "0.6.4", - "resolved": "http://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", - "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "through2": { @@ -6019,16 +4807,10 @@ "xtend": "~4.0.1" } }, - "thunky": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", - "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", - "dev": true - }, "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", "dev": true, "requires": { "setimmediate": "^1.0.4" @@ -6040,6 +4822,12 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "dev": true }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -6082,10 +4870,16 @@ "repeat-string": "^1.6.1" } }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", + "dev": true + }, "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", "dev": true }, "tty-browserify": { @@ -6095,20 +4889,16 @@ "dev": true }, "type-detect": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz", - "integrity": "sha512-N9IvkQslUGYGC24RkJk1ba99foK6TkwC2FHAEBlQFBP0RxQZS8ZpJuAZcwiY/w9ZJHFQb1aOXBI60OdxhTrwEQ==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, - "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.18" - } + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true }, "typedarray": { "version": "0.0.6", @@ -6116,86 +4906,27 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "is-typedarray": "^1.0.0" } }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, - "uniqid": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", - "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", - "dev": true, - "requires": { - "macaddress": "^0.2.8" + "set-value": "^2.0.1" } }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", - "dev": true - }, "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -6206,20 +4937,14 @@ } }, "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "dev": true, "requires": { "imurmurhash": "^0.1.4" } }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", @@ -6261,10 +4986,11 @@ } }, "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "optional": true }, "uri-js": { "version": "4.2.2", @@ -6299,16 +5025,6 @@ } } }, - "url-parse": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", - "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", - "dev": true, - "requires": { - "querystringify": "^2.0.0", - "requires-port": "^1.0.0" - } - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -6316,18 +5032,18 @@ "dev": true }, "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "requires": { - "inherits": "2.0.1" + "inherits": "2.0.3" }, "dependencies": { "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true } } @@ -6338,133 +5054,268 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, "v8-compile-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", - "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true - }, - "vendors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", - "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "variable-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/variable-diff/-/variable-diff-1.1.0.tgz", + "integrity": "sha1-0r1cZtt2wTh52W5qMG7cmJ35eNo=", "dev": true, "requires": { - "indexof": "0.0.1" + "chalk": "^1.1.1", + "object-assign": "^4.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } } }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz", + "integrity": "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==", "dev": true, "requires": { - "chokidar": "^2.0.2", + "chokidar": "^3.4.0", "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" } }, - "wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", "dev": true, + "optional": true, "requires": { - "minimalistic-assert": "^1.0.0" + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + } } }, "webpack": { - "version": "4.26.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.26.1.tgz", - "integrity": "sha512-i2oOvEvuvLLSuSCkdVrknaxAhtUZ9g+nLSoHCWV0gDzqGX2DXaCrMmMUpbRsTSSLrUqAI56PoEiyMUZIZ1msug==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/wasm-edit": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "acorn": "^5.6.2", - "acorn-dynamic-import": "^3.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", + "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", + "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^0.4.4", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.1", + "webpack-sources": "^1.4.1" } }, "webpack-cli": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz", - "integrity": "sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", "dev": true, "requires": { - "chalk": "^2.4.1", + "chalk": "^2.4.2", "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.0", - "global-modules-path": "^2.3.0", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", "import-local": "^2.0.0", - "interpret": "^1.1.0", - "loader-utils": "^1.1.0", - "supports-color": "^5.5.0", - "v8-compile-cache": "^2.0.2", - "yargs": "^12.0.2" + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, "cross-spawn": { @@ -6479,119 +5330,169 @@ "shebang-command": "^1.2.0", "which": "^1.2.9" } - } - } - }, - "webpack-dev-middleware": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", - "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", - "dev": true, - "requires": { - "memory-fs": "~0.4.1", - "mime": "^2.3.1", - "range-parser": "^1.0.3", - "webpack-log": "^2.0.0" - }, - "dependencies": { - "mime": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", - "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true - } - } - }, - "webpack-dev-server": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.10.tgz", - "integrity": "sha512-RqOAVjfqZJtQcB0LmrzJ5y4Jp78lv9CK0MZ1YJDTaTmedMZ9PU9FLMQNrMCfVu8hHzaVLVOJKBlGEHMN10z+ww==", - "dev": true, - "requires": { - "ansi-html": "0.0.7", - "bonjour": "^3.5.0", - "chokidar": "^2.0.0", - "compression": "^1.5.2", - "connect-history-api-fallback": "^1.3.0", - "debug": "^3.1.0", - "del": "^3.0.0", - "express": "^4.16.2", - "html-entities": "^1.2.0", - "http-proxy-middleware": "~0.18.0", - "import-local": "^2.0.0", - "internal-ip": "^3.0.1", - "ip": "^1.1.5", - "killable": "^1.0.0", - "loglevel": "^1.4.1", - "opn": "^5.1.0", - "portfinder": "^1.0.9", - "schema-utils": "^1.0.0", - "selfsigned": "^1.9.1", - "serve-index": "^1.7.2", - "sockjs": "0.3.19", - "sockjs-client": "1.3.0", - "spdy": "^3.4.1", - "strip-ansi": "^3.0.0", - "supports-color": "^5.1.0", - "webpack-dev-middleware": "3.4.0", - "webpack-log": "^2.0.0", - "yargs": "12.0.2" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "ms": "^2.1.1" + "locate-path": "^3.0.0" } }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, - "schema-utils": { + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "dev": true, "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" }, "dependencies": { - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -6600,35 +5501,38 @@ } } }, - "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "http-parser-js": ">=0.4.0", - "websocket-extensions": ">=0.1.1" + "isexe": "^2.0.0" } }, - "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", - "dev": true - }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", - "dev": true + "which-boxed-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz", + "integrity": "sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ==", + "dev": true, + "requires": { + "is-bigint": "^1.0.0", + "is-boolean-object": "^1.0.0", + "is-number-object": "^1.0.3", + "is-string": "^1.0.4", + "is-symbol": "^1.0.2" + } }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", "dev": true, "requires": { - "isexe": "^2.0.0" + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" } }, "which-module": { @@ -6637,44 +5541,64 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "which-typed-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.2.tgz", + "integrity": "sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.2", + "es-abstract": "^1.17.5", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + } + }, "worker-farm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", "dev": true, "requires": { "errno": "~0.1.7" } }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "color-name": "~1.1.4" } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true } } }, @@ -6684,16 +5608,22 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "xregexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", - "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", - "dev": true + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, "y18n": { @@ -6703,49 +5633,38 @@ "dev": true }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "yargs": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", - "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^2.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^4.2.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^10.1.0" - }, - "dependencies": { - "decamelize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", - "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", - "dev": true, - "requires": { - "xregexp": "4.0.0" - } - } + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" } }, "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { - "camelcase": "^4.1.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } diff --git a/package.json b/package.json index 230fa86..7ee366e 100644 --- a/package.json +++ b/package.json @@ -1,65 +1,57 @@ { "name": "ulog", - "version": "2.0.0-beta.7", - "description": "Microscopically small universal logging library", - "main": "node.js", - "unpkg": "ulog.min.js", - "browser": "browser.js", - "scripts": { - "clean": "rimraf ulog.umd.js && rimraf ulog.min.js", - "build-umd": "node ./build/build-umd.js", - "build-min": "uglifyjs ./ulog.umd.js -o ulog.min.js -c -m --screw-ie8", - "build-all": "npm run -S build-umd && npm run -S build-min", - "build": "cross-env NODE_ENV=production npm run -S build-all", - "release": "npm run -S clean && npm run -S build && npm run -S test", - "test": "mocha *.spec.js", - "dev": "webpack-dev-server --output-path /test --output-filename ulog.spec.js \"mocha-loader!./ulog.spec.js\" --content-base test --port 8888", - "debug": "webpack-dev-server --output-path /test --output-filename debug.spec.js \"mocha-loader!./debug.spec.js\" --content-base test --port 8888" + "version": "2.0.0-beta.8", + "description": "The universal logger", + "main": "./main.js", + "browser": { + "./mods/config/args.js": "./mods/config/args.browser.js", + "./mods/config/env.js": "./mods/config/env.browser.js", + "./mods/config/read.js": "./mods/config/read.browser.js", + "./mods/config/watch.js": "./mods/config/watch.browser.js", + "./mods/levels/default.js": "./mods/levels/default.browser.js", + "./mods/formats/simple.js": "./mods/formats/simple.browser.js" }, - "keywords": [ - "universal-components", - "microscopically small", - "small", - "tiny", - "universal", - "isomorphic", - "logging", - "logger", - "browser", - "node", - "nashorn", - "console", - "polyfill", - "1kB" + "unpkg": "ulog.min.js", + "files": [ + "core", + "mods", + "build.js", + "example.js", + "full.js", + "full.bundle.js", + "LICENSE", + "main.js", + "main.bundle.js", + "screenshot.jpg", + "test.js", + "tutorial.html", + "ulog.png", + "webpack.config.js" ], - "author": { - "name": "Stijn de Witt", - "email": "StijnDeWitt@hotmail.com", - "url": "http://StijnDeWitt.com" - }, - "copyright": "Copyright 2017 by [Stijn de Witt](http://StijnDeWitt.com). Some rights reserved.", - "license": "CC-BY-4.0", - "licenseUrl": "https://creativecommons.org/licenses/by/4.0/", - "repository": { - "type": "git", - "url": "https://github.com/download/ulog.git" + "scripts": { + "build": "webpack --mode production --display-modules && node ./build.js", + "clean": "rimraf ulog.min.js test.min.js", + "test": "nyc tape test.js 2>&1 | tap-nirvana", + "prepare": "npm run test -S && npm run clean -S && npm run build -S" }, - "bugs": { - "url": "https://github.com/download/ulog/issues" + "author": "", + "license": "MIT", + "dependencies": { + "anylogger": "^1.0.5", + "kurly": "^1.0.0" }, - "homepage": "http://github.com/download/ulog", "devDependencies": { - "chai": "^4.1.2", - "cross-env": "^5.1.3", - "mocha": "^4.0.1", - "mocha-loader": "^1.1.1", - "path": "^0.12.7", - "rimraf": "^2.6.2", - "sinon": "^7.1.1", - "uglify-js": "^3.4.9", - "webpack": "^4.26.1", - "webpack-cli": "^3.1.2", - "webpack-dev-server": "^3.1.10" + "gzip-size": "^5.1.1", + "nyc": "^15.1.0", + "rimraf": "^3.0.2", + "sinon": "^9.2.1", + "tap-nirvana": "^1.1.0", + "tap-spec": "^5.0.0", + "tape": "^5.0.1", + "webpack": "^4.43.0", + "webpack-cli": "^3.3.12" }, - "dependencies": {} + "peerDependencies": { + "anylogger": "^1.0.5" + } } diff --git a/screenshot.jpg b/screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..25499e3aca6b0abb2558c42f31342635a1ec4912 GIT binary patch literal 69258 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Թ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 e-48+52;if(91>e)return e-65;if(123>e)return e-97+26}var l="undefined"!==typeof Uint8Array?Uint8Array:Array;e.toByteArray=function(e){function g(a){c[d++]=a}var b,f,k,a,c;if(0>18&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(k>>12&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(k>>6&63)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(k&63),f+=k;switch(b){case 1:k=e[e.length-1];f+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(k>>2);f+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(k<< -4&63);f+="==";break;case 2:k=(e[e.length-2]<<8)+e[e.length-1],f+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(k>>10),f+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(k>>4&63),f+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(k<<2&63),f+="="}return f}})("undefined"===typeof t?this.base64js={}:t)},{}],4:[function(n,w,t){},{}],5:[function(n,w,t){function e(h,q,c){if(!(this instanceof e))return new e(h,q,c);var a=typeof h; -if("base64"===q&&"string"===a)for(h=h.trim?h.trim():h.replace(/^\s+|\s+$/g,"");0!==h.length%4;)h+="=";var d;if("number"===a)d=F(h);else if("string"===a)d=e.byteLength(h,q);else if("object"===a)d=F(h.length);else throw Error("First argument needs to be a number, array or string.");var b;e._useTypedArrays?b=e._augment(new Uint8Array(d)):(b=this,b.length=d,b._isBuffer=!0);if(e._useTypedArrays&&"number"===typeof h.byteLength)b._set(h);else{var f=h;if(E(f)||e.isBuffer(f)||f&&"object"===typeof f&&"number"=== -typeof f.length)for(q=0;q=a))return c?(c=h[q],q+ -1=a)){var d;c?(q+2>>0)):(q+1>>0);return d}}function g(h,q,a,c){c||(p("boolean"===typeof a,"missing or invalid endian"), -p(void 0!==q&&null!==q,"missing offset"),p(q+1=h.length))return h=l(h,q,a,!0),h&32768?-1*(65535-h+1):h}function b(h,q,a,c){c||(p("boolean"===typeof a,"missing or invalid endian"),p(void 0!==q&&null!==q,"missing offset"),p(q+3=h.length))return h=m(h,q,a,!0),h&2147483648?-1*(4294967295-h+1):h}function f(h,q,a,c){c||(p("boolean"===typeof a,"missing or invalid endian"),p(q+3=f))for(b=0,f=Math.min(f-c,2);b>>8* -(d?b:1-b)}function c(h,a,c,d,b){b||(p(void 0!==a&&null!==a,"missing value"),p("boolean"===typeof d,"missing or invalid endian"),p(void 0!==c&&null!==c,"missing offset"),p(c+3=f))for(b=0,f=Math.min(f-c,4);b>>8*(d?b:3-b)&255}function d(h,c,d,b,f){f||(p(void 0!==c&&null!==c,"missing value"),p("boolean"===typeof b,"missing or invalid endian"),p(void 0!==d&&null!==d,"missing offset"),p(d+1=h.length||(0<=c?a(h,c,d,b,f):a(h,65535+c+1,d,b,f))}function y(h,a,d,b,f){f||(p(void 0!==a&&null!==a,"missing value"),p("boolean"===typeof b,"missing or invalid endian"),p(void 0!==d&&null!==d,"missing offset"),p(d+3=h.length||(0<=a?c(h,a,d,b,f):c(h,4294967295+a+1,d,b,f))}function x(h,a,c,d,b){b||(p(void 0!==a&&null!==a,"missing value"),p("boolean"===typeof d, -"missing or invalid endian"),p(void 0!==c&&null!==c,"missing offset"),p(c+3=h.length||I.write(h,a,c,d,23,4)}function A(h,c,a,d,b){b||(p(void 0!==c&&null!==c,"missing value"),p("boolean"===typeof d,"missing or invalid endian"),p(void 0!==a&&null!==a,"missing offset"),p(a+7=h.length||I.write(h, -c,a,d,52,8)}function B(h,a,c){if("number"!==typeof h)return c;h=~~h;if(h>=a)return a;if(0<=h)return h;h+=a;return 0<=h?h:0}function F(h){h=~~Math.ceil(+h);return 0>h?0:h}function E(h){return(Array.isArray||function(h){return"[object Array]"===Object.prototype.toString.call(h)})(h)}function G(h){return 16>h?"0"+h.toString(16):h.toString(16)}function u(h){for(var a=[],c=0;c=d)a.push(h.charCodeAt(c));else{var b=c;55296<=d&&57343>=d&&c++;d=encodeURIComponent(h.slice(b, -c+1)).substr(1).split("%");for(b=0;b=c.length||b>=h.length);b++)c[b+a]=h[b];return b}function D(h){try{return decodeURIComponent(h)}catch(c){return String.fromCharCode(65533)}}function H(h,c){p("number"===typeof h,"cannot write a non-number as a number");p(0<=h,"specified a negative value for writing an unsigned value");p(h<= -c,"value is larger than maximum value for type");p(Math.floor(h)===h,"value has a fractional component")}function L(h,c,a){p("number"===typeof h,"cannot write a non-number as a number");p(h<=c,"value larger than maximum allowed value");p(h>=a,"value smaller than minimum allowed value");p(Math.floor(h)===h,"value has a fractional component")}function M(h,c,a){p("number"===typeof h,"cannot write a non-number as a number");p(h<=c,"value larger than maximum allowed value");p(h>=a,"value smaller than minimum allowed value")} -function p(h,c){if(!h)throw Error(c||"Failed assertion");}var J=n("base64-js"),I=n("ieee754");t.Buffer=e;t.SlowBuffer=e;t.INSPECT_MAX_BYTES=50;e.poolSize=8192;e._useTypedArrays=function(){try{var h=new ArrayBuffer(0),c=new Uint8Array(h);c.foo=function(){return 42};return 42===c.foo()&&"function"===typeof c.subarray}catch(a){return!1}}();e.isEncoding=function(h){switch(String(h).toLowerCase()){case "hex":case "utf8":case "utf-8":case "ascii":case "binary":case "base64":case "raw":case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":return!0; -default:return!1}};e.isBuffer=function(h){return!(null===h||void 0===h||!h._isBuffer)};e.byteLength=function(h,c){var a;h+="";switch(c||"utf8"){case "hex":a=h.length/2;break;case "utf8":case "utf-8":a=u(h).length;break;case "ascii":case "binary":case "raw":a=h.length;break;case "base64":a=J.toByteArray(h).length;break;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":a=2*h.length;break;default:throw Error("Unknown encoding");}return a};e.concat=function(h,c){p(E(h),"Usage: Buffer.concat(list, [totalLength])\nlist should be an Array."); -if(0===h.length)return new e(0);if(1===h.length)return h[0];var a;if("number"!==typeof c)for(a=c=0;ab&&(a=b)):a=b;d=String(d||"utf8").toLowerCase();switch(d){case "hex":c=Number(c)||0;d=this.length-c;a?(a=Number(a),a>d&&(a=d)):a=d;d= -h.length;p(0===d%2,"Invalid hex string");a>d/2&&(a=d/2);for(d=0;d>8,f%=256,b.push(f),b.push(d);h=e._charsWritten=z(b,this,c,a);break;default:throw Error("Unknown encoding");}return h};e.prototype.toString=function(a,c,d){a=String(a||"utf8").toLowerCase();c=Number(c)||0;d=void 0!==d?Number(d):d=this.length;if(d===c)return"";switch(a){case "hex":a=this.length;if(!c||0>c)c=0;if(!d||0>d||d>a)d=a;for(a="";c=this[c]?(a+=D(b)+String.fromCharCode(this[c]), -b=""):b+="%"+this[c].toString(16);d=a+D(b);break;case "ascii":d=r(this,c,d);break;case "binary":d=r(this,c,d);break;case "base64":d=0===c&&d===this.length?J.fromByteArray(this):J.fromByteArray(this.slice(c,d));break;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":d=this.slice(c,d);c="";for(a=0;a=d,"sourceEnd < sourceStart"),p(0<=c&&cthis.length&&(b=this.length),a.length-cb||!e._useTypedArrays)for(var f=0;f=this.length))return this[a]};e.prototype.readUInt16LE=function(a,c){return l(this,a,!0,c)};e.prototype.readUInt16BE=function(a,c){return l(this,a,!1,c)};e.prototype.readUInt32LE=function(a,c){return m(this,a,!0,c)};e.prototype.readUInt32BE=function(a,c){return m(this,a,!1,c)};e.prototype.readInt8=function(a,c){c||(p(void 0!==a&&null!==a,"missing offset"),p(a= -this.length))return this[a]&128?-1*(255-this[a]+1):this[a]};e.prototype.readInt16LE=function(a,c){return g(this,a,!0,c)};e.prototype.readInt16BE=function(a,c){return g(this,a,!1,c)};e.prototype.readInt32LE=function(a,c){return b(this,a,!0,c)};e.prototype.readInt32BE=function(a,c){return b(this,a,!1,c)};e.prototype.readFloatLE=function(a,c){return f(this,a,!0,c)};e.prototype.readFloatBE=function(a,c){return f(this,a,!1,c)};e.prototype.readDoubleLE=function(a,c){return k(this,a,!0,c)};e.prototype.readDoubleBE= -function(a,c){return k(this,a,!1,c)};e.prototype.writeUInt8=function(a,c,d){d||(p(void 0!==a&&null!==a,"missing value"),p(void 0!==c&&null!==c,"missing offset"),p(c=this.length||(this[c]=a)};e.prototype.writeUInt16LE=function(c,d,b){a(this,c,d,!0,b)};e.prototype.writeUInt16BE=function(c,d,b){a(this,c,d,!1,b)};e.prototype.writeUInt32LE=function(a,d,b){c(this,a,d,!0,b)};e.prototype.writeUInt32BE=function(a,d,b){c(this,a,d,!1,b)};e.prototype.writeInt8= -function(a,c,d){d||(p(void 0!==a&&null!==a,"missing value"),p(void 0!==c&&null!==c,"missing offset"),p(c=this.length||(0<=a?this.writeUInt8(a,c,d):this.writeUInt8(255+a+1,c,d))};e.prototype.writeInt16LE=function(a,c,b){d(this,a,c,!0,b)};e.prototype.writeInt16BE=function(a,c,b){d(this,a,c,!1,b)};e.prototype.writeInt32LE=function(a,c,d){y(this,a,c,!0,d)};e.prototype.writeInt32BE=function(a,c,d){y(this,a,c,!1,d)};e.prototype.writeFloatLE= -function(a,c,d){x(this,a,c,!0,d)};e.prototype.writeFloatBE=function(a,c,d){x(this,a,c,!1,d)};e.prototype.writeDoubleLE=function(a,c,d){A(this,a,c,!0,d)};e.prototype.writeDoubleBE=function(a,c,d){A(this,a,c,!1,d)};e.prototype.fill=function(a,c,d){a||(a=0);c||(c=0);d||(d=this.length);"string"===typeof a&&(a=a.charCodeAt(0));p("number"===typeof a&&!isNaN(a),"value is not a number");p(d>=c,"end < start");if(d!==c&&0!==this.length)for(p(0<=c&&c"};e.prototype.toArrayBuffer=function(){if("undefined"!==typeof Uint8Array){if(e._useTypedArrays)return(new e(this)).buffer;for(var a=new Uint8Array(this.length),c=0,d=a.length;c>1,a=-7;g=l?g-1:0;var c=l?-1:1,d=e[r+g];g+=c;l=d&(1<<-a)-1;d>>=-a;for(a+=b;0>=-a;for(a+=m;0>1,d=23===g?Math.pow(2,-24)-Math.pow(2,-77):0;b=m?0:b-1;var y=m?1:-1,x=0>r||0===r&&0>1/r?1:0;r=Math.abs(r);isNaN(r)||Infinity===r?(r=isNaN(r)?1:0,m=a):(m=Math.floor(Math.log(r)/Math.LN2),1>r*(f=Math.pow(2,-m))&&(m--,f*=2),r=1<=m+c?r+d/f:r+d*Math.pow(2,1-c),2<=r*f&&(m++,f/=2),m+c>=a?(r=0,m=a):1<=m+c?(r=(r*f-1)*Math.pow(2,g),m+=c):(r=r*Math.pow(2,c-1)*Math.pow(2,g),m=0));for(;8<=g;e[l+b]=r&255,b+=y,r/=256,g-=8);m=m<d?[]:a.slice(c,d-c+1)}b=t.resolve(b).substr(1);f=t.resolve(f).substr(1);for(var a=e(b.split("/")),c=e(f.split("/")),d=Math.min(a.length,c.length),g=d,x=0;xf&&(f=b.length+f);return b.substr(f,e)}}).call(this,n("node_modules/process/browser.js"))}, -{"node_modules/process/browser.js":8}],8:[function(n,w,t){function e(){}n=w.exports={};n.nextTick=function(){if("undefined"!==typeof window&&window.setImmediate)return function(e){return window.setImmediate(e)};if("undefined"!==typeof window&&window.postMessage&&window.addEventListener){var e=[];window.addEventListener("message",function(l){var m=l.source;m!==window&&null!==m||"process-tick"!==l.data||(l.stopPropagation(),0b?(-b<<1)+1:(b<<1)+0;do b=k&31,k>>>=5,0=k)throw Error("Expected more digits in base 64 VLQ value.");y=g.decode(b.charAt(e++));d=!!(y&32);y&=31;a+=y<>1;return{value:1===(a&1)?-k:k,rest:b.slice(e)}}})},{"./base64":12,amdefine:2}],12:[function(n,w,t){if("function"!==typeof e)var e=n("amdefine")(w,n);e(function(e,l,m){var g={},b={};"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("").forEach(function(e, -k){g[e]=k;b[k]=e});l.encode=function(e){if(e in b)return b[e];throw new TypeError("Must be between 0 and 63: "+e);};l.decode=function(b){if(b in g)return g[b];throw new TypeError("Not a valid base 64 digit: "+b);}})},{amdefine:2}],13:[function(n,w,t){if("function"!==typeof e)var e=n("amdefine")(w,n);e(function(e,l,m){function g(b,e,k,a,c){var d=Math.floor((e-b)/2)+b,y=c(k,a[d],!0);return 0===y?a[d]:0b?null:a[b]}l.search=function(b,e,k){return 0=a[b])throw new TypeError("Line must be greater than or equal to 1, got "+a[b]);if(0>a[e])throw new TypeError("Column must be greater than or equal to 0, got "+ -a[e]);return f.search(a,d,g)};g.prototype.originalPositionFor=function(a){a={generatedLine:b.getArg(a,"line"),generatedColumn:b.getArg(a,"column")};if(a=this._findMapping(a,this._generatedMappings,"generatedLine","generatedColumn",b.compareByGeneratedPositions)){var d=b.getArg(a,"source",null);d&&this.sourceRoot&&(d=b.join(this.sourceRoot,d));return{source:d,line:b.getArg(a,"originalLine",null),column:b.getArg(a,"originalColumn",null),name:b.getArg(a,"name",null)}}return{source:null,line:null,column:null, -name:null}};g.prototype.sourceContentFor=function(a){if(!this.sourcesContent)return null;this.sourceRoot&&(a=b.relative(this.sourceRoot,a));if(this._sources.has(a))return this.sourcesContent[this._sources.indexOf(a)];var d;if(this.sourceRoot&&(d=b.urlParse(this.sourceRoot))){var e=a.replace(/^file:\/\//,"");if("file"==d.scheme&&this._sources.has(e))return this.sourcesContent[this._sources.indexOf(e)];if((!d.path||"/"==d.path)&&this._sources.has("/"+a))return this.sourcesContent[this._sources.indexOf("/"+ -a)]}throw Error('"'+a+'" is not in the SourceMap.');};g.prototype.generatedPositionFor=function(a){a={source:b.getArg(a,"source"),originalLine:b.getArg(a,"line"),originalColumn:b.getArg(a,"column")};this.sourceRoot&&(a.source=b.relative(this.sourceRoot,a.source));return(a=this._findMapping(a,this._originalMappings,"originalLine","originalColumn",b.compareByOriginalPositions))?{line:b.getArg(a,"generatedLine",null),column:b.getArg(a,"generatedColumn",null)}:{line:null,column:null}};g.GENERATED_ORDER= -1;g.ORIGINAL_ORDER=2;g.prototype.eachMapping=function(a,d,e){d=d||null;switch(e||g.GENERATED_ORDER){case g.GENERATED_ORDER:e=this._generatedMappings;break;case g.ORIGINAL_ORDER:e=this._originalMappings;break;default:throw Error("Unknown order of iteration.");}var f=this.sourceRoot;e.map(function(a){var c=a.source;c&&f&&(c=b.join(f,c));return{source:c,generatedLine:a.generatedLine,generatedColumn:a.generatedColumn,originalLine:a.originalLine,originalColumn:a.originalColumn,name:a.name}}).forEach(a, -d)};l.SourceMapConsumer=g})},{"./array-set":10,"./base64-vlq":11,"./binary-search":13,"./util":17,amdefine:2}],15:[function(n,w,t){if("function"!==typeof e)var e=n("amdefine")(w,n);e(function(e,l,m){function g(a){this._file=f.getArg(a,"file");this._sourceRoot=f.getArg(a,"sourceRoot",null);this._sources=new k;this._names=new k;this._mappings=[];this._sourcesContents=null}var b=e("./base64-vlq"),f=e("./util"),k=e("./array-set").ArraySet;g.prototype._version=3;g.fromSourceMap=function(a){var c=a.sourceRoot, -d=new g({file:a.file,sourceRoot:c});a.eachMapping(function(a){var b={generated:{line:a.generatedLine,column:a.generatedColumn}};a.source&&(b.source=a.source,c&&(b.source=f.relative(c,b.source)),b.original={line:a.originalLine,column:a.originalColumn},a.name&&(b.name=a.name));d.addMapping(b)});a.sources.forEach(function(c){var b=a.sourceContentFor(c);b&&d.setSourceContent(c,b)});return d};g.prototype.addMapping=function(a){var c=f.getArg(a,"generated"),d=f.getArg(a,"original",null),b=f.getArg(a,"source", -null);a=f.getArg(a,"name",null);this._validateMapping(c,d,b,a);b&&!this._sources.has(b)&&this._sources.add(b);a&&!this._names.has(a)&&this._names.add(a);this._mappings.push({generatedLine:c.line,generatedColumn:c.column,originalLine:null!=d&&d.line,originalColumn:null!=d&&d.column,source:b,name:a})};g.prototype.setSourceContent=function(a,c){var d=a;this._sourceRoot&&(d=f.relative(this._sourceRoot,d));null!==c?(this._sourcesContents||(this._sourcesContents={}),this._sourcesContents[f.toSetString(d)]= -c):(delete this._sourcesContents[f.toSetString(d)],0===Object.keys(this._sourcesContents).length&&(this._sourcesContents=null))};g.prototype.applySourceMap=function(a,c){c||(c=a.file);var d=this._sourceRoot;d&&(c=f.relative(d,c));var b=new k,e=new k;this._mappings.forEach(function(g){if(g.source===c&&g.originalLine){var k=a.originalPositionFor({line:g.originalLine,column:g.originalColumn});null!==k.source&&(g.source=d?f.relative(d,k.source):k.source,g.originalLine=k.line,g.originalColumn=k.column, -null!==k.name&&null!==g.name&&(g.name=k.name))}(k=g.source)&&!b.has(k)&&b.add(k);(g=g.name)&&!e.has(g)&&e.add(g)},this);this._sources=b;this._names=e;a.sources.forEach(function(c){var b=a.sourceContentFor(c);b&&(d&&(c=f.relative(d,c)),this.setSourceContent(c,b))},this)};g.prototype._validateMapping=function(a,c,d,b){if(!(a&&"line"in a&&"column"in a&&0f)-(e",a=this.getLineNumber(),null!=a&&(b+=":"+a,(a=this.getColumnNumber())&&(b+=":"+a)));a="";var c=this.getFunctionName(),d=!0,e=this.isConstructor();if(this.isToplevel()||e)e?a+="new "+(c||""):c?a+=c:(a+=b,d=!1);else{var e=this.getTypeName(),f=this.getMethodName();c?(e&&0!=c.indexOf(e)&&(a+=e+"."),a+=c,f&&c.indexOf("."+ -f)!=c.length-f.length-1&&(a+=" [as "+f+"]")):a+=e+"."+(f||"")}d&&(a+=" ("+b+")");return a}function c(b){var c={};Object.getOwnPropertyNames(Object.getPrototypeOf(b)).forEach(function(a){c[a]=/^(?:is|get)/.test(a)?function(){return b[a].call(b)}:b[a]});c.toString=a;return c}function d(a){var b=a.getFileName()||a.getScriptNameOrSourceURL();if(b){var d=a.getLineNumber(),e=a.getColumnNumber()-1;1!==d||l()||a.isEval()||(e-=62);var g=f({source:b,line:d,column:e});a=c(a);a.getFileName=function(){return g.source}; -a.getLineNumber=function(){return g.line};a.getColumnNumber=function(){return g.column+1};a.getScriptNameOrSourceURL=function(){return g.source};return a}var m=a.isEval()&&a.getEvalOrigin();m&&(m=k(m),a=c(a),a.getEvalOrigin=function(){return m});return a}function w(a,b){u&&(z={},D={});return a+b.map(function(a){return"\n at "+d(a)}).join("")}function x(a){var b=/\n at [^(]+ \((.*):(\d+):(\d+)\)/.exec(a.stack);if(b){a=b[1];var c=+b[2],b=+b[3],d=z[a];!d&&E.existsSync(a)&&(d=E.readFileSync(a,"utf8")); -if(d&&(d=d.split(/(?:\r\n|\r|\n)/)[c-1]))return a+":"+c+"\n"+d+"\n"+Array(b).join(" ")+"^"}return null}function A(){var a=e.emit;e.emit=function(b){if("uncaughtException"===b){var c=arguments[1]&&arguments[1].stack,d=0 - - - ulog - - - - - - - \ No newline at end of file diff --git a/test/index.html b/test/index.html deleted file mode 100644 index e8cc962..0000000 --- a/test/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - ulog - - - - - - - \ No newline at end of file diff --git a/tutorial.html b/tutorial.html new file mode 100644 index 0000000..eeb6362 --- /dev/null +++ b/tutorial.html @@ -0,0 +1,222 @@ + + + + ulog + + + + + +

ulog

+

Press button, open console

+

Press the button, then open the developer tools (F12) and check the console for messages.

+ +

With the default configuration, you should see 4 log messages:

+
+  test:log1            This is a WARN message
+  test:log1            This is an ERROR message
+  test:log2            This is a WARN message
+  test:log2            This is an ERROR message
+    
+ +

Initially there are 2 loggers defined, test:log1 and test:log2. When you press the button, + the test code loops through all loggers and logs a message at all levels with each of them. +

+ +

Browse the sections below for details and experiment with creating loggers, changing config + etc. Every time you want to test the new situation, press the big button again. +

+ +
+ + Named loggers + + +

In ulog all loggers have a name. Currently these loggers are defined:

+ +
    +
  • test:log1
  • +
  • test:log2
  • +
+ +

You can remove them by pressing the 'x' button, or add a new logger with the text field and button below:

+ + + +
+ +
+ + Configuration + + +

ulog features dynamic configuration. This means ulog monitors the configuration + (in localStorage on browsers and in a config file on Node JS) and picks up any + changes you make at runtime, without the need to refresh the page or restart the app. +

+ +

In the developer tools, inspect the keys in localStorage. The following keys can be set + to influence the behavior of ulog: +

+ + + + + + + + + + + + + + + + + + + + + + +
logConfigure log levels
debugConfigure debug mode
log_outputConfigure the log output
log_drainConfigure the log drain
log_formatConfigure the log format
+
+ +

You can experiment with different settings and press the button to see which messages get logged. + Pressing the small button next to the example code applies the setting. Press the big button again + and check whether the output is as expected. +

+ +
+ + localStorage.setItem('log', 'debug') + + +
+  test:log1             This is a DEBUG message
+  test:log1             This is a LOG message
+  test:log1             This is an INFO message
+  test:log1             This is a WARN message
+  test:log1             This is an ERROR message
+    test @ test.html:16
+    onclick @ test.html:32
+  test:log2             This is a DEBUG message
+  test:log2             This is a LOG message
+  test:log2             This is an INFO message
+  test:log2             This is a WARN message
+  test:log2             This is an ERROR message
+    test @ test.html:24
+    onclick @ test.html:32
+      
+
+ +
+ + localStorage.setItem('log', 'info') + + +
+        ulog:test:log1        This is an INFO message
+        ulog:test:log1        This is a WARN message
+        ulog:test:log1        This is an ERROR message
+          test @ test.html:16
+          onclick @ test.html:32
+        ulog:test:log2        This is an INFO message
+        ulog:test:log2        This is a WARN message
+        ulog:test:log2        This is an ERROR message
+          test @ test.html:24
+          onclick @ test.html:32
+      
+
+ +
+ + localStorage.setItem('log', 'all') + + +
+        ulog:test:log1        This is a TRACE message
+        test @ test.html:11
+        onclick @ test.html:32
+      ulog:test:log1        This is a DEBUG message
+      ulog:test:log1        This is a LOG message
+      ulog:test:log1        This is an INFO message
+      ulog:test:log1        This is a WARN message
+      ulog:test:log1        This is an ERROR message
+        test @ test.html:16
+        onclick @ test.html:32
+      ulog:test:log2        This is a TRACE message
+        test @ test.html:19
+        onclick @ test.html:32
+      ulog:test:log2        This is a DEBUG message
+      ulog:test:log2        This is a LOG message
+      ulog:test:log2        This is an INFO message
+      ulog:test:log2        This is a WARN message
+      ulog:test:log2        This is an ERROR message
+        test @ test.html:24
+        onclick @ test.html:32
+      
+
+ +
+ + localStorage.setItem('log', 'none') + + +
+        // (no output)
+      
+
+ +

Configuration

+

In browsers, ulog accepts configuration from the querystring and from localStorage. + These correspond to the program arguments, environment variables and config file on Node JS. + The configuration is automatically monitored for changes. + You can use simple but powerful expressions in your configuration. These expressions are + an extension on the configuration mechanism of debug. +

+ + \ No newline at end of file diff --git a/ulog.js b/ulog.js deleted file mode 100644 index 6946398..0000000 --- a/ulog.js +++ /dev/null @@ -1,85 +0,0 @@ -// ulog - microscopically small universal logging library -// © 2017 by Stijn de Witt, some rights reserved -// License: CC-BY-4.0 - -function log(n){ - return !n ? extend(log) : mods[n] || (mods[n] = extend(create(n), log)) -} - -log.formats = [] -log.extends = [] - -log.enable = function(s) { - var i, split = (s || '').split(/[\s,]+/); - for (i=0; i 1 && names[args[0]] ? args.shift() : 'debug' - for (var i=0; i= 0 && lvl <= 6) l = lvl - } - patch(o) - if (!p) {for (var mod in mods) {patch(mods[mod])}} - } - }) - patch(o) - for (var i=0; i0;o--)n=r?(e||" ")+n:n+(e||" ");return n};e.RIGHT=0,e.LEFT=1},function(n,t,e){var r=e(0);n.exports=function(n,t){var e=r(n,"settings",{}),o={};for(var i in e)try{var u=e[i].config||i;u in localStorage&&(o[u]=localStorage.getItem(u))}catch(n){}return t?t(o):o}},function(n,t,e){var r=n.exports={use:[e(1)],get:function(n,t,e){return void 0===e?n:r.eval(r.parse(n,t),e)},parse:function(n,t){for(var e,r,o="debug"==t&&t,i=[],u=(n||"").trim().split(/(?=n[t.toUpperCase()]},this.levels)n.enabledFor(t)||(n[t]=n.discard)}}},function(n,t,e){var r=e(0);n.exports={use:[e(7)],settings:{format:{config:"log_format",prop:{default:"simple"}}},formats:{none:function(){},simple:e(23),json:e(24),"*":function(){}},ext:function(n){var t=r(this,"formats",{});(t[n.format]||t["*"]).call(this,n)},record:function(n,t,e,o){o.time=new Date,o.name=n.name,o.message=e,o.level=n[t.toUpperCase()],o.levelName=t;var i=r(this,"settings",{});for(var u in i)i[u].prop&&(o["log_"+u]=n[u]);o.logger=n}}},function(n,t,e){var r=e(3);n.exports=function(n){return r(n.name,19)}},function(n,t,e){var r=e(25);n.exports=function(n,t,e){var o=function(o,i){return function(){var u=[].slice.call(arguments),s=r(n,t,o,u);u=e(s),Array.isArray(u)||(u=[u]),i.apply(t,u)}};for(var i in n.levels)t[i]=o.call(n,i,t[i]);t.discard=o.call(n,i,t.discard)}},function(n,t,e){n.exports=window.ulog=window.anylogger=e(12)},function(n,t,e){(n.exports=e(13)).use(e(15))},function(n,t,e){var r=e(14),o=e(0);r.ext=function(n){if(n)return o(r,"ext",[]).map((function(t){t.call(r,n)})),n;for(n in r())r.ext(r(n))},r.mods=[],r.use=function(n){if(Array.isArray(n))return n.reduce((function(n,t){return n+r.use(t)}),0);var t=-1===r.mods.indexOf(n)?1:0;if(t){if(n.use&&(t+=r.use(n.use)),n.extend)for(var e in n.extend)r[e]=n.extend[e];n.init&&n.init.call(r),r.mods.push(n)}return t},n.exports=r},function(n,t){var e=Object.create(null),r=function(n,t){return n?e[n]||(e[n]=r.ext(r.new(n,t))):e};r.levels={error:1,warn:2,info:3,log:4,debug:5,trace:6},r.new=function(n,t){var e=new Function("a","n","return {'"+n+"':function(){a.log(n,[].slice.call(arguments))}}[n]")(r,n);try{Object.defineProperty(e,"name",{get:function(){return n}})}catch(n){}return e},r.log=function(n,t){var o=t.length>1&&r.levels[t[0]]?t.shift():"log";e[n][o].apply(e[n],t)},r.ext=function(n){var t="undefined"!=typeof console&&console;for(var e in n.enabledFor=function(){return!0},r.levels)n[e]=t&&(t[e]||t.log)||function(){};return n},n.exports=r},function(n,t,e){n.exports=[e(1),e(16),e(5),e(2),e(6),e(7),e(8)]},function(n,t,e){var r=e(0),o=e(17),i=e(19),u=e(4),s=e(20);n.exports={use:[e(1)],get:function(n,t){if(this.config||(this.config={},this.config=u(this),s(this)),!n){var e=r(this,"settings",{});t=e[t]&&e[t].config||t}return n||this.config[t]||o[t]||i[t],n||this.config[t]||o[t]||i[t]},set:function(n){"log_config"===n&&(this.config=u(this))}}},function(n,t,e){var r=e(18);n.exports=r(location.search.replace(/^(\?|#|&)/,"").split("&"),/\+/g," ",decodeURIComponent)},function(n,t){n.exports=function(n,t,e,r){return n.reduce((function(n,o){var i=(o=o.replace(t,e)).indexOf("=");if(-1!==i){var u=o.substring(0,i).replace(/^\s+|\s+$/g,"");if(u){var s=o.substring(i+1).replace(/^\s+|\s+$/g,"");r&&(s=r(s)),n[u]=s}}return n}),{})}},function(n,t){n.exports={}},function(n,t,e){var r=e(4),o=e(21);n.exports=function(n){setInterval((function(){if(n.config){var t=r(n);o(n.config,t)&&n.ext()}}),350)}},function(n,t){n.exports=function(n,t){var e,r=0;for(e in n)e in t||(delete n[e],r++);for(e in t)e in n&&n[e]===t[e]||(n[e]=t[e],r++);return r}},function(n,t){n.exports="warn"},function(n,t,e){var r=e(9);n.exports=function(n){var t=r(n);for(var e in this.levels)n[e]=n[e].bind(n,t);n.discard=n.discard.bind(n,t)}},function(n,t,e){var r=e(10);n.exports=function(n){r(this,n,JSON.stringify)}},function(n,t,e){var r=e(0);n.exports=function(n,t,e,o){return r(n,"record",[]).reduce((function(r,i){return i.call(n,t,e,o,r),r}),{})}}]); \ No newline at end of file diff --git a/ulog.min.js.map b/ulog.min.js.map deleted file mode 100644 index d323af0..0000000 --- a/ulog.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///ulog.min.js","webpack:///webpack/bootstrap dce06a28a67eb6b226e2","webpack:///./browser.js","webpack:///./ulog.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","lvl","dbg","i","log","qs","location","search","substring","args","split","con","window","console","enable","level","WARN","name","mods","enhance","debug","o","parent","NONE","key","LVL","Object","defineProperty","get","undefined","set","n","Number","toUpperCase","patch","mod","dir","bnd","nop","time","timeEnd","assert","a","concat","apply","arguments","ok","shift","error","Math","max","enabled","DEBUG","names","print","bind","ulog","version","str","length","replace","skipMods","push","RegExp","substr","dbgMods","test","disable","ERROR","INFO","LOG","TRACE","keys","map","x","toLowerCase"],"mappings":"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","file":"ulog.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ulog\"] = factory();\n\telse\n\t\troot[\"ulog\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ulog\"] = factory();\n\telse\n\t\troot[\"ulog\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\tvar log = __webpack_require__(1),\r\n\t\t\tqs = location.search.substring(1),\r\n\t\t\targs = qs && qs.split('&'),\r\n\t\t\tlvl, dbg, i, m\r\n\t\r\n\tfor (i=0; m=args && args[i] && args[i].split('='); i++) {\r\n\t\tm[0] == 'log' ? lvl = m[1] : 0\r\n\t\tm[0] == 'debug' ? dbg = m[1] : 0\r\n\t}\r\n\t\r\n\tlog.con = function(){return window.console && console}\r\n\tdbg && log.enable(dbg)\r\n\tmodule.exports = log()\r\n\tlog.level = lvl || log.WARN\r\n\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\tfunction log(name){\r\n\t\treturn name\r\n\t\t\t? (mods[name] ? mods[name] : (mods[name] = enhance({name:name}, log)))\r\n\t\t\t: (log.debug ? log : enhance(log))\r\n\t}\r\n\t\r\n\tlog.ulog = {version:'0.1.0'}\r\n\t\r\n\tlog.enable = function(str) {\r\n\t\tvar i, split = (str || '').split(/[\\s,]+/);\r\n\t\tfor (i=0; i= 0 && lvl <= 6) {level = lvl}\r\n\t\t\t\t}\r\n\t\t\t\tpatch(o, parent)\r\n\t\t\t\tif (!parent) {for (mod in mods) {patch(mods[mod], o)}}\r\n\t\t\t}\r\n\t\t})\r\n\t\tpatch(o, parent)\r\n\t\to.dir = bnd('dir') || nop\r\n\t\to.time = bnd('time') || nop\r\n\t\to.timeEnd = bnd('timeEnd') || nop\r\n\t\to.assert = function(){\r\n\t\t\tvar a=[].concat.apply([], arguments), ok=a.shift()\r\n\t\t\tif (!ok) {o.error.apply(o, a)}\r\n\t\t}\r\n\t\treturn o\r\n\t}\r\n\t\r\n\tfunction patch(o, parent) {\r\n\t\tvar lvl = Math.max(o.name && log.enabled(o.name) && o.DEBUG || o.level, o.level)\r\n\t\tfor (var i=0,name; name=names[i]; i++) {\r\n\t\t\to[name] = lvl <= i\r\n\t\t\t\t? nop\r\n\t\t\t\t: (\r\n\t\t\t\t\tbnd(name) ||\r\n\t\t\t\t\t(typeof print == 'function' && print) ||\r\n\t\t\t\t\tfunction(){\r\n\t\t\t\t\t\tif (log.con()) {\r\n\t\t\t\t\t\t\tpatch(o)\r\n\t\t\t\t\t\t\to[name].apply(o, arguments)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t)\r\n\t\t}\r\n\t}\r\n\t\r\n\tfunction bnd(n,c){return (c = log.con()) && (c[n]||c.log).bind(c)}\r\n\tfunction nop(){}\r\n\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** ulog.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap dce06a28a67eb6b226e2\n **/","var log = require('./ulog'),\r\n\t\tqs = location.search.substring(1),\r\n\t\targs = qs && qs.split('&'),\r\n\t\tlvl, dbg, i, m\r\n\r\nfor (i=0; m=args && args[i] && args[i].split('='); i++) {\r\n\tm[0] == 'log' ? lvl = m[1] : 0\r\n\tm[0] == 'debug' ? dbg = m[1] : 0\r\n}\r\n\r\nlog.con = function(){return window.console && console}\r\ndbg && log.enable(dbg)\r\nmodule.exports = log()\r\nlog.level = lvl || log.WARN\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./browser.js\n ** module id = 0\n ** module chunks = 0\n **/","function log(name){\r\n\treturn name\r\n\t\t? (mods[name] ? mods[name] : (mods[name] = enhance({name:name}, log)))\r\n\t\t: (log.debug ? log : enhance(log))\r\n}\r\n\r\nlog.ulog = {version:'0.1.0'}\r\n\r\nlog.enable = function(str) {\r\n\tvar i, split = (str || '').split(/[\\s,]+/);\r\n\tfor (i=0; i= 0 && lvl <= 6) {level = lvl}\r\n\t\t\t}\r\n\t\t\tpatch(o, parent)\r\n\t\t\tif (!parent) {for (mod in mods) {patch(mods[mod], o)}}\r\n\t\t}\r\n\t})\r\n\tpatch(o, parent)\r\n\to.dir = bnd('dir') || nop\r\n\to.time = bnd('time') || nop\r\n\to.timeEnd = bnd('timeEnd') || nop\r\n\to.assert = function(){\r\n\t\tvar a=[].concat.apply([], arguments), ok=a.shift()\r\n\t\tif (!ok) {o.error.apply(o, a)}\r\n\t}\r\n\treturn o\r\n}\r\n\r\nfunction patch(o, parent) {\r\n\tvar lvl = Math.max(o.name && log.enabled(o.name) && o.DEBUG || o.level, o.level)\r\n\tfor (var i=0,name; name=names[i]; i++) {\r\n\t\to[name] = lvl <= i\r\n\t\t\t? nop\r\n\t\t\t: (\r\n\t\t\t\tbnd(name) ||\r\n\t\t\t\t(typeof print == 'function' && print) ||\r\n\t\t\t\tfunction(){\r\n\t\t\t\t\tif (log.con()) {\r\n\t\t\t\t\t\tpatch(o)\r\n\t\t\t\t\t\to[name].apply(o, arguments)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t)\r\n\t}\r\n}\r\n\r\nfunction bnd(n,c){return (c = log.con()) && (c[n]||c.log).bind(c)}\r\nfunction nop(){}\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./ulog.js\n ** module id = 1\n ** module chunks = 0\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/ulog.spec.js b/ulog.spec.js deleted file mode 100644 index 0f11103..0000000 --- a/ulog.spec.js +++ /dev/null @@ -1,642 +0,0 @@ -var expect = require('chai').expect -var sinon = require('sinon') - -var testConsole = require('./test/console') - -var log = require('./') -var oldLevel = log.level -log.con = function(){return testConsole} -log.level = log.level // trigger patch, so testConsole is used - -var named = require('./')('my-module-name') -var oldNamed = named.level - -describe('var log = require(\'ulog\')', function(){ - it('yields a function `log`', function(){ - expect(log).to.be.a('function') - }) -}) - -describe('log', function(){ - it('implements the Console API', function(){ - expect(log).to.have.a.property('error') - expect(log.error).to.be.a('function') - expect(log).to.have.a.property('warn') - expect(log.warn).to.be.a('function') - expect(log).to.have.a.property('info') - expect(log.info).to.be.a('function') - expect(log).to.have.a.property('log') - expect(log.log).to.be.a('function') - expect(log).to.have.a.property('trace') - expect(log.trace).to.be.a('function') - expect(log).to.have.a.property('dir') - expect(log.dir).to.be.a('function') - expect(log).to.have.a.property('time') - expect(log.time).to.be.a('function') - expect(log).to.have.a.property('timeEnd') - expect(log.timeEnd).to.be.a('function') - expect(log).to.have.a.property('assert') - expect(log.assert).to.be.a('function') - }) - - it('has a method `assert` that does not throw', function(){ - expect(function(){log.assert(false, 'assert does not throw')}).to.not.throw() - }) - - it('has an additional logging method named `debug`', function(){ - expect(log).to.have.a.property('debug') - expect(log.debug).to.be.a('function') - }) - - it('can log messages using methods `error`, `warn`, `info`, `log`, `debug` and `trace`', function(){ - testConsole.reset() - log.level = log.INFO - try { - expect(log.level).to.equal(log.INFO) - expect(testConsole.error.callCount).to.equal(0) - log.error('Message logged with log.error') - expect(testConsole.error.callCount).to.equal(1) - - log.warn('Message logged with log.warn') - expect(testConsole.warn.callCount).to.equal(1) - - log.info('Message logged with log.info') - expect(testConsole.info.callCount).to.equal(1) - - log.log('Message logged with log.log') - expect(testConsole.log.callCount).to.equal(0) // below log level - - log.debug('Message logged with log.debug') - expect(testConsole.debug.callCount).to.equal(0) // below log level - - log.trace('Message logged with log.trace') - expect(testConsole.trace.callCount).to.equal(0) // below log level - } finally { - log.level = oldLevel - testConsole.reset() - } - }) - - it('has constants for the log levels `ERROR`, `WARN`, `INFO`, `LOG`, `DEBUG` and `TRACE`', function(){ - expect(log).to.have.a.property('ERROR') - expect(log.ERROR).to.equal(1) - expect(log).to.have.a.property('WARN') - expect(log.WARN).to.equal(2) - expect(log).to.have.a.property('INFO') - expect(log.INFO).to.equal(3) - expect(log).to.have.a.property('LOG') - expect(log.LOG).to.equal(4) - expect(log).to.have.a.property('DEBUG') - expect(log.DEBUG).to.equal(5) - expect(log).to.have.a.property('TRACE') - expect(log.TRACE).to.equal(6) - }) - - it('has an additional constant for the special log level `NONE`, which suppresses all logging', function(){ - expect(log).to.have.a.property('NONE') - expect(log.NONE).to.equal(0) - }) - - it('has a property `level`', function(){ - expect(log).to.have.a.property('level') - }) - - it('`level` can be assigned a different logging level', function(){ - testConsole.reset() - try { - log.level = log.ERROR - expect(log.level).to.equal(log.ERROR) - log.error('Message logged with log.error, after level was set to ERROR') - expect(testConsole.error.callCount).to.equal(1) - log.warn('Message logged with log.warn, after level was set to ERROR') - expect(testConsole.warn.callCount).to.equal(0) - log.info('Message logged with log.info, after level was set to ERROR') - expect(testConsole.info.callCount).to.equal(0) - log.log('Message logged with log.log, after level was set to ERROR') - expect(testConsole.log.callCount).to.equal(0) - log.debug('Message logged with log.debug, after level was set to ERROR') - expect(testConsole.debug.callCount).to.equal(0) - log.trace('Message logged with log.trace, after level was set to ERROR') - expect(testConsole.trace.callCount).to.equal(0) - testConsole.reset() - log.level = log.WARN - expect(log.level).to.equal(log.WARN) - log.error('Message logged with log.error, after level was set to WARN') - expect(testConsole.error.callCount).to.equal(1) - log.warn('Message logged with log.warn, after level was set to WARN') - expect(testConsole.warn.callCount).to.equal(1) - log.info('Message logged with log.info, after level was set to WARN') - expect(testConsole.info.callCount).to.equal(0) - log.log('Message logged with log.log, after level was set to WARN') - expect(testConsole.log.callCount).to.equal(0) - log.debug('Message logged with log.debug, after level was set to WARN') - expect(testConsole.debug.callCount).to.equal(0) - log.trace('Message logged with log.trace, after level was set to WARN') - expect(testConsole.trace.callCount).to.equal(0) - testConsole.reset() - log.level = log.INFO - expect(log.level).to.equal(log.INFO) - log.error('Message logged with log.error, after level was set to INFO') - expect(testConsole.error.callCount).to.equal(1) - log.warn('Message logged with log.warn, after level was set to INFO') - expect(testConsole.warn.callCount).to.equal(1) - log.info('Message logged with log.info, after level was set to INFO') - expect(testConsole.info.callCount).to.equal(1) - log.log('Message logged with log.log, after level was set to INFO') - expect(testConsole.log.callCount).to.equal(0) - log.debug('Message logged with log.debug, after level was set to INFO') - expect(testConsole.debug.callCount).to.equal(0) - log.trace('Message logged with log.trace, after level was set to INFO') - expect(testConsole.trace.callCount).to.equal(0) - testConsole.reset() - log.level = log.LOG - expect(log.level).to.equal(log.LOG) - log.error('Message logged with log.error, after level was set to LOG') - expect(testConsole.error.callCount).to.equal(1) - log.warn('Message logged with log.warn, after level was set to LOG') - expect(testConsole.warn.callCount).to.equal(1) - log.info('Message logged with log.info, after level was set to LOG') - expect(testConsole.info.callCount).to.equal(1) - log.log('Message logged with log.log, after level was set to LOG') - expect(testConsole.log.callCount).to.equal(1) - log.debug('Message logged with log.debug, after level was set to LOG') - expect(testConsole.debug.callCount).to.equal(0) - log.trace('Message logged with log.trace, after level was set to LOG') - expect(testConsole.trace.callCount).to.equal(0) - testConsole.reset() - log.level = log.DEBUG - expect(log.level).to.equal(log.DEBUG) - log.error('Message logged with log.error, after level was set to DEBUG') - expect(testConsole.error.callCount).to.equal(1) - log.warn('Message logged with log.warn, after level was set to DEBUG') - expect(testConsole.warn.callCount).to.equal(1) - log.info('Message logged with log.info, after level was set to DEBUG') - expect(testConsole.info.callCount).to.equal(1) - log.log('Message logged with log.log, after level was set to DEBUG') - expect(testConsole.log.callCount).to.equal(1) - log.debug('Message logged with log.debug, after level was set to DEBUG') - expect(testConsole.debug.callCount).to.equal(1) - log.trace('Message logged with log.trace, after level was set to DEBUG') - expect(testConsole.trace.callCount).to.equal(0) - testConsole.reset() - log.level = log.TRACE - expect(log.level).to.equal(log.TRACE) - log.error('Message logged with log.error, after level was set to TRACE') - expect(testConsole.error.callCount).to.equal(1) - log.warn('Message logged with log.warn, after level was set to TRACE') - expect(testConsole.warn.callCount).to.equal(1) - log.info('Message logged with log.info, after level was set to TRACE') - expect(testConsole.info.callCount).to.equal(1) - log.log('Message logged with log.log, after level was set to TRACE') - expect(testConsole.log.callCount).to.equal(1) - log.debug('Message logged with log.debug, after level was set to TRACE') - expect(testConsole.debug.callCount).to.equal(1) - log.trace('Message logged with log.trace, after level was set to TRACE') - expect(testConsole.trace.callCount).to.equal(1) - testConsole.reset() - log.level = log.NONE - expect(log.level).to.equal(log.NONE) - log.error('Message logged with log.error, after level was set to NONE') - expect(testConsole.error.callCount).to.equal(0) - log.warn('Message logged with log.warn, after level was set to NONE') - expect(testConsole.warn.callCount).to.equal(0) - log.info('Message logged with log.info, after level was set to NONE') - expect(testConsole.info.callCount).to.equal(0) - log.log('Message logged with log.log, after level was set to NONE') - expect(testConsole.log.callCount).to.equal(0) - log.debug('Message logged with log.debug, after level was set to NONE') - expect(testConsole.debug.callCount).to.equal(0) - log.trace('Message logged with log.trace, after level was set to NONE') - expect(testConsole.trace.callCount).to.equal(0) - } finally { - log.level = oldLevel - testConsole.reset() - } - }) - - it('has a method `enabled`', function(){ - expect(log).to.have.a.property('enabled') - expect(log.enabled).to.be.a('function') - }) - - it('has a method `enable`', function(){ - expect(log).to.have.a.property('enable') - expect(log.enable).to.be.a('function') - }) - - it('has a method `disable`', function(){ - expect(log).to.have.a.property('disable') - expect(log.disable).to.be.a('function') - }) -}) - - -describe('var log = require(\'ulog\')(\'my-module-name\')', function(){ - it('yields a named log function', function(){ - expect(named).to.be.a('function') - expect(named).to.have.a.property('name') - expect(named.name).to.equal('my-module-name') - }) - - it('logs a message at level DEBUG when called', function(){ - testConsole.reset() - try { - named.level = named.DEBUG - expect(named.level).to.equal(named.DEBUG) - expect(testConsole.debug.callCount).to.equal(0) - named('Message logged after level was set to DEBUG') - expect(testConsole.debug.callCount).to.equal(1) - } finally { - named.level = oldNamed - testConsole.reset() - } - }) - - it('logs at the given level when given multiple arguments and first argument is a level string', function(){ - testConsole.reset() - try { - named.level = named.DEBUG - expect(named.level).to.equal(named.DEBUG) - expect(testConsole.info.callCount).to.equal(0) - named('info', 'Message logged at level INFO after level was set to DEBUG') - expect(testConsole.info.callCount).to.equal(1) - } finally { - named.level = oldNamed - testConsole.reset() - } - }) - - it('can apply formatting to the log messages', function(){ - testConsole.reset() - format = sinon.spy() - log.formats.push(format) - try { - named.level = named.DEBUG - expect(named.level).to.equal(named.DEBUG) - expect(testConsole.debug.callCount).to.equal(0) - var message = 'Message logged at level DEBUG with formatter set' - named(message) - expect(testConsole.debug.callCount).to.equal(1) - expect(format.callCount).to.equal(1) - } finally { - named.level = oldNamed - testConsole.reset() - log.formats.pop() - } - }) - - it('can prefix log messages with the logger name', function(){ - testConsole.reset() - format = sinon.spy(function(l,m,a){ - a.splice(0,0,l.name) - }) - log.formats.push(format) - try { - named.level = named.DEBUG - expect(named.level).to.equal(named.DEBUG) - expect(testConsole.debug.callCount).to.equal(0) - var message = 'Message logged at level DEBUG with formatter set' - named(message) - expect(testConsole.debug.callCount).to.equal(1) - expect(format.callCount).to.equal(1) - } finally { - named.level = oldNamed - testConsole.reset() - log.formats.pop() - } - }) -}) - -describe('log (named)', function(){ - it('implements the Console API', function(){ - expect(named).to.have.a.property('error') - expect(named.error).to.be.a('function') - expect(named).to.have.a.property('warn') - expect(named.warn).to.be.a('function') - expect(named).to.have.a.property('info') - expect(named.info).to.be.a('function') - expect(named).to.have.a.property('log') - expect(named.log).to.be.a('function') - expect(named).to.have.a.property('trace') - expect(named.trace).to.be.a('function') - expect(named).to.have.a.property('dir') - expect(named.dir).to.be.a('function') - expect(named).to.have.a.property('time') - expect(named.time).to.be.a('function') - expect(named).to.have.a.property('timeEnd') - expect(named.timeEnd).to.be.a('function') - expect(named).to.have.a.property('assert') - expect(named.assert).to.be.a('function') - }) - - it('has a method `assert` that does not throw', function(){ - expect(function(){named.assert(false, 'assert does not throw')}).to.not.throw() - }) - - it('has an additional logging method named `debug`', function(){ - expect(named).to.have.a.property('debug') - expect(named.debug).to.be.a('function') - }) - - it('can log messages using methods `error`, `warn`, `info`, `log`, `debug` and `trace`', function(){ - testConsole.reset() - try { - named.level = named.TRACE - named.error('Message logged with log.error') - expect(testConsole.error.callCount).to.equal(1) - named.warn('Message logged with log.warn') - expect(testConsole.warn.callCount).to.equal(1) - named.info('Message logged with log.info') - expect(testConsole.info.callCount).to.equal(1) - named.log('Message logged with log.log') - expect(testConsole.log.callCount).to.equal(1) - named.debug('Message logged with log.debug') - expect(testConsole.debug.callCount).to.equal(1) - named.trace('Message logged with log.trace') - expect(testConsole.trace.callCount).to.equal(1) - } finally { - named.level = oldNamed - testConsole.reset() - } - }) - - it('has constants for the log levels `ERROR`, `WARN`, `INFO`, `LOG`, `DEBUG` and `TRACE`', function(){ - expect(named).to.have.a.property('ERROR') - expect(named.ERROR).to.equal(1) - expect(named).to.have.a.property('WARN') - expect(named.WARN).to.equal(2) - expect(named).to.have.a.property('INFO') - expect(named.INFO).to.equal(3) - expect(named).to.have.a.property('LOG') - expect(named.LOG).to.equal(4) - expect(named).to.have.a.property('DEBUG') - expect(named.DEBUG).to.equal(5) - expect(named).to.have.a.property('TRACE') - expect(named.TRACE).to.equal(6) - }) - - it('has an additional constant for the special log level `NONE`, which suppresses all logging', function(){ - expect(named).to.have.a.property('NONE') - expect(named.NONE).to.equal(0) - }) - - it('has a property `level`', function(){ - expect(named).to.have.a.property('level') - }) - - it('`level` defaults to the global log level', function(){ - expect(named.level).to.equal(log.level) - }) - - it('`level` can be assigned a different logging level', function(){ - testConsole.reset() - try { - log.level = log.INFO - named.level = log.ERROR - expect(named.level).to.equal(log.ERROR) - named.error('Message logged with named.error, after named.level was set to ERROR') - expect(testConsole.error.callCount).to.equal(1) - named.warn('Message logged with named.warn, after named.level was set to ERROR') - expect(testConsole.warn.callCount).to.equal(0) - named.info('Message logged with named.info, after named.level was set to ERROR') - expect(testConsole.info.callCount).to.equal(0) - named.log('Message logged with named.log, after named.level was set to ERROR') - expect(testConsole.log.callCount).to.equal(0) - named.debug('Message logged with named.debug, after named.level was set to ERROR') - expect(testConsole.debug.callCount).to.equal(0) - named.trace('Message logged with named.trace, after named.level was set to ERROR') - expect(testConsole.trace.callCount).to.equal(0) - log.error('Message logged with log.error, after named.level was set to ERROR') - expect(testConsole.error.callCount).to.equal(2) - log.warn('Message logged with log.warn, after named.level was set to ERROR') - expect(testConsole.warn.callCount).to.equal(1) - log.info('Message logged with log.info, after named.level was set to ERROR') - expect(testConsole.info.callCount).to.equal(1) - log.log('Message logged with log.log, after named.level was set to ERROR') - expect(testConsole.log.callCount).to.equal(0) - log.debug('Message logged with log.debug, after named.level was set to ERROR') - expect(testConsole.debug.callCount).to.equal(0) - log.trace('Message logged with log.trace, after named.level was set to ERROR') - expect(testConsole.trace.callCount).to.equal(0) - testConsole.reset() - named.level = log.WARN - expect(named.level).to.equal(log.WARN) - named.error('Message logged with named.error, after named.level was set to WARN') - expect(testConsole.error.callCount).to.equal(1) - named.warn('Message logged with named.warn, after named.level was set to WARN') - expect(testConsole.warn.callCount).to.equal(1) - named.info('Message logged with named.info, after named.level was set to WARN') - expect(testConsole.info.callCount).to.equal(0) - named.log('Message logged with named.log, after named.level was set to WARN') - expect(testConsole.log.callCount).to.equal(0) - named.debug('Message logged with named.debug, after named.level was set to WARN') - expect(testConsole.debug.callCount).to.equal(0) - named.trace('Message logged with named.trace, after named.level was set to WARN') - expect(testConsole.trace.callCount).to.equal(0) - log.error('Message logged with log.error, after named.level was set to WARN') - expect(testConsole.error.callCount).to.equal(2) - log.warn('Message logged with log.warn, after named.level was set to WARN') - expect(testConsole.warn.callCount).to.equal(2) - log.info('Message logged with log.info, after named.level was set to WARN') - expect(testConsole.info.callCount).to.equal(1) - log.log('Message logged with log.log, after named.level was set to WARN') - expect(testConsole.log.callCount).to.equal(0) - log.debug('Message logged with log.debug, after named.level was set to WARN') - expect(testConsole.debug.callCount).to.equal(0) - log.trace('Message logged with log.trace, after named.level was set to WARN') - expect(testConsole.trace.callCount).to.equal(0) - testConsole.reset() - named.level = log.INFO - expect(named.level).to.equal(log.INFO) - named.error('Message logged with named.error, after named.level was set to INFO') - expect(testConsole.error.callCount).to.equal(1) - named.warn('Message logged with named.warn, after named.level was set to INFO') - expect(testConsole.warn.callCount).to.equal(1) - named.info('Message logged with named.info, after named.level was set to INFO') - expect(testConsole.info.callCount).to.equal(1) - named.log('Message logged with named.log, after named.level was set to INFO') - expect(testConsole.log.callCount).to.equal(0) - named.debug('Message logged with named.debug, after named.level was set to INFO') - expect(testConsole.debug.callCount).to.equal(0) - named.trace('Message logged with named.trace, after named.level was set to INFO') - expect(testConsole.trace.callCount).to.equal(0) - log.error('Message logged with log.error, after named.level was set to INFO') - expect(testConsole.error.callCount).to.equal(2) - log.warn('Message logged with log.warn, after named.level was set to INFO') - expect(testConsole.warn.callCount).to.equal(2) - log.info('Message logged with log.info, after named.level was set to INFO') - expect(testConsole.info.callCount).to.equal(2) - log.log('Message logged with log.log, after named.level was set to INFO') - expect(testConsole.log.callCount).to.equal(0) - log.debug('Message logged with log.debug, after named.level was set to INFO') - expect(testConsole.debug.callCount).to.equal(0) - log.trace('Message logged with log.trace, after named.level was set to INFO') - expect(testConsole.trace.callCount).to.equal(0) - testConsole.reset() - log.level = log.DEBUG - named.level = log.INFO - expect(named.level).to.equal(log.INFO) - named.error('Message logged with named.error, after named.level was set to LOG and log.level was set to DEBUG') - expect(testConsole.error.callCount).to.equal(1) - named.warn('Message logged with named.warn, after named.level was set to LOG and log.level was set to DEBUG') - expect(testConsole.warn.callCount).to.equal(1) - named.info('Message logged with named.info, after named.level was set to LOG and log.level was set to DEBUG') - expect(testConsole.info.callCount).to.equal(1) - named.log('Message logged with named.log, after named.level was set to LOG and log.level was set to DEBUG') - expect(testConsole.log.callCount).to.equal(0) - named.debug('Message logged with named.debug, after named.level was set to LOG and log.level was set to DEBUG') - expect(testConsole.debug.callCount).to.equal(0) - named.trace('Message logged with named.trace, after named.level was set to LOG and log.level was set to DEBUG') - expect(testConsole.trace.callCount).to.equal(0) - log.error('Message logged with log.error, after named.level was set to LOG and log.level was set to DEBUG') - expect(testConsole.error.callCount).to.equal(2) - log.warn('Message logged with log.warn, after named.level was set to LOG and log.level was set to DEBUG') - expect(testConsole.warn.callCount).to.equal(2) - log.info('Message logged with log.info, after named.level was set to LOG and log.level was set to DEBUG') - expect(testConsole.info.callCount).to.equal(2) - log.log('Message logged with log.log, after named.level was set to LOG and log.level was set to DEBUG') - expect(testConsole.log.callCount).to.equal(1) - log.debug('Message logged with log.debug, after named.level was set to LOG and log.level was set to DEBUG') - expect(testConsole.debug.callCount).to.equal(1) - log.trace('Message logged with log.trace, after named.level was set to LOG and log.level was set to DEBUG') - expect(testConsole.trace.callCount).to.equal(0) - testConsole.reset() - named.level = log.DEBUG - expect(named.level).to.equal(log.DEBUG) - named.error('Message logged with named.error, after named.level was set to DEBUG') - expect(testConsole.error.callCount).to.equal(1) - named.warn('Message logged with named.warn, after named.level was set to DEBUG') - expect(testConsole.warn.callCount).to.equal(1) - named.info('Message logged with named.info, after named.level was set to DEBUG') - expect(testConsole.info.callCount).to.equal(1) - named.log('Message logged with named.log, after named.level was set to DEBUG') - expect(testConsole.log.callCount).to.equal(1) - named.debug('Message logged with named.debug, after named.level was set to DEBUG') - expect(testConsole.debug.callCount).to.equal(1) - named.trace('Message logged with named.trace, after named.level was set to DEBUG') - expect(testConsole.trace.callCount).to.equal(0) - log.error('Message logged with log.error, after named.level was set to DEBUG') - expect(testConsole.error.callCount).to.equal(2) - log.warn('Message logged with log.warn, after named.level was set to DEBUG') - expect(testConsole.warn.callCount).to.equal(2) - log.info('Message logged with log.info, after named.level was set to DEBUG') - expect(testConsole.info.callCount).to.equal(2) - log.log('Message logged with log.log, after named.level was set to DEBUG') - expect(testConsole.log.callCount).to.equal(2) - log.debug('Message logged with log.debug, after named.level was set to DEBUG') - expect(testConsole.debug.callCount).to.equal(2) - log.trace('Message logged with log.trace, after named.level was set to DEBUG') - expect(testConsole.trace.callCount).to.equal(0) - testConsole.reset() - named.level = log.TRACE - expect(named.level).to.equal(log.TRACE) - named.error('Message logged with named.error, after named.level was set to TRACE') - expect(testConsole.error.callCount).to.equal(1) - named.warn('Message logged with named.warn, after named.level was set to TRACE') - expect(testConsole.warn.callCount).to.equal(1) - named.info('Message logged with named.info, after named.level was set to TRACE') - expect(testConsole.info.callCount).to.equal(1) - named.log('Message logged with named.log, after named.level was set to TRACE') - expect(testConsole.log.callCount).to.equal(1) - named.debug('Message logged with named.debug, after named.level was set to TRACE') - expect(testConsole.debug.callCount).to.equal(1) - named.trace('Message logged with named.trace, after named.level was set to TRACE') - expect(testConsole.trace.callCount).to.equal(1) - testConsole.reset() - log.error('Message logged with log.error, after named.level was set to TRACE') - expect(testConsole.error.callCount).to.equal(1) - log.warn('Message logged with log.warn, after named.level was set to TRACE') - expect(testConsole.warn.callCount).to.equal(1) - log.info('Message logged with log.info, after named.level was set to TRACE') - expect(testConsole.info.callCount).to.equal(1) - log.log('Message logged with log.log, after named.level was set to TRACE') - expect(testConsole.log.callCount).to.equal(1) - log.debug('Message logged with log.debug, after named.level was set to TRACE') - expect(testConsole.debug.callCount).to.equal(1) - log.trace('Message logged with log.trace, after named.level was set to TRACE') - expect(testConsole.trace.callCount).to.equal(0) - testConsole.reset() - named.level = log.NONE - expect(named.level).to.equal(log.NONE) - expect(log.level).to.equal(log.DEBUG) - named.error('Message logged with named.error, after named.level was set to NONE') - expect(testConsole.error.callCount).to.equal(0) - named.warn('Message logged with named.warn, after named.level was set to NONE') - expect(testConsole.warn.callCount).to.equal(0) - named.info('Message logged with named.info, after named.level was set to NONE') - expect(testConsole.info.callCount).to.equal(0) - named.log('Message logged with named.log, after named.level was set to NONE') - expect(testConsole.log.callCount).to.equal(0) - named.debug('Message logged with named.debug, after named.level was set to NONE') - expect(testConsole.debug.callCount).to.equal(0) - named.trace('Message logged with named.trace, after named.level was set to NONE') - expect(testConsole.trace.callCount).to.equal(0) - log.error('Message logged with log.error, after named.level was set to NONE') - expect(testConsole.error.callCount).to.equal(1) - log.warn('Message logged with log.warn, after named.level was set to NONE') - expect(testConsole.warn.callCount).to.equal(1) - log.info('Message logged with log.info, after named.level was set to NONE') - expect(testConsole.info.callCount).to.equal(1) - log.log('Message logged with log.log, after named.level was set to NONE') - expect(testConsole.log.callCount).to.equal(1) - log.debug('Message logged with log.debug, after named.level was set to NONE') - expect(testConsole.debug.callCount).to.equal(1) - log.trace('Message logged with log.trace, after named.level was set to NONE') - expect(testConsole.trace.callCount).to.equal(0) - testConsole.reset() - named.level = undefined - expect(named.level).to.equal(log.DEBUG) // inherit parent level - named.error('Message logged with named.error, after named.level was reset') - expect(testConsole.error.callCount).to.equal(1) - named.warn('Message logged with named.warn, after named.level was reset') - expect(testConsole.warn.callCount).to.equal(1) - named.info('Message logged with named.info, after named.level was reset') - expect(testConsole.info.callCount).to.equal(1) - named.log('Message logged with named.log, after named.level was set reset') - expect(testConsole.log.callCount).to.equal(1) - named.debug('Message logged with named.debug, after named.level was reset') - expect(testConsole.debug.callCount).to.equal(1) - named.trace('Message logged with named.trace, after named.level was reset') - expect(testConsole.trace.callCount).to.equal(0) - log.error('Message logged with log.error, after named.level was reset') - expect(testConsole.error.callCount).to.equal(2) - log.warn('Message logged with log.warn, after named.level was reset') - expect(testConsole.warn.callCount).to.equal(2) - log.info('Message logged with log.info, after named.level was reset') - expect(testConsole.info.callCount).to.equal(2) - log.log('Message logged with log.log, after named.level was reset') - expect(testConsole.log.callCount).to.equal(2) - log.debug('Message logged with log.debug, after named.level was reset') - expect(testConsole.debug.callCount).to.equal(2) - log.trace('Message logged with log.trace, after named.level was reset') - expect(testConsole.trace.callCount).to.equal(0) - } finally { - log.level = oldLevel - named.level = oldNamed - testConsole.reset() - } - }) - - it('can be `enabled` by its name', function(){ - testConsole.reset() - try { - log.level = log.INFO - named.level = log.INFO - expect(log.enabled('my-module-name')).to.not.equal(true) - log.log('Message logged with log.log before named module is enabled') - expect(testConsole.log.callCount).to.equal(0) - named.log('Message logged with named.log before named module is enabled') - expect(testConsole.log.callCount).to.equal(0) - log.enable('my-module-name') - log.log('Message logged with log.log after named module is enabled') - expect(testConsole.log.callCount).to.equal(0) - named.log('Message logged with named.log after named module is enabled') - expect(testConsole.log.callCount).to.equal(1) - } finally { - log.level = oldLevel - named.level = oldNamed - log.disable('my-module-name') - testConsole.reset() - } - }) -}) diff --git a/ulog.umd.js b/ulog.umd.js deleted file mode 100644 index 5e6ac39..0000000 --- a/ulog.umd.js +++ /dev/null @@ -1,112 +0,0 @@ -(function(u,m,d){ - typeof define == 'function' && define.amd ? define(m,[],d) : (u[m] = d()) -})(this, 'ulog', function(){'use strict' -// ulog - microscopically small universal logging library -// © 2017 by Stijn de Witt, some rights reserved -// License: CC-BY-4.0 - -function log(n){ - return !n ? extend(log) : mods[n] || (mods[n] = extend(create(n), log)) -} - -log.formats = [] -log.extends = [] - -log.enable = function(s) { - var i, split = (s || '').split(/[\s,]+/); - for (i=0; i 1 && names[args[0]] ? args.shift() : 'debug' - for (var i=0; i= 0 && lvl <= 6) l = lvl - } - patch(o) - if (!p) {for (var mod in mods) {patch(mods[mod])}} - } - }) - patch(o) - for (var i=0; i= 0 && lvl <= 6) {level = lvl}\r\n\t\t\t}\r\n\t\t\tpatch(o, parent)\r\n\t\t\tif (!parent) {for (mod in mods) {patch(mods[mod], o)}}\r\n\t\t}\r\n\t})\r\n\tpatch(o, parent)\r\n\to.dir = bnd('dir') || nop\r\n\to.time = bnd('time') || nop\r\n\to.timeEnd = bnd('timeEnd') || nop\r\n\to.assert = function(){\r\n\t\tvar a=[].concat.apply([], arguments), ok=a.shift()\r\n\t\tif (!ok) {o.error.apply(o, a)}\r\n\t}\r\n\treturn o\r\n}\r\n\r\nfunction patch(o, parent) {\r\n\tvar lvl = Math.max(o.name && log.enabled(o.name) && o.DEBUG || o.level, o.level)\r\n\tfor (var i=0,name; name=names[i]; i++) {\r\n\t\to[name] = lvl <= i\r\n\t\t\t? nop\r\n\t\t\t: (\r\n\t\t\t\tbnd(name) ||\r\n\t\t\t\t(typeof print == 'function' && print) ||\r\n\t\t\t\tfunction(){\r\n\t\t\t\t\tif (log.con()) {\r\n\t\t\t\t\t\tpatch(o)\r\n\t\t\t\t\t\to[name].apply(o, arguments)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t)\r\n\t}\r\n}\r\n\r\nfunction bnd(n,c){return (c = log.con()) && (c[n]||c.log).bind(c)}\r\nfunction nop(){}\r\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./ulog.js\n ** module id = 1\n ** module chunks = 0\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index fc3f983..9dda7df 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,20 +1,15 @@ -var path = require('path'); -var webpack = require('webpack'); +var path = require('path') +var dir = path.resolve(__dirname) module.exports = { - // The base directory (absolute path!) for resolving the entry option. - // If output.pathinfo is set, the included pathinfo is shortened to this directory. - context: path.resolve('.'), - - module: { - noParse: /\.min\.js/, - }, - - devtool: 'inline-source-map', - - devServer: { - stats: { - chunks: false, - } - } -}; + node: false, + context: dir, + entry: { + ulog: './main.bundle.js', + full: './full.bundle.js', + }, + output: { + path: dir, + filename: '[name].min.js', + }, +}