├── .editorconfig ├── .gitignore ├── .npmignore ├── .travis.yml ├── Gruntfile.coffee ├── LICENSE ├── README.md ├── _src ├── index.coffee ├── lib │ ├── systemhealth.coffee │ └── utils.coffee └── test │ ├── checks.coffee │ └── main.coffee ├── appveyor.yml ├── coffeelint.json ├── dockertests ├── Dockerfile.10 ├── Dockerfile.12 ├── Dockerfile.14 ├── Dockerfile.current ├── Dockerfile.lts ├── run.sh └── test.sh ├── index.js ├── package-lock.json └── package.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | 8 | [*] 9 | 10 | # Change these settings to your own preference 11 | indent_style = tab 12 | end_of_line = lf 13 | charset = utf-8 14 | trim_trailing_whitespace = true 15 | insert_final_newline = true 16 | 17 | [*.coffee] 18 | indent_style = tab 19 | trim_trailing_whitespace = false 20 | insert_final_newline = false 21 | 22 | [*.md] 23 | trim_trailing_whitespace = false 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.profile 2 | *.lock 3 | *.conflict 4 | *.DS_Store 5 | *.zip 6 | *.rdb 7 | *.log 8 | 9 | .project 10 | .settings 11 | .idea 12 | 13 | *.sublime* 14 | config.json 15 | config*.json 16 | deploy.json 17 | /node_modules 18 | *.js 19 | /lib 20 | /_docs 21 | /test 22 | /coverage 23 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | *.profile 2 | *.lock 3 | *.conflict 4 | *.DS_Store 5 | *.zip 6 | *.rdb 7 | *.log 8 | 9 | .project 10 | .settings 11 | .idea 12 | 13 | *.sublime* 14 | config.json 15 | config*.json 16 | deploy.json 17 | /node_modules 18 | 19 | /_src 20 | /_docs 21 | /dockertests 22 | /coverage 23 | /test 24 | coffeelint.json 25 | *.yml 26 | .editorconfig 27 | .travis.yml 28 | Gruntfile.* 29 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | os: 2 | - linux 3 | - osx 4 | sudo: false 5 | addons: 6 | apt: 7 | sources: 8 | - ubuntu-toolchain-r-test 9 | packages: 10 | - g++-4.9 11 | env: 12 | - CXX=g++-4.9 13 | language: node_js 14 | node_js: 15 | - 10 16 | - 12 17 | - 14 18 | - node 19 | - lts/* 20 | after_success: 21 | - ./node_modules/.bin/istanbul report text-summary lcov 22 | - cat ./coverage/lcov.info | ./node_modules/.bin/coveralls 23 | -------------------------------------------------------------------------------- /Gruntfile.coffee: -------------------------------------------------------------------------------- 1 | module.exports = (grunt) -> 2 | # Project configuration. 3 | grunt.initConfig 4 | pkg: grunt.file.readJSON('package.json') 5 | watch: 6 | module: 7 | files: ["_src/**/*.coffee"] 8 | tasks: [ "coffee:base" ] 9 | 10 | module_test: 11 | files: ["_src/**/*.coffee"] 12 | tasks: [ "coffee:base", "test" ] 13 | 14 | coffee: 15 | base: 16 | expand: true 17 | cwd: '_src', 18 | src: ["**/*.coffee"] 19 | dest: '' 20 | ext: '.js' 21 | 22 | clean: 23 | base: 24 | src: [ "lib", "test" ] 25 | 26 | includereplace: 27 | pckg: 28 | options: 29 | globals: 30 | version: "<%= pkg.version %>" 31 | 32 | prefix: "@@" 33 | suffix: '' 34 | 35 | files: 36 | "index.js": ["index.js"] 37 | 38 | 39 | mochacli: 40 | options: 41 | require: [ "should" ] 42 | reporter: "spec" 43 | bail: false 44 | timeout: 3000 45 | slow: 3 46 | 47 | main: 48 | src: [ "test/main.js" ] 49 | options: 50 | env: 51 | severity_systemhealth: "error" 52 | 53 | # Load npm modules 54 | grunt.loadNpmTasks "grunt-contrib-watch" 55 | grunt.loadNpmTasks "grunt-contrib-coffee" 56 | grunt.loadNpmTasks "grunt-contrib-clean" 57 | grunt.loadNpmTasks "grunt-mocha-cli" 58 | grunt.loadNpmTasks "grunt-include-replace" 59 | 60 | # ALIAS TASKS 61 | grunt.registerTask "default", "build" 62 | grunt.registerTask "clear", [ "clean:base" ] 63 | grunt.registerTask "test", [ "mochacli:main" ] 64 | grunt.registerTask "watcher-test", [ "watch:module_test" ] 65 | 66 | # ALIAS SHORTS 67 | grunt.registerTask "b", "build" 68 | grunt.registerTask "w", "watcher" 69 | grunt.registerTask "wt", "watcher-test" 70 | grunt.registerTask "t", "test" 71 | 72 | # build the project 73 | grunt.registerTask "build", [ "clear", "coffee:base", "includereplace" ] 74 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 M. Peter 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Systemhealth 2 | 3 | [![Build Status](https://secure.travis-ci.org/mpneuried/systemhealth.png?branch=master)](http://travis-ci.org/mpneuried/systemhealth) 4 | [![Windows Tests](https://img.shields.io/appveyor/ci/mpneuried/systemhealth.svg?label=WindowsTest)](https://ci.appveyor.com/project/mpneuried/systemhealth) 5 | [![Coveralls Coverage](https://img.shields.io/coveralls/mpneuried/systemhealth.svg)](https://coveralls.io/github/mpneuried/systemhealth) 6 | 7 | [![Deps Status](https://david-dm.org/mpneuried/systemhealth.png)](https://david-dm.org/mpneuried/systemhealth) 8 | [![npm version](https://badge.fury.io/js/systemhealth.png)](http://badge.fury.io/js/systemhealth) 9 | [![npm downloads](https://img.shields.io/npm/dt/systemhealth.svg?maxAge=2592000)](https://nodei.co/npm/systemhealth/) 10 | 11 | Node module to run simple custom checks for your machine or it's connections. 12 | 13 | [![NPM](https://nodei.co/npm/systemhealth.png?downloads=true&stars=true)](https://nodei.co/npm/systemhealth) 14 | 15 | ## Install 16 | 17 | ```sh 18 | npm install systemhealth 19 | ``` 20 | 21 | ## Initialize 22 | 23 | ```js 24 | var Systemhealth = require("systemhealth"); 25 | var health = new Systemhealth({}, ["foo", "bar"], require("./mychecks")); 26 | ``` 27 | 28 | **Options** 29 | 30 | - **interval** : _( `Number` optional: default = `60` )_ Check interval in seconds 31 | - **intervalVariance** : _( `Number` optional: default = `0` )_ If you are using the same configuration for multiple servers you can define a variance that will add random seconds to the interval until this value. 32 | - **failCount** : _( `Number` optional: default = `2` )_ Count of failed checks per check until "die". E.g. Mark server as dead until 2 failed checks of the sql connection. 33 | - **successCount** : _( `Number` optional: default = `1` )_ Count of successful checks until the server resurrect. 34 | - **failTimeout** : _( `Number` optional: default = `2000` )_ Internal check timeout to wait for answers of check tasks 35 | 36 | ## Methods 37 | 38 | #### `.start()` 39 | 40 | Start checking the health of the server and connections 41 | 42 | **Return** 43 | 44 | _( Systemhealth )_: The instance itself for chaining 45 | 46 | #### `.stop()` 47 | 48 | Stop checking interval 49 | 50 | **Return** 51 | 52 | _( Systemhealth )_: The instance itself for chaining 53 | 54 | #### `.die()` 55 | 56 | Mark the server as dead and stop the heartbeat. 57 | This is called until one check failed for `option.failCount` times. 58 | 59 | **Return** 60 | 61 | _( Boolean )_: Successful died. If the health is already `dead` it'll return `false` 62 | 63 | #### `.resurrect()` 64 | 65 | Resurrect the server and restart the heartbeat. 66 | This is called until all checks are successful for `option.successCount` times. 67 | 68 | **Return** 69 | 70 | _( Boolean )_: Successful died. If the health is already `dead` it'll return `false` 71 | 72 | #### `.getState()` 73 | 74 | return the last check state. 75 | 76 | **Return** 77 | 78 | _( Object )_: An object with the state of all checks. 79 | 80 | Format: `{ "my-check-foo-name": [ {state}, {data} ] }` 81 | _{state}_: Positive numbers represent the successful counts. Negative numbers represent the fail count. 82 | _{data}_: Optional data or error infos 83 | 84 | ## Events 85 | 86 | #### `started` 87 | 88 | Emitted on a successful start after the frist check. 89 | 90 | #### `stopped` 91 | 92 | Emitted on a check stop. 93 | 94 | #### `died` 95 | 96 | Emitted if the failCount has exceeded. So the server/machine is defined as dead. 97 | 98 | #### `resurrected` 99 | 100 | Emitted if the successCount has exceeded after the system was not dead. So the server/machine is defined as alive. 101 | 102 | #### `checked` 103 | 104 | Emitted after a check 105 | 106 | **Arguments** 107 | 108 | - **state** : _( `Object` )_ See method `.getState()` for teh description of the return 109 | 110 | #### `failed` 111 | 112 | A immediate event when a check fails. 113 | 114 | **Arguments** 115 | 116 | - **check** : _( `String` )_ The key of the failed check function 117 | - **data** : _( `Any` )_ Optional data or error infos 118 | 119 | ## Example 120 | 121 | ```js 122 | var CHECKS = { 123 | "memcached": function(){ 124 | var Memcached = require( 'memcached' ); 125 | var _client = new Memcached(); 126 | return function( cb ){ 127 | _client.version( function( err, version ){ 128 | if( err ){ 129 | cb( null, false, err ); // do not return a regular error. Just return false as second arg and optional info like the error object 130 | } 131 | cb( null, true, { _v: version } ); // just return true and optional information, that will be logged to redis metics 132 | }); 133 | } 134 | }, 135 | "sql": function(){ 136 | var _client = require( './my-sql-client42' ); 137 | return function( cb ){ 138 | _client.query( "SELECT 5", function( err, return ){ 139 | if( err ){ 140 | cb( null, false, err ); // do not return a regular error. Just return false as second arg and optional info like the error object 141 | } 142 | cb( null, true ); 143 | }); 144 | } 145 | } 146 | } 147 | var Systemhealth = require( "systemhealth" ); 148 | var health = new Systemhealth( { identifier: "my-server-name" }, [ "memcached", "sql" ], CHECKS ); 149 | ``` 150 | 151 | ## Properties 152 | 153 | #### `alive` 154 | 155 | If the service is alive this property will be `true` 156 | 157 | **Return** 158 | 159 | _( Boolean )_: If it's alive 160 | 161 | ## Testing 162 | 163 | The tests are based on the [mocha.js](https://mochajs.org/) framework with [should.js](https://shouldjs.github.io/) as assertaion lib. 164 | To start the test just call 165 | 166 | ``` 167 | npm test 168 | ``` 169 | 170 | or 171 | 172 | ``` 173 | grunt test 174 | ``` 175 | 176 | If you want to be more precice use the mocha cli 177 | 178 | ``` 179 | mocha -R nyan -t 1337 test/main.js 180 | ``` 181 | 182 | ### Docker-Tests 183 | 184 | If you want to test your module against multiple node versions you can use the docker tests. 185 | 186 | **Preparation** 187 | 188 | ```sh 189 | # make sure you installed all dependencies 190 | npm install 191 | # build the files 192 | grunt build 193 | ``` 194 | 195 | **Run** 196 | 197 | To run the tests through the defined versions run the following command: 198 | 199 | ``` 200 | dockertests/run.sh 201 | ``` 202 | 203 | ## Release History 204 | 205 | | Version | Date | Description | 206 | | :-----: | :--------: | :------------------------------------------------------------------------------------------------------------------------------------- | 207 | | 2.0.0 | 2021-07-15 | removed redis-heartbeat module. So the redis representation will no longer be available; updated docker tests to current node versions | 208 | | 1.0.0 | 2018-05-07 | Updated deps., Updated redis-heartbeat without metrics to run on node 10 and coffee 2 | 209 | | 0.1.1 | 2017-08-11 | updated deps | 210 | | 0.1.0 | 2016-10-12 | Optimized tests; Updated dependencies; Optimized Dev env. | 211 | | 0.0.5 | 2016-06-24 | Added `failed` event to get immediate infos on an failed check; | 212 | | 0.0.4 | 2016-05-19 | Updated dependencies; Updated dev env.; Removed generated code docs; | 213 | | 0.0.3 | 2016-01-07 | Updated dependencies; Optimized Readme | 214 | | 0.0.2 | 2015-03-11 | Small bugfix within redis connection listening | 215 | | 0.0.1 | 2014-11-20 | Initial commit | 216 | 217 | [![NPM](https://nodei.co/npm-dl/systemhealth.png?months=6)](https://nodei.co/npm/systemhealth/) 218 | 219 | ## Other projects 220 | 221 | | Name | Description | 222 | | :-------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | 223 | | [**redis-heartbeat**](https://github.com/mpneuried/redis-heartbeat) | Pulse a heartbeat to redis. This can be used to detach or attach servers to nginx or similar problems. | 224 | | [**node-cache**](https://github.com/tcs-de/nodecache) | Simple and fast NodeJS internal caching. Node internal in memory cache like memcached. | 225 | | [**rsmq**](https://github.com/smrchy/rsmq) | A really simple message queue based on Redis | 226 | | [**nsq-logger**](https://github.com/mpneuried/nsq-logger) | Nsq service to read messages from all topics listed within a list of nsqlookupd services. | 227 | | [**nsq-topics**](https://github.com/mpneuried/nsq-topics) | Nsq helper to poll a nsqlookupd service for all it's topics and mirror it locally. | 228 | | [**nsq-nodes**](https://github.com/mpneuried/nsq-nodes) | Nsq helper to poll a nsqlookupd service for all it's nodes and mirror it locally. | 229 | | [**nsq-watch**](https://github.com/mpneuried/nsq-watch) | Watch one or many topics for unprocessed messages. | 230 | | [**redis-sessions**](https://github.com/smrchy/redis-sessions) | An advanced session store for NodeJS and Redis | 231 | | [**connect-redis-sessions**](https://github.com/mpneuried/connect-redis-sessions) | A connect or express middleware to simply use the [redis sessions](https://github.com/smrchy/redis-sessions). With [redis sessions](https://github.com/smrchy/redis-sessions) you can handle multiple sessions per user_id. | 232 | | [**task-queue-worker**](https://github.com/smrchy/task-queue-worker) | A powerful tool for background processing of tasks that are run by making standard http requests. | 233 | | [**soyer**](https://github.com/mpneuried/soyer) | Soyer is small lib for serverside use of Google Closure Templates with node.js. | 234 | | [**grunt-soy-compile**](https://github.com/mpneuried/grunt-soy-compile) | Compile Goggle Closure Templates ( SOY ) templates inclding the handling of XLIFF language files. | 235 | | [**backlunr**](https://github.com/mpneuried/backlunr) | A solution to bring Backbone Collections together with the browser fulltext search engine Lunr.js | 236 | 237 | ## The MIT License (MIT) 238 | 239 | Copyright © 2021 Mathias Peter, http://www.tcs.de 240 | 241 | 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: 242 | 243 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 244 | 245 | 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. 246 | -------------------------------------------------------------------------------- /_src/index.coffee: -------------------------------------------------------------------------------- 1 | exports.version = '@@version' 2 | 3 | module.exports = require './lib/systemhealth' 4 | -------------------------------------------------------------------------------- /_src/lib/systemhealth.coffee: -------------------------------------------------------------------------------- 1 | # # systemhealth 2 | # ### extends [NPM:MPBasic](https://cdn.rawgit.com/mpneuried/mpbaisc/master/_docs/index.coffee.html) 3 | # 4 | # ### Exports: *Class* 5 | # 6 | # Node module to run simple custom checks for your machine or it's connections. It will use redis-heartbeat to send the current state to redis. 7 | # 8 | 9 | # **node modules** 10 | os = require( "os" ) 11 | domain = require( "domain" ) 12 | 13 | # **npm modules** 14 | _isArray = require( "lodash/isArray" ) 15 | async = require( "async" ) 16 | 17 | # **internal modules** 18 | # The [Utils](./utils.coffee.html) 19 | utils = require("./utils") 20 | 21 | class SystemHealth extends require( "mpbasic" )() 22 | 23 | # ## defaults 24 | defaults: => 25 | @extend true, super( arguments... ), 26 | 27 | # **interval** *Number* Check interval in seconds 28 | interval: 60 29 | # **interval** *Number* If you are using the same configuration for multiple servers you can define a variance that will add random seconds to the interval until this value. 30 | intervalVariance: 0 31 | # **failCount** *Number* Count of failed checks per check until "die". E.g. Mark server as dead until 2 failed checks of the sql connection. 32 | failCount: 2 33 | # **successCount** *Number* Count of successful checks until the server resurrect. 34 | successCount: 1 35 | # **failTimeout** *Number* Internal check timeout to wait for answers of check tasks 36 | failTimeout: 2000 37 | 38 | ### 39 | ## constructor 40 | 41 | @param { Object } options See defaults 42 | @param { String[] } checks Array of checks to perform on every interval 43 | @param { Function{} } CHECKS Object of checks methods to perform. Every value should be a init function returning the check function. 44 | 45 | ### 46 | constructor: ( options, checks, @CHECKS )-> 47 | super( options ) 48 | 49 | # get the checks for this servertype and check the content 50 | if not checks? or not _isArray( checks ) 51 | @_handleError( true, "EEMPTYCHECKS" ) 52 | return 53 | 54 | # init the checks 55 | @_init( checks ) 56 | 57 | return 58 | 59 | ### 60 | ## _init 61 | 62 | `systemhealth._init( checks )` 63 | 64 | initialize the checks and define the internal variables 65 | 66 | @param { String[] } checks Array of checks to perform on every interval 67 | 68 | @return { Systemhealth } The instance itself for chaining 69 | 70 | @api private 71 | ### 72 | _init: ( checks )=> 73 | @alive = true 74 | @failed = {} 75 | @succeeded = {} 76 | @checkMetrics ={} 77 | 78 | # create the correct interval time 79 | if @config.intervalVariance >= 0 80 | @interval = ( @config.interval + utils.randRange( 0, @config.intervalVariance ) ) * 1000 81 | else 82 | @interval = @config.interval 83 | 84 | @info "health check interval: #{@interval/1000}s" 85 | @checks = {} 86 | for _name in checks 87 | if @CHECKS[ _name ]? 88 | @failed[ _name ] = 0 89 | @succeeded[ _name ] = 0 90 | @checks[ _name ] = @_checkTimeout(_name, @CHECKS[ _name ].apply( @ ) ) 91 | else 92 | @warning "unknown check `#{_name}`" 93 | return @ 94 | 95 | ### 96 | ## start 97 | 98 | `systemhealth.start()` 99 | 100 | Start checking the health of the server and connections 101 | 102 | @return { Systemhealth } The instance itself for chaining 103 | 104 | @api public 105 | ### 106 | start: => 107 | @debug "start" 108 | @_check() 109 | @once "checked", => 110 | @debug "start HB" 111 | @emit "started" 112 | return 113 | return @ 114 | 115 | ### 116 | ## stop 117 | 118 | `systemhealth.stop()` 119 | 120 | Stop checking interval 121 | 122 | @return { Systemhealth } The instance itself for chaining 123 | 124 | @api public 125 | ### 126 | stop: => 127 | @debug "stopped" 128 | clearTimeout( @timeout ) if @timeout 129 | @emit "stopped" 130 | return @ 131 | 132 | ### 133 | ## die 134 | 135 | `systemhealth.die()` 136 | 137 | Mark the server as dead and stop the heartbeat. 138 | This is called until one check failed for `option.failCount` times. 139 | 140 | @return { Boolean } Successful died. If the health is already `dead` it'll return `false` 141 | 142 | @api public 143 | ### 144 | die: => 145 | return false if not @alive 146 | @alive = false 147 | @warning "die" 148 | @emit "died" 149 | return true 150 | 151 | ### 152 | ## resurrect 153 | 154 | `systemhealth.resurrect()` 155 | 156 | Resurrect the server and restart the heartbeat. 157 | This is called until all checks are successful for `option.successCount` times. 158 | 159 | @return { Boolean } Successful resurrection. If the health is already `alive` it'll return `false` 160 | 161 | @api public 162 | ### 163 | resurrect: => 164 | return false if @alive 165 | @alive = true 166 | @warning "resurrect" 167 | @emit "resurrected" 168 | return true 169 | 170 | ### 171 | ## getState 172 | 173 | `systemhealth.getState()` 174 | 175 | return the last check state. 176 | 177 | @return { Object } An object with the state of all checks. 178 | Format: `{ "my-check-foo-name": [ {state}, {data} ] }` 179 | *{state}*: Positive numbers represent the successful counts. Negative numbers represent the fail count. 180 | *{data}*: Optional data or error infos 181 | 182 | @api public 183 | ### 184 | getState: => 185 | @checkMetrics or null 186 | 187 | ### 188 | ## _recheck 189 | 190 | `systemhealth._recheck()` 191 | 192 | Call a check after a `options.interval` seconds 193 | 194 | @return { Systemhealth } The instance itself for chaining 195 | 196 | @api private 197 | ### 198 | _recheck: => 199 | clearTimeout( @timeout ) if @timeout 200 | @timeout = setTimeout( @_check, @interval ) 201 | return @ 202 | 203 | ### 204 | ## _checkTimeout 205 | 206 | `systemhealth._checkTimeout( name, fn )` 207 | 208 | Wrap the check function to add a internal timeout 209 | 210 | @param { String } name The check name 211 | @param { Function } fn Check function 212 | 213 | @return { Function } The wrapped check function 214 | 215 | @api private 216 | ### 217 | _checkTimeout: ( name, fn )=> 218 | return ( cb )=> 219 | _timeout = => 220 | cb( null, false, @_handleError( "ECHECKTIMEOUT", "ECHECKTIMEOUT", name: name ) ) 221 | return 222 | fn( ( args... ) => 223 | clearTimeout( _tmt ) 224 | cb.apply( @, args ) 225 | return 226 | ) 227 | _tmt = setTimeout( _timeout, @config.failTimeout ) 228 | return 229 | 230 | ### 231 | ## _check 232 | 233 | `systemhealth._check()` 234 | 235 | Main method to run all active check methods 236 | 237 | @api private 238 | ### 239 | _check: => 240 | # create the next `_check()` call immediately 241 | @_recheck() 242 | 243 | # create a domain to catch the async errors on internal timeout 244 | d = domain.create() 245 | d.on "error", ( _err )=> 246 | @warning "async-error", _err 247 | return 248 | 249 | # run all check inside a domain 250 | d.run => 251 | async.parallel @checks, ( err, results )=> 252 | if err 253 | @fatal "A check function should never return a error", err 254 | return 255 | 256 | @debug "checked", results 257 | 258 | # define flags 259 | _fail = false 260 | _kill = false 261 | _resurrect = false 262 | 263 | # check every answer 264 | for _name, _res of results 265 | # dispatch result 266 | if _isArray( _res ) 267 | [ success, data ] = _res 268 | else 269 | success = _res 270 | data = null 271 | 272 | # set the fails 273 | if success 274 | @failed[ _name ] = 0 275 | @succeeded[ _name ]++ 276 | else 277 | _fail = true 278 | @emit "failed", _name, data 279 | @warning "failed-#{_name}", data 280 | @failed[ _name ]++ 281 | @succeeded[ _name ] = 0 282 | 283 | # write the metric data. 284 | # Idx=0: Positive numbers represent the successful counts. Negative numbers represent the fail count. 285 | # Idx=1: Optional data or error infos 286 | @checkMetrics[ _name ] = [ if _fail then ( @failed[ _name ] * -1 ) else @succeeded[ _name ] ] 287 | if data? 288 | @checkMetrics[ _name ].push data 289 | 290 | # check for killing or resurrecting based on the configuration 291 | if @failed[ _name ] >= @config.failCount 292 | _kill = true 293 | else if @succeeded[ _name ] >= @config.successCount 294 | _resurrect = true 295 | 296 | @debug "state", @succeeded, @failed 297 | 298 | # stop heartbeat if the conditions of one check failed 299 | if @alive and _kill 300 | @die() 301 | return 302 | 303 | # restart the heartbeat if the conditions to resurrect are true 304 | if not @alive and not _kill and _resurrect 305 | @resurrect() 306 | 307 | @emit "checked", @checkMetrics 308 | return 309 | return 310 | return 311 | 312 | ### 313 | ## ERRORS 314 | 315 | `systemhealth.ERRORS()` 316 | 317 | Error detail mappings 318 | 319 | @return { Object } Return A Object of error details. Format: `"ERRORCODE":[ statusCode, "Error detail" ]` 320 | 321 | @api private 322 | ### 323 | ERRORS: => 324 | @extend super( arguments... ), 325 | "EINVALIDCLINET": [ 500, "Please use a redis client instance for the `client` option." ] 326 | "EEMPTYIDENT": [ 500, "No server identifier defined." ] 327 | "EEMPTYCHECKS": [ 500, "For the type `#{@type}` no or an empty checklist has been found." ] 328 | "ECHECKTIMEOUT": [ 500, "The check `{{name}}` has been timed out." ] 329 | 330 | #export this class 331 | module.exports = SystemHealth 332 | -------------------------------------------------------------------------------- /_src/lib/utils.coffee: -------------------------------------------------------------------------------- 1 | # # Utils 2 | # 3 | # ### Exports: *Object* 4 | # 5 | # A collection of helper functions 6 | 7 | # export the functions 8 | module.exports = 9 | ### 10 | ## randomString 11 | 12 | `utils.randomString( string_length, speciallevel )` 13 | 14 | Generate a random string 15 | 16 | @param { Number } string_length string length to generate 17 | @param { Number } speciallevel Level of complexity. 18 | * 0 = only letters upper and lowercase, 52 possible chars; 19 | * 1 = 0 + Numbers, 62 possible chars; 20 | * 2 = 1 + "_-@:.", 67 possible chars; 21 | * 3 = 2 + may speacial chars, 135 possible chars; 22 | 23 | @return { String } The gerated string 24 | ### 25 | randomString: ( string_length = 5, specialLevel = 0 ) -> 26 | chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" 27 | chars += "0123456789" if specialLevel >= 1 28 | chars += "_-@:." if specialLevel >= 2 29 | chars += "!\"§$%&/()=?*'_:;,.-#+¬”#£fi^\\˜·¯˙˚«∑€®†Ω¨⁄øπ•‘æœ@∆ºª©ƒ∂‚å–…∞µ~∫√ç≈¥" if specialLevel >= 3 30 | 31 | randomstring = "" 32 | i = 0 33 | 34 | while i < string_length 35 | rnum = Math.floor(Math.random() * chars.length) 36 | randomstring += chars.substring(rnum, rnum + 1) 37 | i++ 38 | randomstring 39 | 40 | ### 41 | ## randRange 42 | 43 | `utils.randRange( lowVal, highVal )` 44 | 45 | Create a random number bewtween two values 46 | 47 | @param { Number } lowVal Min number 48 | @param { Number } highVal Max number 49 | 50 | @return { Number } A random number 51 | ### 52 | randRange: ( lowVal, highVal )-> 53 | return Math.floor( Math.random()*(highVal-lowVal+1 ))+lowVal 54 | -------------------------------------------------------------------------------- /_src/test/checks.coffee: -------------------------------------------------------------------------------- 1 | # create a simulated client 2 | _createClient = ( timeout=300, success=true )-> 3 | _ret = 4 | ping: ( cb )-> 5 | setTimeout( -> 6 | if success 7 | cb( null, "pong" ) 8 | else 9 | _err = new Error() 10 | _err.name = "simulated-error-ping" 11 | cb( _err ) 12 | return 13 | , timeout ) 14 | return 15 | query: ( statement, cb )-> 16 | setTimeout( -> 17 | if success 18 | cb( null, [ { id: 42, name: "Bar", statement: statement } ] ) 19 | else 20 | _err = new Error() 21 | _err.name = "simulated-error-query" 22 | cb( _err ) 23 | return 24 | , timeout ) 25 | return 26 | return _ret 27 | 28 | module.exports = 29 | "checkFoo": -> 30 | # simulated checks 31 | _client = _createClient() 32 | 33 | return ( cb )-> 34 | _client.ping ( err, pong )-> 35 | if err 36 | cb( null, false, err ) 37 | return 38 | cb( null, true ) 39 | return 40 | return 41 | 42 | "checkBar": -> 43 | _client = _createClient( 3000 ) 44 | return ( cb )-> 45 | _client.ping ( err, pong )-> 46 | if err 47 | cb( null, false, err ) 48 | return 49 | cb( null, true ) 50 | return 51 | return 52 | 53 | "check42": -> 54 | _client = _createClient() 55 | return ( cb )-> 56 | _client.query "SELECT 5", ( err, results )-> 57 | if err 58 | cb( null, false, err ) 59 | return 60 | if not results?.length 61 | cb( null, false ) 62 | return 63 | cb( null, true ) 64 | return 65 | return 66 | 67 | "checkError": -> 68 | _client = _createClient( 1000, false ) 69 | return ( cb )-> 70 | _client.ping ( err, pong )-> 71 | if err 72 | cb( null, false, err ) 73 | return 74 | cb( null, true ) 75 | return 76 | return 77 | -------------------------------------------------------------------------------- /_src/test/main.coffee: -------------------------------------------------------------------------------- 1 | should = require('should') 2 | 3 | Systemhealth = require( "../." ) 4 | 5 | CHECKS = require( "./checks" ) 6 | 7 | Health = null 8 | HealthErr = null 9 | 10 | describe "----- Systemhealth TESTS -----", -> 11 | 12 | describe 'Main Tests', -> 13 | 14 | # Implement tests cases here 15 | it "general", ( done )-> 16 | Health = new Systemhealth( { interval: 3, identifier: "test", logging: { severity: "error" } }, [ "checkFoo", "check42" ], CHECKS ) 17 | this.timeout( 10000 ) 18 | 19 | Health.on "checked", -> 20 | Health.getState().should.have.properties( "checkFoo", "check42" ) 21 | 22 | Health.stop() 23 | done() 24 | return 25 | 26 | Health.start() 27 | return 28 | 29 | # Implement tests cases here 30 | it "error on start", ( done )-> 31 | 32 | HealthErr = new Systemhealth( { interval: 3, identifier: "test", logging: { severity: "error" } }, [ "checkFoo", "checkError" ], CHECKS ) 33 | this.timeout( 10000 ) 34 | 35 | HealthErr.on "checked", -> 36 | state = HealthErr.getState() 37 | state.should.have.properties( "checkFoo", "checkError" ) 38 | should.exist( state[ "checkError" ][0] ) 39 | state[ "checkError" ][0].should.below(0) 40 | return 41 | 42 | HealthErr.on "died", -> 43 | HealthErr.stop() 44 | done() 45 | return 46 | 47 | HealthErr.start() 48 | return 49 | 50 | return 51 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | # http://www.appveyor.com/docs/appveyor-yml 2 | 3 | # Test against these versions of Node.js. 4 | environment: 5 | matrix: 6 | - nodejs_version: "10" 7 | - nodejs_version: "12" 8 | - nodejs_version: "14" 9 | - nodejs_version: "LTS" 10 | - nodejs_version: "Stable" 11 | 12 | pull_requests: 13 | do_not_increment_build_number: true 14 | 15 | platform: Any CPU 16 | shallow_clone: true 17 | 18 | # Install scripts. (runs after repo cloning) 19 | install: 20 | # Get the latest stable version of Node 0.STABLE.latest 21 | - ps: Install-Product node $env:nodejs_version 22 | - npm install 23 | - npm install -g grunt-cli mocha 24 | - grunt build 25 | 26 | # Post-install test scripts. 27 | test_script: 28 | # Output useful info for debugging. 29 | - node --version 30 | - npm --version 31 | - cmd: grunt test 32 | 33 | os: 34 | - Default Azure 35 | - Windows Server 2012 R2 36 | 37 | # Don't actually build using MSBuild 38 | build: off 39 | 40 | # Set build version format here instead of in the admin panel. 41 | version: "{build}" 42 | -------------------------------------------------------------------------------- /coffeelint.json: -------------------------------------------------------------------------------- 1 | { 2 | "arrow_spacing": { 3 | "level": "ignore" 4 | }, 5 | "braces_spacing": { 6 | "level": "ignore", 7 | "spaces": 0, 8 | "empty_object_spaces": 0 9 | }, 10 | "camel_case_classes": { 11 | "level": "error" 12 | }, 13 | "coffeescript_error": { 14 | "level": "error" 15 | }, 16 | "colon_assignment_spacing": { 17 | "level": "ignore", 18 | "spacing": { 19 | "left": 0, 20 | "right": 0 21 | } 22 | }, 23 | "cyclomatic_complexity": { 24 | "value": 10, 25 | "level": "ignore" 26 | }, 27 | "duplicate_key": { 28 | "level": "error" 29 | }, 30 | "empty_constructor_needs_parens": { 31 | "level": "ignore" 32 | }, 33 | "ensure_comprehensions": { 34 | "level": "warn" 35 | }, 36 | "indentation": { 37 | "value": 1, 38 | "level": "error" 39 | }, 40 | "line_endings": { 41 | "level": "ignore", 42 | "value": "unix" 43 | }, 44 | "max_line_length": { 45 | "value": 120, 46 | "level": "ignore", 47 | "limitComments": false 48 | }, 49 | "missing_fat_arrows": { 50 | "level": "ignore", 51 | "is_strict": false 52 | }, 53 | "newlines_after_classes": { 54 | "value": 3, 55 | "level": "ignore" 56 | }, 57 | "no_backticks": { 58 | "level": "error" 59 | }, 60 | "no_debugger": { 61 | "level": "warn" 62 | }, 63 | "no_empty_functions": { 64 | "level": "ignore" 65 | }, 66 | "no_empty_param_list": { 67 | "level": "ignore" 68 | }, 69 | "no_implicit_braces": { 70 | "level": "ignore", 71 | "strict": true 72 | }, 73 | "no_implicit_parens": { 74 | "strict": true, 75 | "level": "ignore" 76 | }, 77 | "no_interpolation_in_single_quotes": { 78 | "level": "ignore" 79 | }, 80 | "no_plusplus": { 81 | "level": "ignore" 82 | }, 83 | "no_stand_alone_at": { 84 | "level": "ignore" 85 | }, 86 | "no_tabs": { 87 | "level": "ignore" 88 | }, 89 | "no_throwing_strings": { 90 | "level": "error" 91 | }, 92 | "no_trailing_semicolons": { 93 | "level": "error" 94 | }, 95 | "no_trailing_whitespace": { 96 | "level": "error", 97 | "allowed_in_comments": true, 98 | "allowed_in_empty_lines": true 99 | }, 100 | "no_unnecessary_double_quotes": { 101 | "level": "ignore" 102 | }, 103 | "no_unnecessary_fat_arrows": { 104 | "level": "warn" 105 | }, 106 | "non_empty_constructor_needs_parens": { 107 | "level": "ignore" 108 | }, 109 | "prefer_english_operator": { 110 | "level": "ignore", 111 | "doubleNotLevel": "ignore" 112 | }, 113 | "space_operators": { 114 | "level": "ignore" 115 | }, 116 | "spacing_after_comma": { 117 | "level": "ignore" 118 | }, 119 | "transform_messes_up_line_numbers": { 120 | "level": "warn" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /dockertests/Dockerfile.10: -------------------------------------------------------------------------------- 1 | FROM node:10-alpine 2 | MAINTAINER M. Peter 3 | 4 | RUN mkdir -p /usr/src/ 5 | WORKDIR /usr/src/ 6 | 7 | RUN npm install -g mocha 8 | 9 | COPY package.json /usr/src/package.json 10 | RUN npm install 11 | 12 | COPY lib/ /usr/src/lib/ 13 | COPY test/ /usr/src/test/ 14 | COPY index.js /usr/src/ 15 | COPY dockertests/test.sh /usr/src/test.sh 16 | 17 | RUN chmod +x /usr/src/test.sh 18 | 19 | CMD [ "/usr/src/test.sh" ] 20 | -------------------------------------------------------------------------------- /dockertests/Dockerfile.12: -------------------------------------------------------------------------------- 1 | FROM node:12-alpine 2 | MAINTAINER M. Peter 3 | 4 | RUN mkdir -p /usr/src/ 5 | WORKDIR /usr/src/ 6 | 7 | RUN npm install -g mocha 8 | 9 | COPY package.json /usr/src/package.json 10 | RUN npm install 11 | 12 | COPY lib/ /usr/src/lib/ 13 | COPY test/ /usr/src/test/ 14 | COPY index.js /usr/src/ 15 | COPY dockertests/test.sh /usr/src/test.sh 16 | 17 | RUN chmod +x /usr/src/test.sh 18 | 19 | CMD [ "/usr/src/test.sh" ] 20 | -------------------------------------------------------------------------------- /dockertests/Dockerfile.14: -------------------------------------------------------------------------------- 1 | FROM node:14-alpine 2 | MAINTAINER M. Peter 3 | 4 | RUN mkdir -p /usr/src/ 5 | WORKDIR /usr/src/ 6 | 7 | RUN npm install -g mocha 8 | 9 | COPY package.json /usr/src/package.json 10 | RUN npm install 11 | 12 | COPY lib/ /usr/src/lib/ 13 | COPY test/ /usr/src/test/ 14 | COPY index.js /usr/src/ 15 | COPY dockertests/test.sh /usr/src/test.sh 16 | 17 | RUN chmod +x /usr/src/test.sh 18 | 19 | CMD [ "/usr/src/test.sh" ] 20 | -------------------------------------------------------------------------------- /dockertests/Dockerfile.current: -------------------------------------------------------------------------------- 1 | FROM node:current-alpine 2 | MAINTAINER M. Peter 3 | 4 | RUN mkdir -p /usr/src/ 5 | WORKDIR /usr/src/ 6 | 7 | RUN npm install -g mocha 8 | 9 | COPY package.json /usr/src/package.json 10 | RUN npm install 11 | 12 | COPY lib/ /usr/src/lib/ 13 | COPY test/ /usr/src/test/ 14 | COPY index.js /usr/src/ 15 | COPY dockertests/test.sh /usr/src/test.sh 16 | 17 | RUN chmod +x /usr/src/test.sh 18 | 19 | CMD [ "/usr/src/test.sh" ] 20 | -------------------------------------------------------------------------------- /dockertests/Dockerfile.lts: -------------------------------------------------------------------------------- 1 | FROM node:lts-alpine 2 | MAINTAINER M. Peter 3 | 4 | RUN mkdir -p /usr/src/ 5 | WORKDIR /usr/src/ 6 | 7 | RUN npm install -g mocha 8 | 9 | COPY package.json /usr/src/package.json 10 | RUN npm install 11 | 12 | COPY lib/ /usr/src/lib/ 13 | COPY test/ /usr/src/test/ 14 | COPY index.js /usr/src/ 15 | COPY dockertests/test.sh /usr/src/test.sh 16 | 17 | RUN chmod +x /usr/src/test.sh 18 | 19 | CMD [ "/usr/src/test.sh" ] 20 | -------------------------------------------------------------------------------- /dockertests/run.sh: -------------------------------------------------------------------------------- 1 | VERSIONS[1]=10 2 | VERSIONS[2]=12 3 | VERSIONS[3]=14 4 | VERSIONS[4]=lts 5 | VERSIONS[5]=current 6 | 7 | 8 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 9 | 10 | SCRIPTDIR="dockertests" 11 | cd $DIR 12 | cd .. 13 | 14 | for version in "${VERSIONS[@]}" 15 | do 16 | : 17 | FV=`echo $version | sed 's/\./_/'` 18 | DFile="Dockerfile.$FV" 19 | if [ -f "$SCRIPTDIR/$DFile" ]; then 20 | echo "TEST Version: $version" 21 | BUILDLOGS="$DIR/dockerbuild.$version.log" 22 | rm -f $BUILDLOGS 23 | echo "Start build ..." 24 | docker build -t=mpneuried.systemhealth.dockertest.$version -f=$SCRIPTDIR/$DFile . > $BUILDLOGS 25 | echo "Run test ..." 26 | docker run --name=mpneuried.systemhealth.dockertest.$version mpneuried.systemhealth.dockertest.$version >&2 27 | echo "Remove container ..." 28 | docker rm mpneuried.systemhealth.dockertest.$version >&2 29 | else 30 | echo "Dockerfile '$DFile' not found" 31 | fi 32 | done 33 | -------------------------------------------------------------------------------- /dockertests/test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | echo "START TEST..." 3 | npm run test-compiled 4 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | exports.version = '2.0.0'; 3 | 4 | module.exports = require('./lib/systemhealth'); 5 | 6 | }).call(this); 7 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "systemhealth", 3 | "version": "2.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "1.1.1", 9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 10 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 11 | "dev": true 12 | }, 13 | "ajv": { 14 | "version": "6.12.6", 15 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 16 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 17 | "dev": true, 18 | "requires": { 19 | "fast-deep-equal": "^3.1.1", 20 | "fast-json-stable-stringify": "^2.0.0", 21 | "json-schema-traverse": "^0.4.1", 22 | "uri-js": "^4.2.2" 23 | } 24 | }, 25 | "ambi": { 26 | "version": "2.0.0", 27 | "resolved": "https://registry.npmjs.org/ambi/-/ambi-2.0.0.tgz", 28 | "integrity": "sha1-QsK/mOjRAapNooqBJnil2+Nq2mY=", 29 | "dev": true, 30 | "requires": { 31 | "typechecker": "~2.0.1" 32 | } 33 | }, 34 | "amdefine": { 35 | "version": "1.0.1", 36 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 37 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", 38 | "dev": true, 39 | "optional": true 40 | }, 41 | "ansi-styles": { 42 | "version": "3.2.1", 43 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 44 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 45 | "dev": true, 46 | "requires": { 47 | "color-convert": "^1.9.0" 48 | } 49 | }, 50 | "argparse": { 51 | "version": "1.0.10", 52 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 53 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 54 | "dev": true, 55 | "requires": { 56 | "sprintf-js": "~1.0.2" 57 | } 58 | }, 59 | "array-find-index": { 60 | "version": "1.0.2", 61 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", 62 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", 63 | "dev": true 64 | }, 65 | "asn1": { 66 | "version": "0.2.4", 67 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 68 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 69 | "dev": true, 70 | "requires": { 71 | "safer-buffer": "~2.1.0" 72 | } 73 | }, 74 | "assert-plus": { 75 | "version": "1.0.0", 76 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 77 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 78 | "dev": true 79 | }, 80 | "async": { 81 | "version": "3.2.0", 82 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", 83 | "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" 84 | }, 85 | "asynckit": { 86 | "version": "0.4.0", 87 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 88 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 89 | "dev": true 90 | }, 91 | "aws-sign2": { 92 | "version": "0.7.0", 93 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 94 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 95 | "dev": true 96 | }, 97 | "aws4": { 98 | "version": "1.11.0", 99 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", 100 | "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", 101 | "dev": true 102 | }, 103 | "bal-util": { 104 | "version": "1.18.0", 105 | "resolved": "https://registry.npmjs.org/bal-util/-/bal-util-1.18.0.tgz", 106 | "integrity": "sha1-Ti4tkIFtGmt+NxdAIAQqLOJYQh0=", 107 | "dev": true, 108 | "requires": { 109 | "ambi": "~2.0.0", 110 | "eachr": "~2.0.2", 111 | "extendr": "~2.0.1", 112 | "getsetdeep": "~2.0.0", 113 | "safecallback": "~1.0.1", 114 | "safefs": "~2.0.3", 115 | "taskgroup": "~2.0.0", 116 | "typechecker": "~2.0.1" 117 | } 118 | }, 119 | "balanced-match": { 120 | "version": "1.0.2", 121 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 122 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 123 | "dev": true 124 | }, 125 | "bcrypt-pbkdf": { 126 | "version": "1.0.2", 127 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 128 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 129 | "dev": true, 130 | "requires": { 131 | "tweetnacl": "^0.14.3" 132 | } 133 | }, 134 | "bl": { 135 | "version": "0.4.2", 136 | "resolved": "https://registry.npmjs.org/bl/-/bl-0.4.2.tgz", 137 | "integrity": "sha1-XbMdcvA4xU5orcOVeBJf47Ct3JY=", 138 | "dev": true, 139 | "requires": { 140 | "readable-stream": "~1.0.2" 141 | } 142 | }, 143 | "body": { 144 | "version": "5.1.0", 145 | "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", 146 | "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=", 147 | "dev": true, 148 | "requires": { 149 | "continuable-cache": "^0.3.1", 150 | "error": "^7.0.0", 151 | "raw-body": "~1.1.0", 152 | "safe-json-parse": "~1.0.1" 153 | } 154 | }, 155 | "brace-expansion": { 156 | "version": "1.1.11", 157 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 158 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 159 | "dev": true, 160 | "requires": { 161 | "balanced-match": "^1.0.0", 162 | "concat-map": "0.0.1" 163 | } 164 | }, 165 | "browser-stdout": { 166 | "version": "1.3.0", 167 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", 168 | "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", 169 | "dev": true 170 | }, 171 | "bytes": { 172 | "version": "1.0.0", 173 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", 174 | "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", 175 | "dev": true 176 | }, 177 | "camelcase": { 178 | "version": "2.1.1", 179 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 180 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", 181 | "dev": true 182 | }, 183 | "camelcase-keys": { 184 | "version": "2.1.0", 185 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", 186 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", 187 | "dev": true, 188 | "requires": { 189 | "camelcase": "^2.0.0", 190 | "map-obj": "^1.0.0" 191 | } 192 | }, 193 | "caseless": { 194 | "version": "0.12.0", 195 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 196 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 197 | "dev": true 198 | }, 199 | "chalk": { 200 | "version": "2.4.2", 201 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 202 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 203 | "dev": true, 204 | "requires": { 205 | "ansi-styles": "^3.2.1", 206 | "escape-string-regexp": "^1.0.5", 207 | "supports-color": "^5.3.0" 208 | } 209 | }, 210 | "coffee-coverage": { 211 | "version": "3.0.1", 212 | "resolved": "https://registry.npmjs.org/coffee-coverage/-/coffee-coverage-3.0.1.tgz", 213 | "integrity": "sha512-wY7ZYhxhQoG27XbJgWx2QUCi9xHrJO91+4RA7hjAWV2VVugZv3ULPXGGetI04SmFZeQ3rnZ1eFTdksi9LdEKqg==", 214 | "dev": true, 215 | "requires": { 216 | "argparse": "^1.0.2", 217 | "coffeescript": "^2.0.2", 218 | "lodash": "^4.14.0", 219 | "minimatch": "^3.0.2", 220 | "pkginfo": ">=0.2.3" 221 | } 222 | }, 223 | "coffeescript": { 224 | "version": "2.5.1", 225 | "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.5.1.tgz", 226 | "integrity": "sha512-J2jRPX0eeFh5VKyVnoLrfVFgLZtnnmp96WQSLAS8OrLm2wtQLcnikYKe1gViJKDH7vucjuhHvBKKBP3rKcD1tQ==", 227 | "dev": true 228 | }, 229 | "color-convert": { 230 | "version": "1.9.3", 231 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 232 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 233 | "dev": true, 234 | "requires": { 235 | "color-name": "1.1.3" 236 | } 237 | }, 238 | "color-name": { 239 | "version": "1.1.3", 240 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 241 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 242 | "dev": true 243 | }, 244 | "colors": { 245 | "version": "1.1.2", 246 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", 247 | "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" 248 | }, 249 | "combined-stream": { 250 | "version": "1.0.8", 251 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 252 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 253 | "dev": true, 254 | "requires": { 255 | "delayed-stream": "~1.0.0" 256 | } 257 | }, 258 | "commander": { 259 | "version": "0.5.2", 260 | "resolved": "https://registry.npmjs.org/commander/-/commander-0.5.2.tgz", 261 | "integrity": "sha1-8nAyZwmhFaEmz+1WI4UkObjko7U=", 262 | "dev": true 263 | }, 264 | "concat-map": { 265 | "version": "0.0.1", 266 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 267 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 268 | "dev": true 269 | }, 270 | "continuable-cache": { 271 | "version": "0.3.1", 272 | "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", 273 | "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=", 274 | "dev": true 275 | }, 276 | "core-util-is": { 277 | "version": "1.0.2", 278 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 279 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 280 | "dev": true 281 | }, 282 | "coveralls": { 283 | "version": "3.0.14", 284 | "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.14.tgz", 285 | "integrity": "sha512-nEQqCHzxiFfu1dEHYxe7xrbF5vFmx122mTWIM+BkiAOmsWbSAcucNk8stELnNk2lS1biTUjFOCIf8v8ZN225IA==", 286 | "dev": true, 287 | "requires": { 288 | "js-yaml": "^3.13.1", 289 | "lcov-parse": "^1.0.0", 290 | "log-driver": "^1.2.7", 291 | "minimist": "^1.2.5", 292 | "request": "^2.88.2" 293 | } 294 | }, 295 | "currently-unhandled": { 296 | "version": "0.4.1", 297 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", 298 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", 299 | "dev": true, 300 | "requires": { 301 | "array-find-index": "^1.0.1" 302 | } 303 | }, 304 | "dashdash": { 305 | "version": "1.14.1", 306 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 307 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 308 | "dev": true, 309 | "requires": { 310 | "assert-plus": "^1.0.0" 311 | } 312 | }, 313 | "dateformat": { 314 | "version": "1.0.12", 315 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", 316 | "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", 317 | "dev": true, 318 | "requires": { 319 | "get-stdin": "^4.0.1", 320 | "meow": "^3.3.0" 321 | } 322 | }, 323 | "debug": { 324 | "version": "3.2.7", 325 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", 326 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", 327 | "dev": true, 328 | "requires": { 329 | "ms": "^2.1.1" 330 | } 331 | }, 332 | "decamelize": { 333 | "version": "1.2.0", 334 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 335 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 336 | "dev": true 337 | }, 338 | "deep-is": { 339 | "version": "0.1.3", 340 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 341 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 342 | "dev": true 343 | }, 344 | "delayed-stream": { 345 | "version": "1.0.0", 346 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 347 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 348 | "dev": true 349 | }, 350 | "diff": { 351 | "version": "3.3.1", 352 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", 353 | "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", 354 | "dev": true 355 | }, 356 | "docker": { 357 | "version": "0.2.14", 358 | "resolved": "https://registry.npmjs.org/docker/-/docker-0.2.14.tgz", 359 | "integrity": "sha1-6OlSikZz6rW1pW8C0FiD9nh/ZCY=", 360 | "dev": true, 361 | "requires": { 362 | "commander": "0.5.2", 363 | "mkdirp": "0.3.2", 364 | "pygmentize-bundled": "~2.1.0", 365 | "watchr": "~2.3.3" 366 | }, 367 | "dependencies": { 368 | "mkdirp": { 369 | "version": "0.3.2", 370 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.2.tgz", 371 | "integrity": "sha1-S/uJHpxIuT1rVn8sPPLdP1a83vg=", 372 | "dev": true 373 | } 374 | } 375 | }, 376 | "eachr": { 377 | "version": "2.0.4", 378 | "resolved": "https://registry.npmjs.org/eachr/-/eachr-2.0.4.tgz", 379 | "integrity": "sha1-Rm98qhBwj2EFCeMsgHqv5X/BIr8=", 380 | "dev": true, 381 | "requires": { 382 | "typechecker": "^2.0.8" 383 | } 384 | }, 385 | "ecc-jsbn": { 386 | "version": "0.1.2", 387 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 388 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 389 | "dev": true, 390 | "requires": { 391 | "jsbn": "~0.1.0", 392 | "safer-buffer": "^2.1.0" 393 | } 394 | }, 395 | "error": { 396 | "version": "7.2.1", 397 | "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", 398 | "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", 399 | "dev": true, 400 | "requires": { 401 | "string-template": "~0.2.1" 402 | } 403 | }, 404 | "error-ex": { 405 | "version": "1.3.2", 406 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 407 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 408 | "dev": true, 409 | "requires": { 410 | "is-arrayish": "^0.2.1" 411 | } 412 | }, 413 | "escape-string-regexp": { 414 | "version": "1.0.5", 415 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 416 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 417 | "dev": true 418 | }, 419 | "escodegen": { 420 | "version": "1.8.1", 421 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", 422 | "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", 423 | "dev": true, 424 | "requires": { 425 | "esprima": "^2.7.1", 426 | "estraverse": "^1.9.1", 427 | "esutils": "^2.0.2", 428 | "optionator": "^0.8.1", 429 | "source-map": "~0.2.0" 430 | }, 431 | "dependencies": { 432 | "esprima": { 433 | "version": "2.7.3", 434 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 435 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", 436 | "dev": true 437 | } 438 | } 439 | }, 440 | "esprima": { 441 | "version": "4.0.1", 442 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 443 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 444 | "dev": true 445 | }, 446 | "estraverse": { 447 | "version": "1.9.3", 448 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", 449 | "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", 450 | "dev": true 451 | }, 452 | "esutils": { 453 | "version": "2.0.3", 454 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 455 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 456 | "dev": true 457 | }, 458 | "eventemitter2": { 459 | "version": "0.4.14", 460 | "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", 461 | "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", 462 | "dev": true 463 | }, 464 | "exit": { 465 | "version": "0.1.2", 466 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 467 | "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", 468 | "dev": true 469 | }, 470 | "extend": { 471 | "version": "3.0.2", 472 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 473 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 474 | }, 475 | "extendr": { 476 | "version": "2.0.1", 477 | "resolved": "https://registry.npmjs.org/extendr/-/extendr-2.0.1.tgz", 478 | "integrity": "sha1-2Ks3X8u4M+S6LNIoVA8E5KoH3pA=", 479 | "dev": true, 480 | "requires": { 481 | "typechecker": "~2.0.1" 482 | } 483 | }, 484 | "extsprintf": { 485 | "version": "1.3.0", 486 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 487 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 488 | "dev": true 489 | }, 490 | "fast-deep-equal": { 491 | "version": "3.1.3", 492 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 493 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 494 | "dev": true 495 | }, 496 | "fast-json-stable-stringify": { 497 | "version": "2.1.0", 498 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 499 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 500 | "dev": true 501 | }, 502 | "fast-levenshtein": { 503 | "version": "2.0.6", 504 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 505 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 506 | "dev": true 507 | }, 508 | "faye-websocket": { 509 | "version": "0.10.0", 510 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", 511 | "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", 512 | "dev": true, 513 | "requires": { 514 | "websocket-driver": ">=0.5.1" 515 | } 516 | }, 517 | "find-up": { 518 | "version": "1.1.2", 519 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 520 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 521 | "dev": true, 522 | "requires": { 523 | "path-exists": "^2.0.0", 524 | "pinkie-promise": "^2.0.0" 525 | } 526 | }, 527 | "findup-sync": { 528 | "version": "0.3.0", 529 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", 530 | "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", 531 | "dev": true, 532 | "requires": { 533 | "glob": "~5.0.0" 534 | }, 535 | "dependencies": { 536 | "glob": { 537 | "version": "5.0.15", 538 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 539 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 540 | "dev": true, 541 | "requires": { 542 | "inflight": "^1.0.4", 543 | "inherits": "2", 544 | "minimatch": "2 || 3", 545 | "once": "^1.3.0", 546 | "path-is-absolute": "^1.0.0" 547 | } 548 | } 549 | } 550 | }, 551 | "forever-agent": { 552 | "version": "0.6.1", 553 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 554 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 555 | "dev": true 556 | }, 557 | "form-data": { 558 | "version": "2.3.3", 559 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 560 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 561 | "dev": true, 562 | "requires": { 563 | "asynckit": "^0.4.0", 564 | "combined-stream": "^1.0.6", 565 | "mime-types": "^2.1.12" 566 | } 567 | }, 568 | "fs.realpath": { 569 | "version": "1.0.0", 570 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 571 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 572 | "dev": true 573 | }, 574 | "function-bind": { 575 | "version": "1.1.1", 576 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 577 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 578 | "dev": true 579 | }, 580 | "gaze": { 581 | "version": "1.1.3", 582 | "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", 583 | "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", 584 | "dev": true, 585 | "requires": { 586 | "globule": "^1.0.0" 587 | } 588 | }, 589 | "get-stdin": { 590 | "version": "4.0.1", 591 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", 592 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", 593 | "dev": true 594 | }, 595 | "getobject": { 596 | "version": "0.1.0", 597 | "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", 598 | "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", 599 | "dev": true 600 | }, 601 | "getpass": { 602 | "version": "0.1.7", 603 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 604 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 605 | "dev": true, 606 | "requires": { 607 | "assert-plus": "^1.0.0" 608 | } 609 | }, 610 | "getsetdeep": { 611 | "version": "2.0.0", 612 | "resolved": "https://registry.npmjs.org/getsetdeep/-/getsetdeep-2.0.0.tgz", 613 | "integrity": "sha1-8TOE/mVtCj9BwhTL3zEAGlfBJJI=", 614 | "dev": true, 615 | "requires": { 616 | "typechecker": "~2.0.1" 617 | } 618 | }, 619 | "glob": { 620 | "version": "7.0.6", 621 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", 622 | "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", 623 | "dev": true, 624 | "requires": { 625 | "fs.realpath": "^1.0.0", 626 | "inflight": "^1.0.4", 627 | "inherits": "2", 628 | "minimatch": "^3.0.2", 629 | "once": "^1.3.0", 630 | "path-is-absolute": "^1.0.0" 631 | } 632 | }, 633 | "globule": { 634 | "version": "1.3.2", 635 | "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", 636 | "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", 637 | "dev": true, 638 | "requires": { 639 | "glob": "~7.1.1", 640 | "lodash": "~4.17.10", 641 | "minimatch": "~3.0.2" 642 | }, 643 | "dependencies": { 644 | "glob": { 645 | "version": "7.1.7", 646 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 647 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 648 | "dev": true, 649 | "requires": { 650 | "fs.realpath": "^1.0.0", 651 | "inflight": "^1.0.4", 652 | "inherits": "2", 653 | "minimatch": "^3.0.4", 654 | "once": "^1.3.0", 655 | "path-is-absolute": "^1.0.0" 656 | } 657 | } 658 | } 659 | }, 660 | "graceful-fs": { 661 | "version": "4.2.6", 662 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", 663 | "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", 664 | "dev": true 665 | }, 666 | "growl": { 667 | "version": "1.10.3", 668 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", 669 | "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", 670 | "dev": true 671 | }, 672 | "grunt": { 673 | "version": "1.0.4", 674 | "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.4.tgz", 675 | "integrity": "sha512-PYsMOrOC+MsdGEkFVwMaMyc6Ob7pKmq+deg1Sjr+vvMWp35sztfwKE7qoN51V+UEtHsyNuMcGdgMLFkBHvMxHQ==", 676 | "dev": true, 677 | "requires": { 678 | "coffeescript": "~1.10.0", 679 | "dateformat": "~1.0.12", 680 | "eventemitter2": "~0.4.13", 681 | "exit": "~0.1.1", 682 | "findup-sync": "~0.3.0", 683 | "glob": "~7.0.0", 684 | "grunt-cli": "~1.2.0", 685 | "grunt-known-options": "~1.1.0", 686 | "grunt-legacy-log": "~2.0.0", 687 | "grunt-legacy-util": "~1.1.1", 688 | "iconv-lite": "~0.4.13", 689 | "js-yaml": "~3.13.0", 690 | "minimatch": "~3.0.2", 691 | "mkdirp": "~0.5.1", 692 | "nopt": "~3.0.6", 693 | "path-is-absolute": "~1.0.0", 694 | "rimraf": "~2.6.2" 695 | }, 696 | "dependencies": { 697 | "coffeescript": { 698 | "version": "1.10.0", 699 | "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz", 700 | "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=", 701 | "dev": true 702 | }, 703 | "grunt-cli": { 704 | "version": "1.2.0", 705 | "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", 706 | "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", 707 | "dev": true, 708 | "requires": { 709 | "findup-sync": "~0.3.0", 710 | "grunt-known-options": "~1.1.0", 711 | "nopt": "~3.0.6", 712 | "resolve": "~1.1.0" 713 | } 714 | }, 715 | "js-yaml": { 716 | "version": "3.13.1", 717 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 718 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 719 | "dev": true, 720 | "requires": { 721 | "argparse": "^1.0.7", 722 | "esprima": "^4.0.0" 723 | } 724 | }, 725 | "resolve": { 726 | "version": "1.1.7", 727 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 728 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 729 | "dev": true 730 | } 731 | } 732 | }, 733 | "grunt-contrib-clean": { 734 | "version": "1.1.0", 735 | "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.1.0.tgz", 736 | "integrity": "sha1-Vkq/LQN4qYOhW54/MO51tzjEBjg=", 737 | "dev": true, 738 | "requires": { 739 | "async": "^1.5.2", 740 | "rimraf": "^2.5.1" 741 | }, 742 | "dependencies": { 743 | "async": { 744 | "version": "1.5.2", 745 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 746 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", 747 | "dev": true 748 | } 749 | } 750 | }, 751 | "grunt-contrib-coffee": { 752 | "version": "2.1.0", 753 | "resolved": "https://registry.npmjs.org/grunt-contrib-coffee/-/grunt-contrib-coffee-2.1.0.tgz", 754 | "integrity": "sha512-lgP+pPY3mHl+gqAU0T+7BcocBWu0FyeeJnAG/iIp2I0GPa5LvZJ7Wqga6QwKQtQCTs+1gPEa12nuap9Lj08lhw==", 755 | "dev": true, 756 | "requires": { 757 | "chalk": "^2.4.2", 758 | "coffeescript": "^2.3.2", 759 | "lodash": "^4.17.11", 760 | "uri-path": "^1.0.0" 761 | } 762 | }, 763 | "grunt-contrib-watch": { 764 | "version": "1.1.0", 765 | "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz", 766 | "integrity": "sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==", 767 | "dev": true, 768 | "requires": { 769 | "async": "^2.6.0", 770 | "gaze": "^1.1.0", 771 | "lodash": "^4.17.10", 772 | "tiny-lr": "^1.1.1" 773 | }, 774 | "dependencies": { 775 | "async": { 776 | "version": "2.6.3", 777 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", 778 | "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", 779 | "dev": true, 780 | "requires": { 781 | "lodash": "^4.17.14" 782 | } 783 | } 784 | } 785 | }, 786 | "grunt-docker": { 787 | "version": "0.0.11", 788 | "resolved": "https://registry.npmjs.org/grunt-docker/-/grunt-docker-0.0.11.tgz", 789 | "integrity": "sha1-mf9wlN8i15OsCT+eixBd/g8qqzU=", 790 | "dev": true, 791 | "requires": { 792 | "docker": "~0.2.10", 793 | "grunt": "~0.4.0" 794 | }, 795 | "dependencies": { 796 | "argparse": { 797 | "version": "0.1.16", 798 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", 799 | "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", 800 | "dev": true, 801 | "requires": { 802 | "underscore": "~1.7.0", 803 | "underscore.string": "~2.4.0" 804 | }, 805 | "dependencies": { 806 | "underscore.string": { 807 | "version": "2.4.0", 808 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", 809 | "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", 810 | "dev": true 811 | } 812 | } 813 | }, 814 | "async": { 815 | "version": "0.1.22", 816 | "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", 817 | "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=", 818 | "dev": true 819 | }, 820 | "coffee-script": { 821 | "version": "1.3.3", 822 | "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", 823 | "integrity": "sha1-FQ1rTLUiiUNp7+1qIQHCC8f0pPQ=", 824 | "dev": true 825 | }, 826 | "colors": { 827 | "version": "0.6.2", 828 | "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", 829 | "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", 830 | "dev": true 831 | }, 832 | "dateformat": { 833 | "version": "1.0.2-1.2.3", 834 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", 835 | "integrity": "sha1-sCIMAt6YYXQztyhRz0fePfLNvuk=", 836 | "dev": true 837 | }, 838 | "esprima": { 839 | "version": "1.0.4", 840 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", 841 | "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", 842 | "dev": true 843 | }, 844 | "findup-sync": { 845 | "version": "0.1.3", 846 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", 847 | "integrity": "sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=", 848 | "dev": true, 849 | "requires": { 850 | "glob": "~3.2.9", 851 | "lodash": "~2.4.1" 852 | }, 853 | "dependencies": { 854 | "glob": { 855 | "version": "3.2.11", 856 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", 857 | "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", 858 | "dev": true, 859 | "requires": { 860 | "inherits": "2", 861 | "minimatch": "0.3" 862 | } 863 | }, 864 | "lodash": { 865 | "version": "2.4.2", 866 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", 867 | "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", 868 | "dev": true 869 | }, 870 | "minimatch": { 871 | "version": "0.3.0", 872 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", 873 | "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", 874 | "dev": true, 875 | "requires": { 876 | "lru-cache": "2", 877 | "sigmund": "~1.0.0" 878 | } 879 | } 880 | } 881 | }, 882 | "glob": { 883 | "version": "3.1.21", 884 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", 885 | "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", 886 | "dev": true, 887 | "requires": { 888 | "graceful-fs": "~1.2.0", 889 | "inherits": "1", 890 | "minimatch": "~0.2.11" 891 | }, 892 | "dependencies": { 893 | "inherits": { 894 | "version": "1.0.2", 895 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", 896 | "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", 897 | "dev": true 898 | } 899 | } 900 | }, 901 | "graceful-fs": { 902 | "version": "1.2.3", 903 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", 904 | "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", 905 | "dev": true 906 | }, 907 | "grunt": { 908 | "version": "0.4.5", 909 | "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", 910 | "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=", 911 | "dev": true, 912 | "requires": { 913 | "async": "~0.1.22", 914 | "coffee-script": "~1.3.3", 915 | "colors": "~0.6.2", 916 | "dateformat": "1.0.2-1.2.3", 917 | "eventemitter2": "~0.4.13", 918 | "exit": "~0.1.1", 919 | "findup-sync": "~0.1.2", 920 | "getobject": "~0.1.0", 921 | "glob": "~3.1.21", 922 | "grunt-legacy-log": "~0.1.0", 923 | "grunt-legacy-util": "~0.2.0", 924 | "hooker": "~0.2.3", 925 | "iconv-lite": "~0.2.11", 926 | "js-yaml": "~2.0.5", 927 | "lodash": "~0.9.2", 928 | "minimatch": "~0.2.12", 929 | "nopt": "~1.0.10", 930 | "rimraf": "~2.2.8", 931 | "underscore.string": "~2.2.1", 932 | "which": "~1.0.5" 933 | } 934 | }, 935 | "grunt-legacy-log": { 936 | "version": "0.1.3", 937 | "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", 938 | "integrity": "sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE=", 939 | "dev": true, 940 | "requires": { 941 | "colors": "~0.6.2", 942 | "grunt-legacy-log-utils": "~0.1.1", 943 | "hooker": "~0.2.3", 944 | "lodash": "~2.4.1", 945 | "underscore.string": "~2.3.3" 946 | }, 947 | "dependencies": { 948 | "lodash": { 949 | "version": "2.4.2", 950 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", 951 | "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", 952 | "dev": true 953 | }, 954 | "underscore.string": { 955 | "version": "2.3.3", 956 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", 957 | "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", 958 | "dev": true 959 | } 960 | } 961 | }, 962 | "grunt-legacy-log-utils": { 963 | "version": "0.1.1", 964 | "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", 965 | "integrity": "sha1-wHBrndkGThFvNvI/5OawSGcsD34=", 966 | "dev": true, 967 | "requires": { 968 | "colors": "~0.6.2", 969 | "lodash": "~2.4.1", 970 | "underscore.string": "~2.3.3" 971 | }, 972 | "dependencies": { 973 | "lodash": { 974 | "version": "2.4.2", 975 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", 976 | "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", 977 | "dev": true 978 | }, 979 | "underscore.string": { 980 | "version": "2.3.3", 981 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", 982 | "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", 983 | "dev": true 984 | } 985 | } 986 | }, 987 | "grunt-legacy-util": { 988 | "version": "0.2.0", 989 | "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", 990 | "integrity": "sha1-kzJIhNv343qf98Am3/RR2UqeVUs=", 991 | "dev": true, 992 | "requires": { 993 | "async": "~0.1.22", 994 | "exit": "~0.1.1", 995 | "getobject": "~0.1.0", 996 | "hooker": "~0.2.3", 997 | "lodash": "~0.9.2", 998 | "underscore.string": "~2.2.1", 999 | "which": "~1.0.5" 1000 | } 1001 | }, 1002 | "iconv-lite": { 1003 | "version": "0.2.11", 1004 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", 1005 | "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=", 1006 | "dev": true 1007 | }, 1008 | "js-yaml": { 1009 | "version": "2.0.5", 1010 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", 1011 | "integrity": "sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g=", 1012 | "dev": true, 1013 | "requires": { 1014 | "argparse": "~ 0.1.11", 1015 | "esprima": "~ 1.0.2" 1016 | } 1017 | }, 1018 | "lodash": { 1019 | "version": "0.9.2", 1020 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", 1021 | "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=", 1022 | "dev": true 1023 | }, 1024 | "minimatch": { 1025 | "version": "0.2.14", 1026 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", 1027 | "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", 1028 | "dev": true, 1029 | "requires": { 1030 | "lru-cache": "2", 1031 | "sigmund": "~1.0.0" 1032 | } 1033 | }, 1034 | "nopt": { 1035 | "version": "1.0.10", 1036 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 1037 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", 1038 | "dev": true, 1039 | "requires": { 1040 | "abbrev": "1" 1041 | } 1042 | }, 1043 | "rimraf": { 1044 | "version": "2.2.8", 1045 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", 1046 | "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", 1047 | "dev": true 1048 | }, 1049 | "underscore.string": { 1050 | "version": "2.2.1", 1051 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", 1052 | "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=", 1053 | "dev": true 1054 | }, 1055 | "which": { 1056 | "version": "1.0.9", 1057 | "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", 1058 | "integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=", 1059 | "dev": true 1060 | } 1061 | } 1062 | }, 1063 | "grunt-include-replace": { 1064 | "version": "5.0.0", 1065 | "resolved": "https://registry.npmjs.org/grunt-include-replace/-/grunt-include-replace-5.0.0.tgz", 1066 | "integrity": "sha1-CVORY7FoGmxWCRBpVFBOHBpm4Hc=", 1067 | "dev": true 1068 | }, 1069 | "grunt-known-options": { 1070 | "version": "1.1.1", 1071 | "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", 1072 | "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==", 1073 | "dev": true 1074 | }, 1075 | "grunt-legacy-log": { 1076 | "version": "2.0.0", 1077 | "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz", 1078 | "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==", 1079 | "dev": true, 1080 | "requires": { 1081 | "colors": "~1.1.2", 1082 | "grunt-legacy-log-utils": "~2.0.0", 1083 | "hooker": "~0.2.3", 1084 | "lodash": "~4.17.5" 1085 | } 1086 | }, 1087 | "grunt-legacy-log-utils": { 1088 | "version": "2.0.1", 1089 | "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz", 1090 | "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==", 1091 | "dev": true, 1092 | "requires": { 1093 | "chalk": "~2.4.1", 1094 | "lodash": "~4.17.10" 1095 | } 1096 | }, 1097 | "grunt-legacy-util": { 1098 | "version": "1.1.1", 1099 | "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz", 1100 | "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==", 1101 | "dev": true, 1102 | "requires": { 1103 | "async": "~1.5.2", 1104 | "exit": "~0.1.1", 1105 | "getobject": "~0.1.0", 1106 | "hooker": "~0.2.3", 1107 | "lodash": "~4.17.10", 1108 | "underscore.string": "~3.3.4", 1109 | "which": "~1.3.0" 1110 | }, 1111 | "dependencies": { 1112 | "async": { 1113 | "version": "1.5.2", 1114 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 1115 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", 1116 | "dev": true 1117 | } 1118 | } 1119 | }, 1120 | "grunt-mocha-cli": { 1121 | "version": "4.0.0", 1122 | "resolved": "https://registry.npmjs.org/grunt-mocha-cli/-/grunt-mocha-cli-4.0.0.tgz", 1123 | "integrity": "sha512-UDsX55Bk3XLd4thWiPK8ueAYBz5pJwy/qP/XoyWVhS6icXsbYFNS62V0Voy/2dIoWW6mqwdEtIuEEXJxKodJfw==", 1124 | "dev": true, 1125 | "requires": { 1126 | "mocha": "^4.0.0" 1127 | }, 1128 | "dependencies": { 1129 | "commander": { 1130 | "version": "2.11.0", 1131 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 1132 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", 1133 | "dev": true 1134 | }, 1135 | "debug": { 1136 | "version": "3.1.0", 1137 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1138 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1139 | "dev": true, 1140 | "requires": { 1141 | "ms": "2.0.0" 1142 | } 1143 | }, 1144 | "glob": { 1145 | "version": "7.1.2", 1146 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 1147 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 1148 | "dev": true, 1149 | "requires": { 1150 | "fs.realpath": "^1.0.0", 1151 | "inflight": "^1.0.4", 1152 | "inherits": "2", 1153 | "minimatch": "^3.0.4", 1154 | "once": "^1.3.0", 1155 | "path-is-absolute": "^1.0.0" 1156 | } 1157 | }, 1158 | "has-flag": { 1159 | "version": "2.0.0", 1160 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 1161 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 1162 | "dev": true 1163 | }, 1164 | "minimist": { 1165 | "version": "0.0.8", 1166 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1167 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1168 | "dev": true 1169 | }, 1170 | "mkdirp": { 1171 | "version": "0.5.1", 1172 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1173 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1174 | "dev": true, 1175 | "requires": { 1176 | "minimist": "0.0.8" 1177 | } 1178 | }, 1179 | "mocha": { 1180 | "version": "4.1.0", 1181 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", 1182 | "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", 1183 | "dev": true, 1184 | "requires": { 1185 | "browser-stdout": "1.3.0", 1186 | "commander": "2.11.0", 1187 | "debug": "3.1.0", 1188 | "diff": "3.3.1", 1189 | "escape-string-regexp": "1.0.5", 1190 | "glob": "7.1.2", 1191 | "growl": "1.10.3", 1192 | "he": "1.1.1", 1193 | "mkdirp": "0.5.1", 1194 | "supports-color": "4.4.0" 1195 | } 1196 | }, 1197 | "ms": { 1198 | "version": "2.0.0", 1199 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1200 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1201 | "dev": true 1202 | }, 1203 | "supports-color": { 1204 | "version": "4.4.0", 1205 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", 1206 | "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", 1207 | "dev": true, 1208 | "requires": { 1209 | "has-flag": "^2.0.0" 1210 | } 1211 | } 1212 | } 1213 | }, 1214 | "handlebars": { 1215 | "version": "4.7.7", 1216 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", 1217 | "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", 1218 | "dev": true, 1219 | "requires": { 1220 | "minimist": "^1.2.5", 1221 | "neo-async": "^2.6.0", 1222 | "source-map": "^0.6.1", 1223 | "uglify-js": "^3.1.4", 1224 | "wordwrap": "^1.0.0" 1225 | }, 1226 | "dependencies": { 1227 | "source-map": { 1228 | "version": "0.6.1", 1229 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1230 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1231 | "dev": true 1232 | } 1233 | } 1234 | }, 1235 | "har-schema": { 1236 | "version": "2.0.0", 1237 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 1238 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 1239 | "dev": true 1240 | }, 1241 | "har-validator": { 1242 | "version": "5.1.5", 1243 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", 1244 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 1245 | "dev": true, 1246 | "requires": { 1247 | "ajv": "^6.12.3", 1248 | "har-schema": "^2.0.0" 1249 | } 1250 | }, 1251 | "has": { 1252 | "version": "1.0.3", 1253 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1254 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1255 | "dev": true, 1256 | "requires": { 1257 | "function-bind": "^1.1.1" 1258 | } 1259 | }, 1260 | "has-flag": { 1261 | "version": "3.0.0", 1262 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1263 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1264 | "dev": true 1265 | }, 1266 | "he": { 1267 | "version": "1.1.1", 1268 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 1269 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 1270 | "dev": true 1271 | }, 1272 | "hooker": { 1273 | "version": "0.2.3", 1274 | "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", 1275 | "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", 1276 | "dev": true 1277 | }, 1278 | "hosted-git-info": { 1279 | "version": "2.8.9", 1280 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", 1281 | "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", 1282 | "dev": true 1283 | }, 1284 | "http-parser-js": { 1285 | "version": "0.5.3", 1286 | "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", 1287 | "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", 1288 | "dev": true 1289 | }, 1290 | "http-signature": { 1291 | "version": "1.2.0", 1292 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 1293 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 1294 | "dev": true, 1295 | "requires": { 1296 | "assert-plus": "^1.0.0", 1297 | "jsprim": "^1.2.2", 1298 | "sshpk": "^1.7.0" 1299 | } 1300 | }, 1301 | "iconv-lite": { 1302 | "version": "0.4.24", 1303 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1304 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1305 | "dev": true, 1306 | "requires": { 1307 | "safer-buffer": ">= 2.1.2 < 3" 1308 | } 1309 | }, 1310 | "indent-string": { 1311 | "version": "2.1.0", 1312 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", 1313 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", 1314 | "dev": true, 1315 | "requires": { 1316 | "repeating": "^2.0.0" 1317 | } 1318 | }, 1319 | "inflight": { 1320 | "version": "1.0.6", 1321 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1322 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1323 | "dev": true, 1324 | "requires": { 1325 | "once": "^1.3.0", 1326 | "wrappy": "1" 1327 | } 1328 | }, 1329 | "inherits": { 1330 | "version": "2.0.4", 1331 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1332 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1333 | "dev": true 1334 | }, 1335 | "is-arrayish": { 1336 | "version": "0.2.1", 1337 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1338 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", 1339 | "dev": true 1340 | }, 1341 | "is-core-module": { 1342 | "version": "2.5.0", 1343 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", 1344 | "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", 1345 | "dev": true, 1346 | "requires": { 1347 | "has": "^1.0.3" 1348 | } 1349 | }, 1350 | "is-finite": { 1351 | "version": "1.1.0", 1352 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", 1353 | "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", 1354 | "dev": true 1355 | }, 1356 | "is-typedarray": { 1357 | "version": "1.0.0", 1358 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1359 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 1360 | "dev": true 1361 | }, 1362 | "is-utf8": { 1363 | "version": "0.2.1", 1364 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 1365 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", 1366 | "dev": true 1367 | }, 1368 | "isarray": { 1369 | "version": "0.0.1", 1370 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 1371 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", 1372 | "dev": true 1373 | }, 1374 | "isexe": { 1375 | "version": "2.0.0", 1376 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1377 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1378 | "dev": true 1379 | }, 1380 | "isstream": { 1381 | "version": "0.1.2", 1382 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1383 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 1384 | "dev": true 1385 | }, 1386 | "istanbul": { 1387 | "version": "0.4.5", 1388 | "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", 1389 | "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", 1390 | "dev": true, 1391 | "requires": { 1392 | "abbrev": "1.0.x", 1393 | "async": "1.x", 1394 | "escodegen": "1.8.x", 1395 | "esprima": "2.7.x", 1396 | "glob": "^5.0.15", 1397 | "handlebars": "^4.0.1", 1398 | "js-yaml": "3.x", 1399 | "mkdirp": "0.5.x", 1400 | "nopt": "3.x", 1401 | "once": "1.x", 1402 | "resolve": "1.1.x", 1403 | "supports-color": "^3.1.0", 1404 | "which": "^1.1.1", 1405 | "wordwrap": "^1.0.0" 1406 | }, 1407 | "dependencies": { 1408 | "abbrev": { 1409 | "version": "1.0.9", 1410 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", 1411 | "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", 1412 | "dev": true 1413 | }, 1414 | "async": { 1415 | "version": "1.5.2", 1416 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", 1417 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", 1418 | "dev": true 1419 | }, 1420 | "esprima": { 1421 | "version": "2.7.3", 1422 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", 1423 | "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", 1424 | "dev": true 1425 | }, 1426 | "glob": { 1427 | "version": "5.0.15", 1428 | "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", 1429 | "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", 1430 | "dev": true, 1431 | "requires": { 1432 | "inflight": "^1.0.4", 1433 | "inherits": "2", 1434 | "minimatch": "2 || 3", 1435 | "once": "^1.3.0", 1436 | "path-is-absolute": "^1.0.0" 1437 | } 1438 | }, 1439 | "has-flag": { 1440 | "version": "1.0.0", 1441 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", 1442 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", 1443 | "dev": true 1444 | }, 1445 | "resolve": { 1446 | "version": "1.1.7", 1447 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", 1448 | "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", 1449 | "dev": true 1450 | }, 1451 | "supports-color": { 1452 | "version": "3.2.3", 1453 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", 1454 | "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", 1455 | "dev": true, 1456 | "requires": { 1457 | "has-flag": "^1.0.0" 1458 | } 1459 | } 1460 | } 1461 | }, 1462 | "js-yaml": { 1463 | "version": "3.14.1", 1464 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 1465 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 1466 | "dev": true, 1467 | "requires": { 1468 | "argparse": "^1.0.7", 1469 | "esprima": "^4.0.0" 1470 | } 1471 | }, 1472 | "jsbn": { 1473 | "version": "0.1.1", 1474 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1475 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 1476 | "dev": true 1477 | }, 1478 | "json-schema": { 1479 | "version": "0.2.3", 1480 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1481 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 1482 | "dev": true 1483 | }, 1484 | "json-schema-traverse": { 1485 | "version": "0.4.1", 1486 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1487 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1488 | "dev": true 1489 | }, 1490 | "json-stringify-safe": { 1491 | "version": "5.0.1", 1492 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1493 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 1494 | "dev": true 1495 | }, 1496 | "jsprim": { 1497 | "version": "1.4.1", 1498 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1499 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1500 | "dev": true, 1501 | "requires": { 1502 | "assert-plus": "1.0.0", 1503 | "extsprintf": "1.3.0", 1504 | "json-schema": "0.2.3", 1505 | "verror": "1.10.0" 1506 | } 1507 | }, 1508 | "lcov-parse": { 1509 | "version": "1.0.0", 1510 | "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", 1511 | "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", 1512 | "dev": true 1513 | }, 1514 | "levn": { 1515 | "version": "0.3.0", 1516 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1517 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1518 | "dev": true, 1519 | "requires": { 1520 | "prelude-ls": "~1.1.2", 1521 | "type-check": "~0.3.2" 1522 | } 1523 | }, 1524 | "livereload-js": { 1525 | "version": "2.4.0", 1526 | "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", 1527 | "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", 1528 | "dev": true 1529 | }, 1530 | "load-json-file": { 1531 | "version": "1.1.0", 1532 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 1533 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", 1534 | "dev": true, 1535 | "requires": { 1536 | "graceful-fs": "^4.1.2", 1537 | "parse-json": "^2.2.0", 1538 | "pify": "^2.0.0", 1539 | "pinkie-promise": "^2.0.0", 1540 | "strip-bom": "^2.0.0" 1541 | } 1542 | }, 1543 | "lodash": { 1544 | "version": "4.17.21", 1545 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1546 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1547 | }, 1548 | "log-driver": { 1549 | "version": "1.2.7", 1550 | "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", 1551 | "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", 1552 | "dev": true 1553 | }, 1554 | "loud-rejection": { 1555 | "version": "1.6.0", 1556 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", 1557 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", 1558 | "dev": true, 1559 | "requires": { 1560 | "currently-unhandled": "^0.4.1", 1561 | "signal-exit": "^3.0.0" 1562 | } 1563 | }, 1564 | "lru-cache": { 1565 | "version": "2.7.3", 1566 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", 1567 | "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", 1568 | "dev": true 1569 | }, 1570 | "map-obj": { 1571 | "version": "1.0.1", 1572 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", 1573 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", 1574 | "dev": true 1575 | }, 1576 | "meow": { 1577 | "version": "3.7.0", 1578 | "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", 1579 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", 1580 | "dev": true, 1581 | "requires": { 1582 | "camelcase-keys": "^2.0.0", 1583 | "decamelize": "^1.1.2", 1584 | "loud-rejection": "^1.0.0", 1585 | "map-obj": "^1.0.1", 1586 | "minimist": "^1.1.3", 1587 | "normalize-package-data": "^2.3.4", 1588 | "object-assign": "^4.0.1", 1589 | "read-pkg-up": "^1.0.1", 1590 | "redent": "^1.0.0", 1591 | "trim-newlines": "^1.0.0" 1592 | } 1593 | }, 1594 | "mime-db": { 1595 | "version": "1.48.0", 1596 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", 1597 | "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", 1598 | "dev": true 1599 | }, 1600 | "mime-types": { 1601 | "version": "2.1.31", 1602 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", 1603 | "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", 1604 | "dev": true, 1605 | "requires": { 1606 | "mime-db": "1.48.0" 1607 | } 1608 | }, 1609 | "minimatch": { 1610 | "version": "3.0.4", 1611 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1612 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1613 | "dev": true, 1614 | "requires": { 1615 | "brace-expansion": "^1.1.7" 1616 | } 1617 | }, 1618 | "minimist": { 1619 | "version": "1.2.5", 1620 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1621 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1622 | "dev": true 1623 | }, 1624 | "mkdirp": { 1625 | "version": "0.5.5", 1626 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 1627 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 1628 | "dev": true, 1629 | "requires": { 1630 | "minimist": "^1.2.5" 1631 | } 1632 | }, 1633 | "mocha": { 1634 | "version": "5.1.1", 1635 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.1.1.tgz", 1636 | "integrity": "sha512-kKKs/H1KrMMQIEsWNxGmb4/BGsmj0dkeyotEvbrAuQ01FcWRLssUNXCEUZk6SZtyJBi6EE7SL0zDDtItw1rGhw==", 1637 | "dev": true, 1638 | "requires": { 1639 | "browser-stdout": "1.3.1", 1640 | "commander": "2.11.0", 1641 | "debug": "3.1.0", 1642 | "diff": "3.5.0", 1643 | "escape-string-regexp": "1.0.5", 1644 | "glob": "7.1.2", 1645 | "growl": "1.10.3", 1646 | "he": "1.1.1", 1647 | "minimatch": "3.0.4", 1648 | "mkdirp": "0.5.1", 1649 | "supports-color": "4.4.0" 1650 | }, 1651 | "dependencies": { 1652 | "browser-stdout": { 1653 | "version": "1.3.1", 1654 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 1655 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 1656 | "dev": true 1657 | }, 1658 | "commander": { 1659 | "version": "2.11.0", 1660 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 1661 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", 1662 | "dev": true 1663 | }, 1664 | "debug": { 1665 | "version": "3.1.0", 1666 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 1667 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 1668 | "dev": true, 1669 | "requires": { 1670 | "ms": "2.0.0" 1671 | } 1672 | }, 1673 | "diff": { 1674 | "version": "3.5.0", 1675 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 1676 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 1677 | "dev": true 1678 | }, 1679 | "glob": { 1680 | "version": "7.1.2", 1681 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 1682 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 1683 | "dev": true, 1684 | "requires": { 1685 | "fs.realpath": "^1.0.0", 1686 | "inflight": "^1.0.4", 1687 | "inherits": "2", 1688 | "minimatch": "^3.0.4", 1689 | "once": "^1.3.0", 1690 | "path-is-absolute": "^1.0.0" 1691 | } 1692 | }, 1693 | "has-flag": { 1694 | "version": "2.0.0", 1695 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", 1696 | "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", 1697 | "dev": true 1698 | }, 1699 | "minimist": { 1700 | "version": "0.0.8", 1701 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1702 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1703 | "dev": true 1704 | }, 1705 | "mkdirp": { 1706 | "version": "0.5.1", 1707 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1708 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1709 | "dev": true, 1710 | "requires": { 1711 | "minimist": "0.0.8" 1712 | } 1713 | }, 1714 | "ms": { 1715 | "version": "2.0.0", 1716 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1717 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 1718 | "dev": true 1719 | }, 1720 | "supports-color": { 1721 | "version": "4.4.0", 1722 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", 1723 | "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", 1724 | "dev": true, 1725 | "requires": { 1726 | "has-flag": "^2.0.0" 1727 | } 1728 | } 1729 | } 1730 | }, 1731 | "mpbasic": { 1732 | "version": "0.0.18", 1733 | "resolved": "https://registry.npmjs.org/mpbasic/-/mpbasic-0.0.18.tgz", 1734 | "integrity": "sha1-9Fm6HclcyhPl+AA4gnANCSalPAA=", 1735 | "requires": { 1736 | "colors": "1.1.x", 1737 | "extend": "3.0.x", 1738 | "lodash": "4.x" 1739 | } 1740 | }, 1741 | "ms": { 1742 | "version": "2.1.3", 1743 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1744 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1745 | "dev": true 1746 | }, 1747 | "neo-async": { 1748 | "version": "2.6.2", 1749 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", 1750 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", 1751 | "dev": true 1752 | }, 1753 | "nopt": { 1754 | "version": "3.0.6", 1755 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 1756 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 1757 | "dev": true, 1758 | "requires": { 1759 | "abbrev": "1" 1760 | } 1761 | }, 1762 | "normalize-package-data": { 1763 | "version": "2.5.0", 1764 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 1765 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 1766 | "dev": true, 1767 | "requires": { 1768 | "hosted-git-info": "^2.1.4", 1769 | "resolve": "^1.10.0", 1770 | "semver": "2 || 3 || 4 || 5", 1771 | "validate-npm-package-license": "^3.0.1" 1772 | } 1773 | }, 1774 | "oauth-sign": { 1775 | "version": "0.9.0", 1776 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1777 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 1778 | "dev": true 1779 | }, 1780 | "object-assign": { 1781 | "version": "4.1.1", 1782 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1783 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1784 | "dev": true 1785 | }, 1786 | "object-keys": { 1787 | "version": "0.4.0", 1788 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", 1789 | "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", 1790 | "dev": true 1791 | }, 1792 | "once": { 1793 | "version": "1.4.0", 1794 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1795 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1796 | "dev": true, 1797 | "requires": { 1798 | "wrappy": "1" 1799 | } 1800 | }, 1801 | "optionator": { 1802 | "version": "0.8.3", 1803 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 1804 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 1805 | "dev": true, 1806 | "requires": { 1807 | "deep-is": "~0.1.3", 1808 | "fast-levenshtein": "~2.0.6", 1809 | "levn": "~0.3.0", 1810 | "prelude-ls": "~1.1.2", 1811 | "type-check": "~0.3.2", 1812 | "word-wrap": "~1.2.3" 1813 | } 1814 | }, 1815 | "parse-json": { 1816 | "version": "2.2.0", 1817 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 1818 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 1819 | "dev": true, 1820 | "requires": { 1821 | "error-ex": "^1.2.0" 1822 | } 1823 | }, 1824 | "path-exists": { 1825 | "version": "2.1.0", 1826 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 1827 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 1828 | "dev": true, 1829 | "requires": { 1830 | "pinkie-promise": "^2.0.0" 1831 | } 1832 | }, 1833 | "path-is-absolute": { 1834 | "version": "1.0.1", 1835 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1836 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1837 | "dev": true 1838 | }, 1839 | "path-parse": { 1840 | "version": "1.0.7", 1841 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1842 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1843 | "dev": true 1844 | }, 1845 | "path-type": { 1846 | "version": "1.1.0", 1847 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", 1848 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", 1849 | "dev": true, 1850 | "requires": { 1851 | "graceful-fs": "^4.1.2", 1852 | "pify": "^2.0.0", 1853 | "pinkie-promise": "^2.0.0" 1854 | } 1855 | }, 1856 | "performance-now": { 1857 | "version": "2.1.0", 1858 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1859 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 1860 | "dev": true 1861 | }, 1862 | "pify": { 1863 | "version": "2.3.0", 1864 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1865 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1866 | "dev": true 1867 | }, 1868 | "pinkie": { 1869 | "version": "2.0.4", 1870 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1871 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", 1872 | "dev": true 1873 | }, 1874 | "pinkie-promise": { 1875 | "version": "2.0.1", 1876 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1877 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1878 | "dev": true, 1879 | "requires": { 1880 | "pinkie": "^2.0.0" 1881 | } 1882 | }, 1883 | "pkginfo": { 1884 | "version": "0.4.1", 1885 | "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", 1886 | "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=", 1887 | "dev": true 1888 | }, 1889 | "prelude-ls": { 1890 | "version": "1.1.2", 1891 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1892 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1893 | "dev": true 1894 | }, 1895 | "psl": { 1896 | "version": "1.8.0", 1897 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 1898 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", 1899 | "dev": true 1900 | }, 1901 | "punycode": { 1902 | "version": "2.1.1", 1903 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1904 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 1905 | "dev": true 1906 | }, 1907 | "pygmentize-bundled": { 1908 | "version": "2.1.1", 1909 | "resolved": "https://registry.npmjs.org/pygmentize-bundled/-/pygmentize-bundled-2.1.1.tgz", 1910 | "integrity": "sha1-Ygz8iMMMVYM5Z062fAnAavUBQVg=", 1911 | "dev": true, 1912 | "requires": { 1913 | "bl": "~0.4.1", 1914 | "mkdirp": "~0.3.5", 1915 | "readable-stream": "~1.0.17", 1916 | "through2": "~0.2.1" 1917 | }, 1918 | "dependencies": { 1919 | "mkdirp": { 1920 | "version": "0.3.5", 1921 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", 1922 | "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=", 1923 | "dev": true 1924 | } 1925 | } 1926 | }, 1927 | "qs": { 1928 | "version": "6.5.2", 1929 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1930 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 1931 | "dev": true 1932 | }, 1933 | "raw-body": { 1934 | "version": "1.1.7", 1935 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", 1936 | "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=", 1937 | "dev": true, 1938 | "requires": { 1939 | "bytes": "1", 1940 | "string_decoder": "0.10" 1941 | } 1942 | }, 1943 | "read-pkg": { 1944 | "version": "1.1.0", 1945 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", 1946 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", 1947 | "dev": true, 1948 | "requires": { 1949 | "load-json-file": "^1.0.0", 1950 | "normalize-package-data": "^2.3.2", 1951 | "path-type": "^1.0.0" 1952 | } 1953 | }, 1954 | "read-pkg-up": { 1955 | "version": "1.0.1", 1956 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", 1957 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", 1958 | "dev": true, 1959 | "requires": { 1960 | "find-up": "^1.0.0", 1961 | "read-pkg": "^1.0.0" 1962 | } 1963 | }, 1964 | "readable-stream": { 1965 | "version": "1.0.34", 1966 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 1967 | "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 1968 | "dev": true, 1969 | "requires": { 1970 | "core-util-is": "~1.0.0", 1971 | "inherits": "~2.0.1", 1972 | "isarray": "0.0.1", 1973 | "string_decoder": "~0.10.x" 1974 | } 1975 | }, 1976 | "redent": { 1977 | "version": "1.0.0", 1978 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", 1979 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", 1980 | "dev": true, 1981 | "requires": { 1982 | "indent-string": "^2.1.0", 1983 | "strip-indent": "^1.0.1" 1984 | } 1985 | }, 1986 | "repeating": { 1987 | "version": "2.0.1", 1988 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 1989 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", 1990 | "dev": true, 1991 | "requires": { 1992 | "is-finite": "^1.0.0" 1993 | } 1994 | }, 1995 | "request": { 1996 | "version": "2.88.2", 1997 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 1998 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 1999 | "dev": true, 2000 | "requires": { 2001 | "aws-sign2": "~0.7.0", 2002 | "aws4": "^1.8.0", 2003 | "caseless": "~0.12.0", 2004 | "combined-stream": "~1.0.6", 2005 | "extend": "~3.0.2", 2006 | "forever-agent": "~0.6.1", 2007 | "form-data": "~2.3.2", 2008 | "har-validator": "~5.1.3", 2009 | "http-signature": "~1.2.0", 2010 | "is-typedarray": "~1.0.0", 2011 | "isstream": "~0.1.2", 2012 | "json-stringify-safe": "~5.0.1", 2013 | "mime-types": "~2.1.19", 2014 | "oauth-sign": "~0.9.0", 2015 | "performance-now": "^2.1.0", 2016 | "qs": "~6.5.2", 2017 | "safe-buffer": "^5.1.2", 2018 | "tough-cookie": "~2.5.0", 2019 | "tunnel-agent": "^0.6.0", 2020 | "uuid": "^3.3.2" 2021 | } 2022 | }, 2023 | "resolve": { 2024 | "version": "1.20.0", 2025 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", 2026 | "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", 2027 | "dev": true, 2028 | "requires": { 2029 | "is-core-module": "^2.2.0", 2030 | "path-parse": "^1.0.6" 2031 | } 2032 | }, 2033 | "rimraf": { 2034 | "version": "2.6.3", 2035 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 2036 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 2037 | "dev": true, 2038 | "requires": { 2039 | "glob": "^7.1.3" 2040 | }, 2041 | "dependencies": { 2042 | "glob": { 2043 | "version": "7.1.7", 2044 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", 2045 | "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", 2046 | "dev": true, 2047 | "requires": { 2048 | "fs.realpath": "^1.0.0", 2049 | "inflight": "^1.0.4", 2050 | "inherits": "2", 2051 | "minimatch": "^3.0.4", 2052 | "once": "^1.3.0", 2053 | "path-is-absolute": "^1.0.0" 2054 | } 2055 | } 2056 | } 2057 | }, 2058 | "safe-buffer": { 2059 | "version": "5.2.1", 2060 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2061 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2062 | "dev": true 2063 | }, 2064 | "safe-json-parse": { 2065 | "version": "1.0.1", 2066 | "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", 2067 | "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=", 2068 | "dev": true 2069 | }, 2070 | "safecallback": { 2071 | "version": "1.0.1", 2072 | "resolved": "https://registry.npmjs.org/safecallback/-/safecallback-1.0.1.tgz", 2073 | "integrity": "sha1-B8fxK0qNmr8bj83bp4UusLi27UE=", 2074 | "dev": true 2075 | }, 2076 | "safefs": { 2077 | "version": "2.0.3", 2078 | "resolved": "https://registry.npmjs.org/safefs/-/safefs-2.0.3.tgz", 2079 | "integrity": "sha1-LbKy3kxBYdbbpmCf7gXsqwYsTeU=", 2080 | "dev": true 2081 | }, 2082 | "safer-buffer": { 2083 | "version": "2.1.2", 2084 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2085 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2086 | "dev": true 2087 | }, 2088 | "semver": { 2089 | "version": "5.7.1", 2090 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 2091 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 2092 | "dev": true 2093 | }, 2094 | "should": { 2095 | "version": "13.2.3", 2096 | "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", 2097 | "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", 2098 | "dev": true, 2099 | "requires": { 2100 | "should-equal": "^2.0.0", 2101 | "should-format": "^3.0.3", 2102 | "should-type": "^1.4.0", 2103 | "should-type-adaptors": "^1.0.1", 2104 | "should-util": "^1.0.0" 2105 | } 2106 | }, 2107 | "should-equal": { 2108 | "version": "2.0.0", 2109 | "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", 2110 | "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", 2111 | "dev": true, 2112 | "requires": { 2113 | "should-type": "^1.4.0" 2114 | } 2115 | }, 2116 | "should-format": { 2117 | "version": "3.0.3", 2118 | "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", 2119 | "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", 2120 | "dev": true, 2121 | "requires": { 2122 | "should-type": "^1.3.0", 2123 | "should-type-adaptors": "^1.0.1" 2124 | } 2125 | }, 2126 | "should-type": { 2127 | "version": "1.4.0", 2128 | "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", 2129 | "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", 2130 | "dev": true 2131 | }, 2132 | "should-type-adaptors": { 2133 | "version": "1.1.0", 2134 | "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", 2135 | "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", 2136 | "dev": true, 2137 | "requires": { 2138 | "should-type": "^1.3.0", 2139 | "should-util": "^1.0.0" 2140 | } 2141 | }, 2142 | "should-util": { 2143 | "version": "1.0.1", 2144 | "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", 2145 | "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", 2146 | "dev": true 2147 | }, 2148 | "sigmund": { 2149 | "version": "1.0.1", 2150 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", 2151 | "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", 2152 | "dev": true 2153 | }, 2154 | "signal-exit": { 2155 | "version": "3.0.3", 2156 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 2157 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", 2158 | "dev": true 2159 | }, 2160 | "source-map": { 2161 | "version": "0.2.0", 2162 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", 2163 | "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", 2164 | "dev": true, 2165 | "optional": true, 2166 | "requires": { 2167 | "amdefine": ">=0.0.4" 2168 | } 2169 | }, 2170 | "spdx-correct": { 2171 | "version": "3.1.1", 2172 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", 2173 | "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", 2174 | "dev": true, 2175 | "requires": { 2176 | "spdx-expression-parse": "^3.0.0", 2177 | "spdx-license-ids": "^3.0.0" 2178 | } 2179 | }, 2180 | "spdx-exceptions": { 2181 | "version": "2.3.0", 2182 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", 2183 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", 2184 | "dev": true 2185 | }, 2186 | "spdx-expression-parse": { 2187 | "version": "3.0.1", 2188 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 2189 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 2190 | "dev": true, 2191 | "requires": { 2192 | "spdx-exceptions": "^2.1.0", 2193 | "spdx-license-ids": "^3.0.0" 2194 | } 2195 | }, 2196 | "spdx-license-ids": { 2197 | "version": "3.0.9", 2198 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", 2199 | "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", 2200 | "dev": true 2201 | }, 2202 | "sprintf-js": { 2203 | "version": "1.0.3", 2204 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2205 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2206 | "dev": true 2207 | }, 2208 | "sshpk": { 2209 | "version": "1.16.1", 2210 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 2211 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 2212 | "dev": true, 2213 | "requires": { 2214 | "asn1": "~0.2.3", 2215 | "assert-plus": "^1.0.0", 2216 | "bcrypt-pbkdf": "^1.0.0", 2217 | "dashdash": "^1.12.0", 2218 | "ecc-jsbn": "~0.1.1", 2219 | "getpass": "^0.1.1", 2220 | "jsbn": "~0.1.0", 2221 | "safer-buffer": "^2.0.2", 2222 | "tweetnacl": "~0.14.0" 2223 | } 2224 | }, 2225 | "string-template": { 2226 | "version": "0.2.1", 2227 | "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", 2228 | "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", 2229 | "dev": true 2230 | }, 2231 | "string_decoder": { 2232 | "version": "0.10.31", 2233 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 2234 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 2235 | "dev": true 2236 | }, 2237 | "strip-bom": { 2238 | "version": "2.0.0", 2239 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 2240 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 2241 | "dev": true, 2242 | "requires": { 2243 | "is-utf8": "^0.2.0" 2244 | } 2245 | }, 2246 | "strip-indent": { 2247 | "version": "1.0.1", 2248 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", 2249 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", 2250 | "dev": true, 2251 | "requires": { 2252 | "get-stdin": "^4.0.1" 2253 | } 2254 | }, 2255 | "supports-color": { 2256 | "version": "5.5.0", 2257 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2258 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2259 | "dev": true, 2260 | "requires": { 2261 | "has-flag": "^3.0.0" 2262 | } 2263 | }, 2264 | "taskgroup": { 2265 | "version": "2.0.0", 2266 | "resolved": "https://registry.npmjs.org/taskgroup/-/taskgroup-2.0.0.tgz", 2267 | "integrity": "sha1-GElEpCtWhKrXURiaUmPAMPYXREY=", 2268 | "dev": true, 2269 | "requires": { 2270 | "ambi": "~2.0.0", 2271 | "typechecker": "~2.0.1" 2272 | } 2273 | }, 2274 | "through2": { 2275 | "version": "0.2.3", 2276 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", 2277 | "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", 2278 | "dev": true, 2279 | "requires": { 2280 | "readable-stream": "~1.1.9", 2281 | "xtend": "~2.1.1" 2282 | }, 2283 | "dependencies": { 2284 | "readable-stream": { 2285 | "version": "1.1.14", 2286 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 2287 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 2288 | "dev": true, 2289 | "requires": { 2290 | "core-util-is": "~1.0.0", 2291 | "inherits": "~2.0.1", 2292 | "isarray": "0.0.1", 2293 | "string_decoder": "~0.10.x" 2294 | } 2295 | } 2296 | } 2297 | }, 2298 | "tiny-lr": { 2299 | "version": "1.1.1", 2300 | "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", 2301 | "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==", 2302 | "dev": true, 2303 | "requires": { 2304 | "body": "^5.1.0", 2305 | "debug": "^3.1.0", 2306 | "faye-websocket": "~0.10.0", 2307 | "livereload-js": "^2.3.0", 2308 | "object-assign": "^4.1.0", 2309 | "qs": "^6.4.0" 2310 | } 2311 | }, 2312 | "tough-cookie": { 2313 | "version": "2.5.0", 2314 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 2315 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 2316 | "dev": true, 2317 | "requires": { 2318 | "psl": "^1.1.28", 2319 | "punycode": "^2.1.1" 2320 | } 2321 | }, 2322 | "trim-newlines": { 2323 | "version": "1.0.0", 2324 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", 2325 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", 2326 | "dev": true 2327 | }, 2328 | "tunnel-agent": { 2329 | "version": "0.6.0", 2330 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2331 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 2332 | "dev": true, 2333 | "requires": { 2334 | "safe-buffer": "^5.0.1" 2335 | } 2336 | }, 2337 | "tweetnacl": { 2338 | "version": "0.14.5", 2339 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2340 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 2341 | "dev": true 2342 | }, 2343 | "type-check": { 2344 | "version": "0.3.2", 2345 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2346 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2347 | "dev": true, 2348 | "requires": { 2349 | "prelude-ls": "~1.1.2" 2350 | } 2351 | }, 2352 | "typechecker": { 2353 | "version": "2.0.8", 2354 | "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-2.0.8.tgz", 2355 | "integrity": "sha1-6D2oS7ZMWEzLNFg4V2xAsDN9uC4=", 2356 | "dev": true 2357 | }, 2358 | "uglify-js": { 2359 | "version": "3.13.10", 2360 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.10.tgz", 2361 | "integrity": "sha512-57H3ACYFXeo1IaZ1w02sfA71wI60MGco/IQFjOqK+WtKoprh7Go2/yvd2HPtoJILO2Or84ncLccI4xoHMTSbGg==", 2362 | "dev": true, 2363 | "optional": true 2364 | }, 2365 | "underscore": { 2366 | "version": "1.7.0", 2367 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", 2368 | "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", 2369 | "dev": true 2370 | }, 2371 | "underscore.string": { 2372 | "version": "3.3.5", 2373 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", 2374 | "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", 2375 | "dev": true, 2376 | "requires": { 2377 | "sprintf-js": "^1.0.3", 2378 | "util-deprecate": "^1.0.2" 2379 | } 2380 | }, 2381 | "uri-js": { 2382 | "version": "4.4.1", 2383 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2384 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2385 | "dev": true, 2386 | "requires": { 2387 | "punycode": "^2.1.0" 2388 | } 2389 | }, 2390 | "uri-path": { 2391 | "version": "1.0.0", 2392 | "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", 2393 | "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=", 2394 | "dev": true 2395 | }, 2396 | "util-deprecate": { 2397 | "version": "1.0.2", 2398 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2399 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2400 | "dev": true 2401 | }, 2402 | "uuid": { 2403 | "version": "3.4.0", 2404 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 2405 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", 2406 | "dev": true 2407 | }, 2408 | "validate-npm-package-license": { 2409 | "version": "3.0.4", 2410 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 2411 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 2412 | "dev": true, 2413 | "requires": { 2414 | "spdx-correct": "^3.0.0", 2415 | "spdx-expression-parse": "^3.0.0" 2416 | } 2417 | }, 2418 | "verror": { 2419 | "version": "1.10.0", 2420 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 2421 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 2422 | "dev": true, 2423 | "requires": { 2424 | "assert-plus": "^1.0.0", 2425 | "core-util-is": "1.0.2", 2426 | "extsprintf": "^1.2.0" 2427 | } 2428 | }, 2429 | "watchr": { 2430 | "version": "2.3.10", 2431 | "resolved": "https://registry.npmjs.org/watchr/-/watchr-2.3.10.tgz", 2432 | "integrity": "sha1-L+CvU3BxyuandtRSM1b486Iwt84=", 2433 | "dev": true, 2434 | "requires": { 2435 | "bal-util": "~1.18.0" 2436 | } 2437 | }, 2438 | "websocket-driver": { 2439 | "version": "0.7.4", 2440 | "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", 2441 | "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", 2442 | "dev": true, 2443 | "requires": { 2444 | "http-parser-js": ">=0.5.1", 2445 | "safe-buffer": ">=5.1.0", 2446 | "websocket-extensions": ">=0.1.1" 2447 | } 2448 | }, 2449 | "websocket-extensions": { 2450 | "version": "0.1.4", 2451 | "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", 2452 | "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", 2453 | "dev": true 2454 | }, 2455 | "which": { 2456 | "version": "1.3.1", 2457 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2458 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2459 | "dev": true, 2460 | "requires": { 2461 | "isexe": "^2.0.0" 2462 | } 2463 | }, 2464 | "word-wrap": { 2465 | "version": "1.2.3", 2466 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 2467 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 2468 | "dev": true 2469 | }, 2470 | "wordwrap": { 2471 | "version": "1.0.0", 2472 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 2473 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 2474 | "dev": true 2475 | }, 2476 | "wrappy": { 2477 | "version": "1.0.2", 2478 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2479 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2480 | "dev": true 2481 | }, 2482 | "xtend": { 2483 | "version": "2.1.2", 2484 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", 2485 | "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", 2486 | "dev": true, 2487 | "requires": { 2488 | "object-keys": "~0.4.0" 2489 | } 2490 | } 2491 | } 2492 | } 2493 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "systemhealth", 3 | "version": "2.0.0", 4 | "description": "Node module to run simple custom checks for your machine or it's connections. It will use redis-heartbeat to send the current state to redis.", 5 | "keywords": [ 6 | "systemhealth", 7 | "system", 8 | "health", 9 | "monitor", 10 | "redis", 11 | "status", 12 | "heartbeat" 13 | ], 14 | "homepage": "https://github.com/mpneuried/systemhealth", 15 | "bugs": "https://github.com/mpneuried/systemhealth/issues", 16 | "author": { 17 | "name": "mpneuried", 18 | "email": "", 19 | "url": "https://github.com/systemhealth" 20 | }, 21 | "main": "./index.js", 22 | "engines": { 23 | "node": ">= 6.0.0" 24 | }, 25 | "repository": { 26 | "type": "git", 27 | "url": "https://github.com/mpneuried/systemhealth.git" 28 | }, 29 | "scripts": { 30 | "test": "COFFEECOV_INIT_ALL=false mocha --compilers coffee:coffeescript/register --require coffee-coverage/register-istanbul _src/test/**.coffee -R spec", 31 | "test-compiled": "mocha test/**.js -R spec", 32 | "test-builded": "grunt build test", 33 | "build": "grunt build" 34 | }, 35 | "license": "MIT", 36 | "dependencies": { 37 | "async": "3.2.x", 38 | "lodash": "4.17.x", 39 | "mpbasic": "0.0.x" 40 | }, 41 | "devDependencies": { 42 | "coffee-coverage": "3.x", 43 | "coffeescript": "2.x", 44 | "coveralls": "3.0.x", 45 | "grunt": "1.0.x", 46 | "grunt-contrib-clean": "1.1.x", 47 | "grunt-contrib-coffee": "2.x", 48 | "grunt-contrib-watch": "1.x", 49 | "grunt-docker": "0.0.x", 50 | "grunt-include-replace": "5.x", 51 | "grunt-mocha-cli": "4.x", 52 | "istanbul": "0.4.x", 53 | "mocha": "5.1.x", 54 | "should": "13.x" 55 | } 56 | } 57 | --------------------------------------------------------------------------------