From 91efb01f175f9a09136c85e4e88658a3dd75d0eb Mon Sep 17 00:00:00 2001 From: Daniyil Vasylenko Date: Sat, 13 May 2017 03:52:28 +0300 Subject: [PATCH 1/6] Logentries log chain implementation --- .eslintignore | 17 +++ .eslintrc | 16 +++ .gitignore | 39 +++++++ .npmignore | 11 ++ LICENSE | 21 ++++ Makefile | 32 ++++++ package.json | 20 +++- sonar-project.properties | 10 ++ src/index.js | 119 +++++++++++++++++++++ test/chain-spec.js | 97 +++++++++++++++++ test/logentries-spec.js | 226 +++++++++++++++++++++++++++++++++++++++ 11 files changed, 607 insertions(+), 1 deletion(-) create mode 100644 .eslintignore create mode 100644 .eslintrc create mode 100644 .gitignore create mode 100644 .npmignore create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 sonar-project.properties create mode 100644 src/index.js create mode 100644 test/chain-spec.js create mode 100644 test/logentries-spec.js diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..42132b8 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,17 @@ +/bin/** +/build/** +/coverage/** +/docs/** +/jsdoc/** +/templates/** +/tests/bench/** +/tests/fixtures/** +/tests/performance/** +/tmp/** +/public/** +/node_modules/** +/lib-cov/** +/.grunt/** +/.sonar/** +/logs/** +/.idea/** diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..b973ff7 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,16 @@ +{ + "extends": "airbnb", + "env": { + "node":true, + "mocha":true, + "es6": true, + "mongo":true + }, + "rules": { + // disable requiring trailing commas + "comma-dangle": 0, + "max-len": ["error", {"code": 120, "ignoreComments": true, "ignoreUrls": true}], + "no-restricted-syntax": 0, + "class-methods-use-this": 0 + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9d9829a --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +/examples + +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules +jspm_packages + +# Optional npm cache directory +.npm + +# Optional REPL history +.node_repl_history diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..b334896 --- /dev/null +++ b/.npmignore @@ -0,0 +1,11 @@ +.git +node_modules +coverage +test +.sonar +.gitignore +.jshintignore +.jshintrc +.npmignore +Makefile +sonar-project.properties diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..543a524 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 Dial Once + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5e5c55b --- /dev/null +++ b/Makefile @@ -0,0 +1,32 @@ +.PHONY: test + +deps: + npm i + +lint: + node_modules/.bin/eslint . + +test: + make lint + make cover + +init: + sed -i 's/{service-name}/node-logtify-logentries/g' package.json + sed -i 's/{service-name}/node-logtify-logentries/g' README.md + sed -i 's/{service-name}/node-logtify-logentries/g' sonar-project.properties + +cover: + node_modules/.bin/istanbul cover node_modules/.bin/_mocha -- test --recursive --timeout=3000 + +sonar: + sed '/sonar.projectVersion/d' ./sonar-project.properties > tmp && mv tmp sonar-project.properties + echo sonar.projectVersion=`cat package.json | python -c "import json,sys;obj=json.load(sys.stdin);print obj['version'];"` >> sonar-project.properties + wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-2.8.zip + unzip sonar-scanner-2.8.zip +ifdef CI_PULL_REQUEST + @sonar-scanner-2.8/bin/sonar-runner -e -Dsonar.analysis.mode=preview -Dsonar.github.pullRequest=${shell basename $(CI_PULL_REQUEST)} -Dsonar.github.repository=$(REPO_SLUG) -Dsonar.github.oauth=$(GITHUB_TOKEN) -Dsonar.login=$(SONAR_LOGIN) -Dsonar.password=$(SONAR_PASS) -Dsonar.host.url=$(SONAR_HOST_URL) +endif +ifeq ($(CIRCLE_BRANCH),develop) + @sonar-scanner-2.8/bin/sonar-runner -e -Dsonar.analysis.mode=publish -Dsonar.host.url=$(SONAR_HOST_URL) -Dsonar.login=$(SONAR_LOGIN) -Dsonar.password=$(SONAR_PASS) +endif + rm -rf sonar-scanner-2.8 sonar-scanner-2.8.zip diff --git a/package.json b/package.json index 4ea293d..c640a7c 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,9 @@ "version": "0.0.0", "description": "Logentries chain link for logtify logger", "main": "src/index.js", + "directories": { + "test": "test" + }, "scripts": { "test": "make test" }, @@ -15,5 +18,20 @@ "bugs": { "url": "https://github.com/dial-once/node-logtify-logentries/issues" }, - "homepage": "https://github.com/dial-once/node-logtify-logentries#readme" + "homepage": "https://github.com/dial-once/node-logtify-logentries#readme", + "dependencies": { + "le_node": "^1.7.0", + "winston": "^2.3.1" + }, + "devDependencies": { + "eslint": "^3.16.1", + "eslint-config-airbnb": "^13.0.0", + "eslint-plugin-import": "^2.2.0", + "eslint-plugin-jsx-a11y": "^2.2.3", + "eslint-plugin-react": "^6.8.0", + "istanbul": "^0.4.5", + "logtify": "file:///Users/macbook/Programming/JS/node-logtify", + "mocha": "^3.2.0", + "sinon": "^1.17.6" + } } diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 0000000..d77c2b3 --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,10 @@ +sonar.projectKey=node-logtify-logentries +sonar.projectName=node-logtify-logentries + +sonar.sources=src +sonar.tests=test +sonar.language=js + +sonar.dynamicAnalysis=reuseReports +sonar.javascript.jstest.reportsPath=coverage +sonar.javascript.lcov.reportPath=coverage/lcov.info diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..3ce353c --- /dev/null +++ b/src/index.js @@ -0,0 +1,119 @@ +require('le_node'); +const winston = require('winston'); + +/** + @class ConsoleLink + A Logentries logger chain link + @implements ChainLink @class - a basic interface for each link based on the Chain of Resp Pattern + This chain link is responsible for logging a message to the Logentries endpoint + + Has the following configurations (either env var or settings param): + - LOGENTRIES_LOGGING {'true'|'false'} - switches on / off the use of this chain link + - MIN_LOG_LEVEL_LOGENTRIES = {'silly'|'verbose'|'debug'|'info'|'warn'|'error'} - min log level of a message to log + This config has a higher priority than a global DEFAULT_LOG_LEVEl config + @see ChainLink @class for info on the log level priorities + If a message's level is >= than a MIN_LOG_LEVEL_CONSOLE - it will be notified. Otherwise - skipped + + Environment variables have a higher priority over a settings object parameters +**/ +class Logentries { + /** + @constructor + Construct an instance of a ConsoleLink @class + @param configs {Object} - LoggerChain configuration object + @param utility {Object} - Logtify common rules object + **/ + constructor(configs, utility) { + this.settings = configs || {}; + this.utility = utility; + if (this.settings.LOGS_TOKEN) { + this.token = this.settings.LOGS_TOKEN; + this.winston = new winston.Logger(); + this.name = 'LOGENTRIES'; + this.loggers = { + [this.token]: this.winston.add(winston.transports.Logentries, { token: this.token }) + }; + this.winston.log('error', 'Hello world'); + } else { + console.warn('Logentries logging was not initialized due to a missing token'); + } + } + + /** + @function next + @param message {Object} - a message package object + Envoke the handle @function of the next chain link if provided + **/ + next(message) { + if (this.nextLink) { + this.nextLink.handle(message); + } + } + + /** + @function link + Links current chain link to a next chain link + @param nextLink {Object} - an optional next link for current chain link + **/ + link(nextLink) { + this.nextLink = nextLink; + } + + /** + @function isReady + Check if a chain link is configured properly and is ready to be used + @return {boolean} + **/ + isReady() { + return !!this.winston; + } + + /** + @function isEnabled + Check if a chain link will be used + Depends on configuration env variables / settings object parameters + Checks LOGENTRIES_LOGGING env / settings object param + @return {boolean} - if this chain link is switched on / off + **/ + isEnabled() { + return ['true', 'false'].includes(process.env.LOGENTRIES_LOGGING) ? + process.env.LOGENTRIES_LOGGING === 'true' : !!this.settings.LOGENTRIES_LOGGING; + } + + /** + @function handle + Process a message and log it if the chain link is switched on and message's log level is >= than MIN_LOG_LEVEL + Finally, pass the message to the next chain link if any + @param message {Object} - message package object + @see LoggerChain message package object structure description + + This function is NOT ALLOWED to modify the message + This function HAS to invoke the next() @function and pass the message further along the chain + This function HAS to check message level priority and skip if lower than MIN_LOG_LEVEL + **/ + handle(message) { + if (this.isReady() && this.isEnabled() && message) { + const content = message.payload; + const logLevels = this.utility.logLevels; + const messageLevel = logLevels.has(content.level) ? content.level : logLevels.get('default'); + const minLogLevel = this.utility.getMinLogLevel(this.settings, this.name); + if (logLevels.get(messageLevel) >= logLevels.get(minLogLevel)) { + const prefix = message.getPrefix(this.settings); + this.winston.log(messageLevel, `${prefix}${content.text}`, content.meta); + } + } + this.next(message); + } +} + +module.exports = (config) => { + const configs = Object.assign({ + LOGS_TOKEN: process.env.LOGS_TOKEN || process.env.LOGENTRIES_TOKEN + }, config); + return { + class: Logentries, + config: configs + }; +}; + +module.exports.LogentriesChainLink = Logentries; diff --git a/test/chain-spec.js b/test/chain-spec.js new file mode 100644 index 0000000..beac7f2 --- /dev/null +++ b/test/chain-spec.js @@ -0,0 +1,97 @@ +const logtify = require('logtify'); +const sinon = require('sinon'); +const assert = require('assert'); +const Logentries = require('../src/index'); + +describe('Logentries inside chain', () => { + it('should be able to insert into a chain without a conflict [manual push] [no token] [switched off]', () => { + const { chain, logger } = logtify({}); + const LogentriesLinkClass = Logentries().class; + const logentriesChainLink = new LogentriesLinkClass({}, new chain.Utility()); + assert.equal(logentriesChainLink.winston, undefined); + const spy = sinon.spy(logentriesChainLink, 'handle'); + const index = chain.push(logentriesChainLink); + assert.equal(index, chain.chainLinks.length - 1); + chain.link(); + logger.info('Hello world'); + assert(spy.called); + }); + + it('should be able to insert into a chain without a conflict [manual push] [with token] [switched off]', () => { + const { chain } = logtify({}); + const logentriesPackage = Logentries({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000' }); + const logentriesLinkConfig = logentriesPackage.config; + const LogentriesLinkClass = logentriesPackage.class; + const logentriesChainLink = new LogentriesLinkClass(logentriesLinkConfig, new chain.Utility()); + assert.notEqual(logentriesChainLink.winston, undefined); + const spy = sinon.spy(logentriesChainLink, 'handle'); + const index = chain.push(logentriesChainLink); + assert.equal(index, chain.chainLinks.length - 1); + chain.link(); + chain.log(null, 'Hello world'); + assert(spy.called); + }); + + it('should be able to insert into a chain without a conflict [manual push] [with token] [switched on]', () => { + const { chain } = logtify({}); + const logentriesPackage = Logentries({ + LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', + LOGENTRIES_LOGGING: true + }); + const logentriesLinkConfig = logentriesPackage.config; + const LogentriesLinkClass = logentriesPackage.class; + const logentriesChainLink = new LogentriesLinkClass(logentriesLinkConfig, new chain.Utility()); + assert.notEqual(logentriesChainLink.winston, undefined); + const spy = sinon.spy(logentriesChainLink, 'handle'); + const index = chain.push(logentriesChainLink); + assert.equal(index, chain.chainLinks.length - 1); + chain.link(); + chain.log(null, 'Hello world'); + assert(spy.called); + }); + + it('should be able to insert into a chain without a conflict [auto push v2] [with token] [switched on]', () => { + const { chain } = logtify({ + chainLinks: [ + Logentries({ + LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', + LOGENTRIES_LOGGING: true + }) + ] + }); + assert.equal(chain.chainLinks.length, 2); + const logentriesChainLink = chain.chainEnd; + assert.notEqual(logentriesChainLink.winston, undefined); + const spy = sinon.spy(logentriesChainLink, 'handle'); + chain.log(null, 'Hello world'); + assert(spy.called); + }); + + it('should be able to insert into a chain without a conflict [auto push v1] [with token] [switched on]', () => { + const { chain } = logtify({ + LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', + LOGENTRIES_LOGGING: true, + chainLinks: [Logentries().class] + }); + assert.equal(chain.chainLinks.length, 2); + const logentriesChainLink = chain.chainEnd; + assert.notEqual(logentriesChainLink.winston, undefined); + const spy = sinon.spy(logentriesChainLink, 'handle'); + chain.log(null, 'Hello world'); + assert(spy.called); + }); + + it('should be able to insert into a chain without a conflict [auto push v1] [with token] [switched on]', () => { + const { chain } = logtify({ + LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', + LOGENTRIES_LOGGING: true, + chainLinks: [Logentries.LogentriesChainLink] + }); + assert.equal(chain.chainLinks.length, 2); + const logentriesChainLink = chain.chainEnd; + assert.notEqual(logentriesChainLink.winston, undefined); + const spy = sinon.spy(logentriesChainLink, 'handle'); + chain.log(null, 'Hello world'); + assert(spy.called); + }); +}); diff --git a/test/logentries-spec.js b/test/logentries-spec.js new file mode 100644 index 0000000..a259c0a --- /dev/null +++ b/test/logentries-spec.js @@ -0,0 +1,226 @@ +const assert = require('assert'); +const sinon = require('sinon'); +const Logentries = require('../src/index'); +const { chain } = require('logtify')(); + +const Message = chain.Message; +const ChainLinkUtility = chain.Utility; + +describe('Logentries chain link ', () => { + before(() => { + delete process.env.LOGENTRIES_LOGGING; + delete process.env.MIN_LOG_LEVEL; + delete process.env.LOG_TIMESTAMP; + delete process.env.LOG_ENVIRONMENT; + delete process.env.LOG_LEVEL; + delete process.env.LOG_REQID; + }); + + beforeEach(() => { + const logentriesPackage = Logentries(); + this.LogentriesLink = logentriesPackage.class; + }); + + afterEach(() => { + delete process.env.LOGENTRIES_LOGGING; + delete process.env.MIN_LOG_LEVEL; + delete process.env.MIN_LOG_LEVEL_LOGENTRIES; + }); + + it('should return configs and a constructor', () => { + const logentriesPackage = Logentries(); + assert.equal(typeof logentriesPackage, 'object'); + assert.deepEqual(logentriesPackage.config, { LOGS_TOKEN: undefined }); + assert.equal(typeof logentriesPackage.class, 'function'); + }); + + it('should return given configs and a constructor', () => { + const logentriesPackage = Logentries({ LOGS_TOKEN: '123' }); + assert.equal(typeof logentriesPackage, 'object'); + assert.deepEqual(logentriesPackage.config, { LOGS_TOKEN: '123' }); + assert.equal(typeof logentriesPackage.class, 'function'); + }); + + it('should not throw if no settings are given', () => { + const logentries = new this.LogentriesLink({}, new ChainLinkUtility()); + assert.equal(logentries.winston, undefined); + }); + + it('should expose its main functions', () => { + const logentries = new this.LogentriesLink({}, new ChainLinkUtility()); + assert.equal(typeof logentries, 'object'); + assert.equal(typeof logentries.next, 'function'); + assert.equal(typeof logentries.isReady, 'function'); + assert.equal(typeof logentries.link, 'function'); + assert.equal(typeof logentries.isReady, 'function'); + assert.equal(typeof logentries.isEnabled, 'function'); + assert.equal(typeof logentries.handle, 'function'); + assert(logentries.utility); + assert.equal(typeof logentries.utility.getMinLogLevel, 'function'); + assert(logentries.utility.logLevels); + assert(logentries.utility.logLevels instanceof Map); + }); + + it('should print out a warning if no token provided', () => { + const spy = sinon.spy(console, 'warn'); + const logentries = new this.LogentriesLink({}, new ChainLinkUtility()); + assert(spy.calledWith('Logentries logging was not initialized due to a missing token')); + assert.equal(logentries.winston, undefined); + }); + + it('should initialize with a token', () => { + const logentries = new this.LogentriesLink( + { LOGS_TOKEN: '00000000-0000-0000-0000-000000000000' }, + new ChainLinkUtility() + ); + assert.notEqual(logentries.winston, undefined); + }); + + it('should return true/false if initialized/not initialized', () => { + const logentries = new this.LogentriesLink({}, new ChainLinkUtility()); + assert.equal(logentries.isReady(), false); + }); + + it('should indicate if it is switched on/off [settings]', () => { + let logentries = new this.LogentriesLink({ LOGENTRIES_LOGGING: true }, new ChainLinkUtility()); + assert.equal(logentries.isEnabled(), true); + logentries = new this.LogentriesLink({ LOGENTRIES_LOGGING: false }, new ChainLinkUtility()); + assert.equal(logentries.isEnabled(), false); + logentries = new this.LogentriesLink(null, new ChainLinkUtility()); + assert.equal(logentries.isEnabled(), false); + }); + + it('should indicate if it is switched on/off [envs]', () => { + const logentries = new this.LogentriesLink(null, new ChainLinkUtility()); + assert.equal(logentries.isEnabled(), false); + process.env.LOGENTRIES_LOGGING = true; + assert.equal(logentries.isEnabled(), true); + process.env.LOGENTRIES_LOGGING = false; + assert.equal(logentries.isEnabled(), false); + }); + + it('should indicate if it is switched on/off [envs should have more privilege]', () => { + const logentries = new this.LogentriesLink({ LOGENTRIES_LOGGING: true }, new ChainLinkUtility()); + assert.equal(logentries.isEnabled(), true); + process.env.LOGENTRIES_LOGGING = false; + assert.equal(logentries.isEnabled(), false); + process.env.LOGENTRIES_LOGGING = undefined; + assert.equal(logentries.isEnabled(), true); + }); + + it('should not break down if null is notified', () => { + const logentries = new this.LogentriesLink({ + LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', + LOGENTRIES_LOGGING: true + }, new ChainLinkUtility()); + logentries.handle(null); + }); + + it('should log message if LOGENTRIES_LOGGING = true', () => { + const logentries = new this.LogentriesLink({ + LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', + LOGENTRIES_LOGGING: true + }, new ChainLinkUtility()); + const spy = sinon.spy(logentries.winston.log); + logentries.winston.log = spy; + const message = new Message(); + logentries.handle(message); + assert(spy.called); + }); + + it('should not log message if LOGENTRIES_LOGGING = false', () => { + const logentries = new this.LogentriesLink({ + LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', + LOGENTRIES_LOGGING: false + }, new ChainLinkUtility()); + const spy = sinon.spy(logentries.winston.log); + logentries.winston.log = spy; + const message = new Message(); + logentries.handle(message); + assert(!spy.called); + }); + + it('should not log if message level < MIN_LOG_LEVEL [settings]', () => { + const logentries = new this.LogentriesLink({ + LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', + LOGENTRIES_LOGGING: true, + MIN_LOG_LEVEL: 'error' + }, new ChainLinkUtility()); + const spy = sinon.spy(logentries.winston.log); + logentries.winston.log = spy; + const message = new Message(); + logentries.handle(message); + assert(!spy.called); + }); + + it('should not log if message level < MIN_LOG_LEVEL [envs]', () => { + const logentries = new this.LogentriesLink({ + LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', + LOGENTRIES_LOGGING: true + }, new ChainLinkUtility()); + const spy = sinon.spy(logentries.winston.log); + logentries.winston.log = spy; + const message = new Message(); + process.env.MIN_LOG_LEVEL = 'error'; + logentries.handle(message); + assert(!spy.called); + }); + + it('should not log if message level >= MIN_LOG_LEVEL_LOGENTRIES but < MIN_LOG_LEVEL [envs]', () => { + const logentries = new this.LogentriesLink({ + LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', + LOGENTRIES_LOGGING: true + }, new ChainLinkUtility()); + const spy = sinon.spy(logentries.winston.log); + logentries.winston.log = spy; + const message = new Message('warn'); + process.env.MIN_LOG_LEVEL = 'error'; + process.env.MIN_LOG_LEVEL_LOGENTRIES = 'warn'; + logentries.handle(message); + assert(spy.called); + }); + + it('should log if message level = MIN_LOG_LEVEL [envs]', () => { + const logentries = new this.LogentriesLink({ + LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', + LOGENTRIES_LOGGING: true + }, new ChainLinkUtility()); + const spy = sinon.spy(logentries.winston.log); + logentries.winston.log = spy; + const message = new Message('error'); + process.env.MIN_LOG_LEVEL = 'error'; + logentries.handle(message); + assert(spy.called); + }); + + it('should log if message level > MIN_LOG_LEVEL [envs]', () => { + const logentries = new this.LogentriesLink({ + LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', + LOGENTRIES_LOGGING: true + }, new ChainLinkUtility()); + const spy = sinon.spy(logentries.winston.log); + logentries.winston.log = spy; + const message = new Message('error'); + process.env.MIN_LOG_LEVEL = 'warn'; + logentries.handle(message); + assert(spy.called); + }); + + it('should not throw if next link does not exist', () => { + const chainLink = new this.LogentriesLink(); + chainLink.next(); + }); + + it('should link a new chainLink', () => { + const chainLink = new this.LogentriesLink(); + const spy = sinon.spy(sinon.stub()); + const mock = { + handle: spy + }; + assert.equal(chainLink.nextLink, null); + chainLink.link(mock); + assert.equal(typeof chainLink.nextLink, 'object'); + chainLink.next(); + assert(spy.called); + }); +}); From a1634528fe19ba3c15ae89e95fc1ac9828d6181c Mon Sep 17 00:00:00 2001 From: Daniyil Vasylenko Date: Tue, 16 May 2017 16:44:12 +0300 Subject: [PATCH 2/6] Add readme --- README.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ src/index.js | 1 - 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..12a6b14 --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +# node-logtify-logentries +Logentries chain link for [logtify](https://github.com/dial-once/node-logtify) logger + +## Installation +``` +npm i -S logtify-logentries +``` + +## Usage +When requiring a [logtify](https://github.com/dial-once/node-logtify) module, include it's chainLink into the chain + +**Variant 1** (Settings passed as global logger settings:): +```js +const { LogentriesChainLink } = require('logtify-logentries'); +const { chain, logger } = require('logtify')({ + LOGS_TOKEN: 'YOUR_LOGENTRIES_TOKEN', + chainLinks: [ LogentriesChainLink ] +}); +``` + +**Variant 2** (Settings passed into a chain link wrapper): +```js +const Logentries = require('logtify-logentries'); +const { chain, logger } = require('logtify')({ + chainLinks: [ Logentries({ LOGS_TOKEN: 'YOUR_LOGENTRIES_TOKEN' })] +}); + +logger.log('error', new Error('Test error')); +logger.info('Hello world!'); +``` +The chainLink will make sure that a message will be sent to Logentries if: +* ``message.level >= 'MIN_LOG_LEVEL_LOGENTRIES' || 'MIN_LOG_LEVEL'`` +* ``process.env.LOGENTRIES_LOGGING === 'true' || settings.LOGENTRIES_LOGGING === true`` + +## Configuration +**Environment variables**: +* ``process.env.LOGENTRIES_LOGGING = 'true|false'`` - Switching on / off the chain link +* ``process.env.LOGS_TOKEN = 'TOKEN'`` - your Logentries token +* ``process.env.MIN_LOG_LEVEL_LOGENTRIES = 'silly|verbose|info|warn|error'`` + +**Settings**: +```js +{ + LOGENTRIES_LOGGING: true|false, + LOGS_TOKEN: 'YOUR_TOKEN', + MIN_LOG_LEVEL_LOGENTRIES: 'silly|verbose|info|warn|error' +} +``` diff --git a/src/index.js b/src/index.js index 3ce353c..9061812 100644 --- a/src/index.js +++ b/src/index.js @@ -33,7 +33,6 @@ class Logentries { this.loggers = { [this.token]: this.winston.add(winston.transports.Logentries, { token: this.token }) }; - this.winston.log('error', 'Hello world'); } else { console.warn('Logentries logging was not initialized due to a missing token'); } From 611692f99bf3c7145ffcfd343fb1c6f0d52b4487 Mon Sep 17 00:00:00 2001 From: Daniyil Vasylenko Date: Fri, 26 May 2017 16:17:25 +0300 Subject: [PATCH 3/6] Mock logtify instead of a dependency --- Makefile | 7 +-- README.md | 16 ++++--- package.json | 3 +- sonar-project.properties | 4 +- src/index.js | 10 +++-- test/chain-spec.js | 97 ---------------------------------------- test/logentries-spec.js | 6 +-- test/mocks/message.js | 31 +++++++++++++ test/mocks/utility.js | 21 +++++++++ 9 files changed, 73 insertions(+), 122 deletions(-) delete mode 100644 test/chain-spec.js create mode 100644 test/mocks/message.js create mode 100644 test/mocks/utility.js diff --git a/Makefile b/Makefile index 5e5c55b..0b1ee22 100644 --- a/Makefile +++ b/Makefile @@ -10,13 +10,8 @@ test: make lint make cover -init: - sed -i 's/{service-name}/node-logtify-logentries/g' package.json - sed -i 's/{service-name}/node-logtify-logentries/g' README.md - sed -i 's/{service-name}/node-logtify-logentries/g' sonar-project.properties - cover: - node_modules/.bin/istanbul cover node_modules/.bin/_mocha -- test --recursive --timeout=3000 + node_modules/.bin/istanbul cover node_modules/.bin/_mocha -- test --recursive --timeout=10000 sonar: sed '/sonar.projectVersion/d' ./sonar-project.properties > tmp && mv tmp sonar-project.properties diff --git a/README.md b/README.md index 12a6b14..b622f09 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ -# node-logtify-logentries +# logtify-logentries +[![CircleCI](https://circleci.com/gh/dial-once/node-logtify-logentries.svg?style=svg)](https://circleci.com/gh/dial-once/node-logtify-logentries) + Logentries chain link for [logtify](https://github.com/dial-once/node-logtify) logger ## Installation ``` -npm i -S logtify-logentries +npm i -S @dialonce/logtify-logentries ``` ## Usage @@ -11,8 +13,8 @@ When requiring a [logtify](https://github.com/dial-once/node-logtify) module, in **Variant 1** (Settings passed as global logger settings:): ```js -const { LogentriesChainLink } = require('logtify-logentries'); -const { chain, logger } = require('logtify')({ +const { LogentriesChainLink } = require('@dialonce/logtify-logentries'); +const { chain, logger } = require('@dialonce/logtify')({ LOGS_TOKEN: 'YOUR_LOGENTRIES_TOKEN', chainLinks: [ LogentriesChainLink ] }); @@ -20,8 +22,8 @@ const { chain, logger } = require('logtify')({ **Variant 2** (Settings passed into a chain link wrapper): ```js -const Logentries = require('logtify-logentries'); -const { chain, logger } = require('logtify')({ +const Logentries = require('@dialonce/logtify-logentries'); +const { chain, logger } = require('@dialonce/logtify')({ chainLinks: [ Logentries({ LOGS_TOKEN: 'YOUR_LOGENTRIES_TOKEN' })] }); @@ -42,7 +44,7 @@ The chainLink will make sure that a message will be sent to Logentries if: ```js { LOGENTRIES_LOGGING: true|false, - LOGS_TOKEN: 'YOUR_TOKEN', + LOGS_TOKEN: 'YOUR_LOGENTRIES_TOKEN', MIN_LOG_LEVEL_LOGENTRIES: 'silly|verbose|info|warn|error' } ``` diff --git a/package.json b/package.json index c640a7c..10802ee 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "logtify-logentries", + "name": "@dialonce/logtify-logentries", "version": "0.0.0", "description": "Logentries chain link for logtify logger", "main": "src/index.js", @@ -30,7 +30,6 @@ "eslint-plugin-jsx-a11y": "^2.2.3", "eslint-plugin-react": "^6.8.0", "istanbul": "^0.4.5", - "logtify": "file:///Users/macbook/Programming/JS/node-logtify", "mocha": "^3.2.0", "sinon": "^1.17.6" } diff --git a/sonar-project.properties b/sonar-project.properties index d77c2b3..c084704 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,5 +1,5 @@ -sonar.projectKey=node-logtify-logentries -sonar.projectName=node-logtify-logentries +sonar.projectKey=logtify-logentries +sonar.projectName=logtify-logentries sonar.sources=src sonar.tests=test diff --git a/src/index.js b/src/index.js index 9061812..550b3be 100644 --- a/src/index.js +++ b/src/index.js @@ -2,10 +2,8 @@ require('le_node'); const winston = require('winston'); /** - @class ConsoleLink + @class Logentries A Logentries logger chain link - @implements ChainLink @class - a basic interface for each link based on the Chain of Resp Pattern - This chain link is responsible for logging a message to the Logentries endpoint Has the following configurations (either env var or settings param): - LOGENTRIES_LOGGING {'true'|'false'} - switches on / off the use of this chain link @@ -19,7 +17,7 @@ const winston = require('winston'); class Logentries { /** @constructor - Construct an instance of a ConsoleLink @class + Construct an instance of a Logentries @class @param configs {Object} - LoggerChain configuration object @param utility {Object} - Logtify common rules object **/ @@ -105,6 +103,10 @@ class Logentries { } } +/** + @param config {Object} - chain link configuration + @return { object } - chain link object with a class +**/ module.exports = (config) => { const configs = Object.assign({ LOGS_TOKEN: process.env.LOGS_TOKEN || process.env.LOGENTRIES_TOKEN diff --git a/test/chain-spec.js b/test/chain-spec.js deleted file mode 100644 index beac7f2..0000000 --- a/test/chain-spec.js +++ /dev/null @@ -1,97 +0,0 @@ -const logtify = require('logtify'); -const sinon = require('sinon'); -const assert = require('assert'); -const Logentries = require('../src/index'); - -describe('Logentries inside chain', () => { - it('should be able to insert into a chain without a conflict [manual push] [no token] [switched off]', () => { - const { chain, logger } = logtify({}); - const LogentriesLinkClass = Logentries().class; - const logentriesChainLink = new LogentriesLinkClass({}, new chain.Utility()); - assert.equal(logentriesChainLink.winston, undefined); - const spy = sinon.spy(logentriesChainLink, 'handle'); - const index = chain.push(logentriesChainLink); - assert.equal(index, chain.chainLinks.length - 1); - chain.link(); - logger.info('Hello world'); - assert(spy.called); - }); - - it('should be able to insert into a chain without a conflict [manual push] [with token] [switched off]', () => { - const { chain } = logtify({}); - const logentriesPackage = Logentries({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000' }); - const logentriesLinkConfig = logentriesPackage.config; - const LogentriesLinkClass = logentriesPackage.class; - const logentriesChainLink = new LogentriesLinkClass(logentriesLinkConfig, new chain.Utility()); - assert.notEqual(logentriesChainLink.winston, undefined); - const spy = sinon.spy(logentriesChainLink, 'handle'); - const index = chain.push(logentriesChainLink); - assert.equal(index, chain.chainLinks.length - 1); - chain.link(); - chain.log(null, 'Hello world'); - assert(spy.called); - }); - - it('should be able to insert into a chain without a conflict [manual push] [with token] [switched on]', () => { - const { chain } = logtify({}); - const logentriesPackage = Logentries({ - LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', - LOGENTRIES_LOGGING: true - }); - const logentriesLinkConfig = logentriesPackage.config; - const LogentriesLinkClass = logentriesPackage.class; - const logentriesChainLink = new LogentriesLinkClass(logentriesLinkConfig, new chain.Utility()); - assert.notEqual(logentriesChainLink.winston, undefined); - const spy = sinon.spy(logentriesChainLink, 'handle'); - const index = chain.push(logentriesChainLink); - assert.equal(index, chain.chainLinks.length - 1); - chain.link(); - chain.log(null, 'Hello world'); - assert(spy.called); - }); - - it('should be able to insert into a chain without a conflict [auto push v2] [with token] [switched on]', () => { - const { chain } = logtify({ - chainLinks: [ - Logentries({ - LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', - LOGENTRIES_LOGGING: true - }) - ] - }); - assert.equal(chain.chainLinks.length, 2); - const logentriesChainLink = chain.chainEnd; - assert.notEqual(logentriesChainLink.winston, undefined); - const spy = sinon.spy(logentriesChainLink, 'handle'); - chain.log(null, 'Hello world'); - assert(spy.called); - }); - - it('should be able to insert into a chain without a conflict [auto push v1] [with token] [switched on]', () => { - const { chain } = logtify({ - LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', - LOGENTRIES_LOGGING: true, - chainLinks: [Logentries().class] - }); - assert.equal(chain.chainLinks.length, 2); - const logentriesChainLink = chain.chainEnd; - assert.notEqual(logentriesChainLink.winston, undefined); - const spy = sinon.spy(logentriesChainLink, 'handle'); - chain.log(null, 'Hello world'); - assert(spy.called); - }); - - it('should be able to insert into a chain without a conflict [auto push v1] [with token] [switched on]', () => { - const { chain } = logtify({ - LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', - LOGENTRIES_LOGGING: true, - chainLinks: [Logentries.LogentriesChainLink] - }); - assert.equal(chain.chainLinks.length, 2); - const logentriesChainLink = chain.chainEnd; - assert.notEqual(logentriesChainLink.winston, undefined); - const spy = sinon.spy(logentriesChainLink, 'handle'); - chain.log(null, 'Hello world'); - assert(spy.called); - }); -}); diff --git a/test/logentries-spec.js b/test/logentries-spec.js index a259c0a..c72faa2 100644 --- a/test/logentries-spec.js +++ b/test/logentries-spec.js @@ -1,10 +1,8 @@ const assert = require('assert'); const sinon = require('sinon'); const Logentries = require('../src/index'); -const { chain } = require('logtify')(); - -const Message = chain.Message; -const ChainLinkUtility = chain.Utility; +const Message = require('./mocks/message'); +const ChainLinkUtility = require('./mocks/utility'); describe('Logentries chain link ', () => { before(() => { diff --git a/test/mocks/message.js b/test/mocks/message.js new file mode 100644 index 0000000..ce4ab67 --- /dev/null +++ b/test/mocks/message.js @@ -0,0 +1,31 @@ +const sinon = require('sinon'); + +function Message(logLevel, message, ...metas) { + // if plain text + this.payload = { + level: logLevel || 'info', + text: message || '', + meta: { + instanceId: process.env.HOSTNAME, + notify: true + } + }; + + // if error + if (message instanceof Error) { + this.payload.text = message.message || 'Error: '; + this.payload.meta.stack = message.stack; + this.payload.error = message; + } + // all metas are included as message meta + if (metas.length > 0) { + const metadata = metas.reduce((sum, next) => Object.assign({}, sum, next)); + Object.assign(this.payload.meta, metadata); + } + // originally deep-freeze is used + this.payload = Object.freeze(this.payload); +} + +Message.prototype.getPrefix = sinon.stub().returns(''); + +module.exports = Message; diff --git a/test/mocks/utility.js b/test/mocks/utility.js new file mode 100644 index 0000000..dadc28c --- /dev/null +++ b/test/mocks/utility.js @@ -0,0 +1,21 @@ +function ChainLinkUtility() { + const levels = [ + ['silly', 0], + ['verbose', 1], + ['debug', 2], + ['info', 3], + ['warn', 4], + ['error', 5], + ['default', 'info'] + ]; + this.logLevels = Object.freeze(new Map(levels)); +} + +ChainLinkUtility.prototype.getMinLogLevel = (config, chain = '') => { + const settings = config || {}; + const minLogLevel = process.env[`MIN_LOG_LEVEL_${chain}`] || settings[`MIN_LOG_LEVEL_${chain}`] || + process.env.MIN_LOG_LEVEL || settings.MIN_LOG_LEVEL; + return minLogLevel || 'info'; +}; + +module.exports = ChainLinkUtility; From e4cbfbda56b3f4f0239095a9fd49d23ef93cc04a Mon Sep 17 00:00:00 2001 From: Daniyil Vasylenko Date: Sun, 4 Jun 2017 04:00:08 +0300 Subject: [PATCH 4/6] Simplify chain link connection --- .gitignore | 1 + .npmignore | 1 + README.md | 24 +- package-lock.json | 2395 +++++++++++++++++++++++++++++++++++++++ package.json | 3 +- src/index.js | 52 +- test/logentries-spec.js | 58 +- test/mocks/message.js | 31 - test/mocks/utility.js | 21 - 9 files changed, 2452 insertions(+), 134 deletions(-) create mode 100644 package-lock.json delete mode 100644 test/mocks/message.js delete mode 100644 test/mocks/utility.js diff --git a/.gitignore b/.gitignore index 9d9829a..8e5dae8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /examples +.DS_STORE # Logs logs diff --git a/.npmignore b/.npmignore index b334896..411cf25 100644 --- a/.npmignore +++ b/.npmignore @@ -1,4 +1,5 @@ .git +.DS_STORE node_modules coverage test diff --git a/README.md b/README.md index b622f09..60ce4c6 100644 --- a/README.md +++ b/README.md @@ -5,38 +5,26 @@ Logentries chain link for [logtify](https://github.com/dial-once/node-logtify) l ## Installation ``` -npm i -S @dialonce/logtify-logentries +npm i -S logtify-logentries ``` ## Usage -When requiring a [logtify](https://github.com/dial-once/node-logtify) module, include it's chainLink into the chain +Used with [logtify](https://github.com/dial-once/node-logtify) module. -**Variant 1** (Settings passed as global logger settings:): ```js -const { LogentriesChainLink } = require('@dialonce/logtify-logentries'); -const { chain, logger } = require('@dialonce/logtify')({ - LOGS_TOKEN: 'YOUR_LOGENTRIES_TOKEN', - chainLinks: [ LogentriesChainLink ] -}); -``` - -**Variant 2** (Settings passed into a chain link wrapper): -```js -const Logentries = require('@dialonce/logtify-logentries'); -const { chain, logger } = require('@dialonce/logtify')({ - chainLinks: [ Logentries({ LOGS_TOKEN: 'YOUR_LOGENTRIES_TOKEN' })] -}); +require('logtify-logentries')({ LOGS_TOKEN: 'YOUR_LOGENTRIES_TOKEN' }); +const { chain, logger } = require('logtify')(); logger.log('error', new Error('Test error')); logger.info('Hello world!'); ``` The chainLink will make sure that a message will be sent to Logentries if: * ``message.level >= 'MIN_LOG_LEVEL_LOGENTRIES' || 'MIN_LOG_LEVEL'`` -* ``process.env.LOGENTRIES_LOGGING === 'true' || settings.LOGENTRIES_LOGGING === true`` +* ``process.env.LOGENTRIES_LOGGING !== 'false' || settings.LOGENTRIES_LOGGING !== false`` ## Configuration **Environment variables**: -* ``process.env.LOGENTRIES_LOGGING = 'true|false'`` - Switching on / off the chain link +* ``process.env.LOGENTRIES_LOGGING = 'true|false'`` - Switching on / off the chain link. On by default * ``process.env.LOGS_TOKEN = 'TOKEN'`` - your Logentries token * ``process.env.MIN_LOG_LEVEL_LOGENTRIES = 'silly|verbose|info|warn|error'`` diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..6d35663 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2395 @@ +{ + "name": "@dialonce/logtify-logentries", + "version": "0.0.0", + "lockfileVersion": 1, + "dependencies": { + "abbrev": { + "version": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "acorn": { + "version": "https://registry.npmjs.org/acorn/-/acorn-5.0.3.tgz", + "integrity": "sha1-xGDfCEkUY/AozLguqzcwvwEIez0=", + "dev": true + }, + "acorn-jsx": { + "version": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "dependencies": { + "acorn": { + "version": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true + }, + "ajv-keywords": { + "version": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "align-text": { + "version": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true + }, + "amdefine": { + "version": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-escapes": { + "version": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-regex": { + "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "argparse": { + "version": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true + }, + "array-union": { + "version": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true + }, + "array-uniq": { + "version": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array.prototype.find": { + "version": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.0.4.tgz", + "integrity": "sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=", + "dev": true + }, + "arrify": { + "version": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "async": { + "version": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", + "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" + }, + "babel-code-frame": { + "version": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", + "dev": true + }, + "babel-runtime": { + "version": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.6.1.tgz", + "integrity": "sha1-eIuUtvY04luRvWxd9y1GdFevsAA=" + }, + "backoff": { + "version": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=" + }, + "balanced-match": { + "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + }, + "brace-expansion": { + "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", + "dev": true + }, + "browser-stdout": { + "version": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "buffer-shims": { + "version": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, + "builtin-modules": { + "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "caller-path": { + "version": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true + }, + "callsites": { + "version": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "center-align": { + "version": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true + }, + "chalk": { + "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true + }, + "circular-json": { + "version": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz", + "integrity": "sha1-vos2rvzN6LPKeqLWr8B6NyQsDS0=", + "dev": true + }, + "cli-cursor": { + "version": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true + }, + "cli-width": { + "version": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", + "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", + "dev": true + }, + "cliui": { + "version": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "dependencies": { + "wordwrap": { + "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + } + } + }, + "co": { + "version": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "codependency": { + "version": "https://registry.npmjs.org/codependency/-/codependency-0.1.4.tgz", + "integrity": "sha1-0XY6tyZL1wyR2WJumIYtN5K/jUo=", + "dependencies": { + "semver": { + "version": "https://registry.npmjs.org/semver/-/semver-5.0.1.tgz", + "integrity": "sha1-n7P0AE+QDYPEeWj+QvdYPgWDLMk=" + } + } + }, + "colors": { + "version": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" + }, + "commander": { + "version": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true + }, + "concat-map": { + "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true + }, + "contains-path": { + "version": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "core-js": { + "version": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" + }, + "core-util-is": { + "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cycle": { + "version": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" + }, + "d": { + "version": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true + }, + "damerau-levenshtein": { + "version": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", + "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=", + "dev": true + }, + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.6.6.tgz", + "integrity": "sha1-qfpvvpykPPHnn3O3XAGJy7fW21o=", + "dev": true + }, + "decamelize": { + "version": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "optional": true + }, + "deep-is": { + "version": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true + }, + "del": { + "version": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true + }, + "diff": { + "version": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "doctrine": { + "version": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "dev": true + }, + "es-abstract": { + "version": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.7.0.tgz", + "integrity": "sha1-363ndOAb/Nl/lhgCmMRJyGI/uUw=", + "dev": true + }, + "es-to-primitive": { + "version": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true + }, + "es5-ext": { + "version": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.16.tgz", + "integrity": "sha1-HvGwTz0J22pdYwIm1iIC8uQl5Fo=", + "dev": true + }, + "es6-iterator": { + "version": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "dev": true + }, + "es6-map": { + "version": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true + }, + "es6-set": { + "version": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true + }, + "es6-symbol": { + "version": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true + }, + "es6-weak-map": { + "version": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true + }, + "escape-string-regexp": { + "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "dependencies": { + "esprima": { + "version": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "estraverse": { + "version": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + } + } + }, + "escope": { + "version": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true + }, + "eslint": { + "version": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "dev": true, + "dependencies": { + "lodash": { + "version": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + } + } + }, + "eslint-config-airbnb": { + "version": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-13.0.0.tgz", + "integrity": "sha1-aI0V08J2wMdTrlOMkqRDl9dq5G4=", + "dev": true + }, + "eslint-config-airbnb-base": { + "version": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-10.0.1.tgz", + "integrity": "sha1-8X1OUpksHUXRt3E++81ezQ5+BQY=", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", + "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", + "dev": true + }, + "eslint-module-utils": { + "version": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.0.0.tgz", + "integrity": "sha1-pvjCHZATWHWc3DXbrBmCrh7li84=", + "dev": true, + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", + "integrity": "sha1-crowb60wXWfEgWNIpGmaQimsi04=", + "dev": true, + "dependencies": { + "doctrine": { + "version": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-2.2.3.tgz", + "integrity": "sha1-TjXLcbin23AqxBXIBuuOjZ6mxl0=", + "dev": true + }, + "eslint-plugin-react": { + "version": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz", + "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", + "dev": true, + "dependencies": { + "doctrine": { + "version": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true + } + } + }, + "espree": { + "version": "https://registry.npmjs.org/espree/-/espree-3.4.3.tgz", + "integrity": "sha1-KRC1zNSc6JPC//+qtP2LOjG4I3Q=", + "dev": true + }, + "esprima": { + "version": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "esquery": { + "version": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true + }, + "esrecurse": { + "version": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.1.0.tgz", + "integrity": "sha1-RxO2U2rffyrE8yfVWed1a/9kgiA=", + "dev": true, + "dependencies": { + "estraverse": { + "version": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz", + "integrity": "sha1-9srKcokzqFDvkGYdDheYK6RxEaI=", + "dev": true + } + } + }, + "estraverse": { + "version": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-emitter": { + "version": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true + }, + "exit-hook": { + "version": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "eyes": { + "version": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" + }, + "fast-levenshtein": { + "version": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true + }, + "file-entry-cache": { + "version": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true + }, + "find-up": { + "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true + }, + "flat-cache": { + "version": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", + "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", + "dev": true + }, + "foreach": { + "version": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "formatio": { + "version": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", + "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "dev": true + }, + "fs.realpath": { + "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", + "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", + "dev": true + }, + "generate-function": { + "version": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true + }, + "glob": { + "version": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true + }, + "globals": { + "version": "https://registry.npmjs.org/globals/-/globals-9.17.0.tgz", + "integrity": "sha1-DAymltm5u2lNLlRwvTd3fKrVAoY=", + "dev": true + }, + "globby": { + "version": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true + }, + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graceful-readlink": { + "version": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "growl": { + "version": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "handlebars": { + "version": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.8.tgz", + "integrity": "sha1-Irh1zT8ObL6jAxTxROgrx6cv9CA=", + "dev": true, + "dependencies": { + "async": { + "version": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "source-map": { + "version": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true + } + } + }, + "has": { + "version": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true + }, + "has-ansi": { + "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true + }, + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "ignore": { + "version": "https://registry.npmjs.org/ignore/-/ignore-3.3.0.tgz", + "integrity": "sha1-OBLSLL6RJfLCtJFXVaG4q9dFoAE=", + "dev": true + }, + "imurmurhash": { + "version": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true + }, + "inherits": { + "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "inquirer": { + "version": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "dependencies": { + "lodash": { + "version": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + } + } + }, + "interpret": { + "version": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", + "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", + "dev": true + }, + "is-buffer": { + "version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + }, + "is-callable": { + "version": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-date-object": { + "version": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true + }, + "is-my-json-valid": { + "version": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", + "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", + "dev": true + }, + "is-path-cwd": { + "version": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true + }, + "is-path-inside": { + "version": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true + }, + "is-property": { + "version": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-regex": { + "version": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true + }, + "is-resolvable": { + "version": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true + }, + "is-symbol": { + "version": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul": { + "version": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "dependencies": { + "esprima": { + "version": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "glob": { + "version": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true + }, + "resolve": { + "version": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true + } + } + }, + "js-tokens": { + "version": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", + "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=", + "dev": true + }, + "js-yaml": { + "version": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.4.tgz", + "integrity": "sha1-UgtFZPhlc7qWZir4Woyvp7S1pvY=", + "dev": true + }, + "json-stable-stringify": { + "version": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true + }, + "json-stringify-safe": { + "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json3": { + "version": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "jsonify": { + "version": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsx-ast-utils": { + "version": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", + "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", + "dev": true + }, + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.0.tgz", + "integrity": "sha1-tYq+TVwEStM3JqjBUltIz4kb/wc=", + "dev": true + }, + "lazy-cache": { + "version": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + }, + "le_node": { + "version": "https://registry.npmjs.org/le_node/-/le_node-1.7.0.tgz", + "integrity": "sha1-EE5jTLTwvl/XBgNIg33vYTOospc=" + }, + "levn": { + "version": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true + }, + "lodash": { + "version": "https://registry.npmjs.org/lodash/-/lodash-3.9.3.tgz", + "integrity": "sha1-AVnoaDL+/8bWHYUrEqlTuZSWvTI=" + }, + "lodash._baseassign": { + "version": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true + }, + "lodash._basecopy": { + "version": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._getnative": { + "version": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.cond": { + "version": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, + "lodash.create": { + "version": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true + }, + "lodash.isarguments": { + "version": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true + }, + "logtify": { + "version": "file:../node-logtify", + "dependencies": { + "abbrev": { + "version": "1.0.9", + "bundled": true + }, + "acorn": { + "version": "5.0.3", + "bundled": true + }, + "acorn-jsx": { + "version": "3.0.1", + "bundled": true, + "dependencies": { + "acorn": { + "version": "3.3.0", + "bundled": true + } + } + }, + "ajv": { + "version": "4.11.8", + "bundled": true + }, + "ajv-keywords": { + "version": "1.5.1", + "bundled": true + }, + "align-text": { + "version": "0.1.4", + "bundled": true + }, + "amdefine": { + "version": "1.0.1", + "bundled": true + }, + "ansi-escapes": { + "version": "1.4.0", + "bundled": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "ansi-styles": { + "version": "2.2.1", + "bundled": true + }, + "argparse": { + "version": "1.0.9", + "bundled": true + }, + "array-union": { + "version": "1.0.2", + "bundled": true + }, + "array-uniq": { + "version": "1.0.3", + "bundled": true + }, + "array.prototype.find": { + "version": "2.0.4", + "bundled": true + }, + "arrify": { + "version": "1.0.1", + "bundled": true + }, + "async": { + "version": "1.0.0", + "bundled": true + }, + "babel-code-frame": { + "version": "6.22.0", + "bundled": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true + }, + "browser-stdout": { + "version": "1.3.0", + "bundled": true + }, + "builtin-modules": { + "version": "1.1.1", + "bundled": true + }, + "caller-path": { + "version": "0.1.0", + "bundled": true + }, + "callsites": { + "version": "0.2.0", + "bundled": true + }, + "camelcase": { + "version": "1.2.1", + "bundled": true, + "optional": true + }, + "center-align": { + "version": "0.1.3", + "bundled": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "bundled": true + }, + "circular-json": { + "version": "0.3.1", + "bundled": true + }, + "cli-cursor": { + "version": "1.0.2", + "bundled": true + }, + "cli-width": { + "version": "2.1.0", + "bundled": true + }, + "cliui": { + "version": "2.1.0", + "bundled": true, + "optional": true, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "bundled": true, + "optional": true + } + } + }, + "co": { + "version": "4.6.0", + "bundled": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "colors": { + "version": "1.0.3", + "bundled": true + }, + "commander": { + "version": "2.9.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "concat-stream": { + "version": "1.6.0", + "bundled": true + }, + "contains-path": { + "version": "0.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "cycle": { + "version": "1.0.3", + "bundled": true + }, + "d": { + "version": "1.0.0", + "bundled": true + }, + "damerau-levenshtein": { + "version": "1.0.4", + "bundled": true + }, + "debug": { + "version": "2.6.8", + "bundled": true + }, + "decamelize": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "deep-freeze": { + "version": "0.0.1", + "bundled": true + }, + "deep-is": { + "version": "0.1.3", + "bundled": true + }, + "define-properties": { + "version": "1.1.2", + "bundled": true + }, + "del": { + "version": "2.2.2", + "bundled": true + }, + "diff": { + "version": "3.2.0", + "bundled": true + }, + "doctrine": { + "version": "2.0.0", + "bundled": true + }, + "error-ex": { + "version": "1.3.1", + "bundled": true + }, + "es-abstract": { + "version": "1.7.0", + "bundled": true + }, + "es-to-primitive": { + "version": "1.1.1", + "bundled": true + }, + "es5-ext": { + "version": "0.10.22", + "bundled": true + }, + "es6-iterator": { + "version": "2.0.1", + "bundled": true + }, + "es6-map": { + "version": "0.1.5", + "bundled": true + }, + "es6-set": { + "version": "0.1.5", + "bundled": true + }, + "es6-symbol": { + "version": "3.1.1", + "bundled": true + }, + "es6-weak-map": { + "version": "2.0.2", + "bundled": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true + }, + "escodegen": { + "version": "1.8.1", + "bundled": true, + "dependencies": { + "esprima": { + "version": "2.7.3", + "bundled": true + }, + "estraverse": { + "version": "1.9.3", + "bundled": true + } + } + }, + "escope": { + "version": "3.6.0", + "bundled": true + }, + "eslint": { + "version": "3.19.0", + "bundled": true + }, + "eslint-config-airbnb": { + "version": "13.0.0", + "bundled": true + }, + "eslint-config-airbnb-base": { + "version": "10.0.1", + "bundled": true + }, + "eslint-import-resolver-node": { + "version": "0.2.3", + "bundled": true + }, + "eslint-module-utils": { + "version": "2.0.0", + "bundled": true, + "dependencies": { + "debug": { + "version": "2.2.0", + "bundled": true + }, + "ms": { + "version": "0.7.1", + "bundled": true + } + } + }, + "eslint-plugin-import": { + "version": "2.3.0", + "bundled": true, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "bundled": true + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "2.2.3", + "bundled": true + }, + "eslint-plugin-react": { + "version": "6.10.3", + "bundled": true, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "bundled": true + } + } + }, + "espree": { + "version": "3.4.3", + "bundled": true + }, + "esprima": { + "version": "3.1.3", + "bundled": true + }, + "esquery": { + "version": "1.0.0", + "bundled": true + }, + "esrecurse": { + "version": "4.1.0", + "bundled": true, + "dependencies": { + "estraverse": { + "version": "4.1.1", + "bundled": true + } + } + }, + "estraverse": { + "version": "4.2.0", + "bundled": true + }, + "esutils": { + "version": "2.0.2", + "bundled": true + }, + "event-emitter": { + "version": "0.3.5", + "bundled": true + }, + "exit-hook": { + "version": "1.1.1", + "bundled": true + }, + "eyes": { + "version": "0.1.8", + "bundled": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "bundled": true + }, + "figures": { + "version": "1.7.0", + "bundled": true + }, + "file-entry-cache": { + "version": "2.0.0", + "bundled": true + }, + "find-up": { + "version": "1.1.2", + "bundled": true + }, + "flat-cache": { + "version": "1.2.2", + "bundled": true + }, + "foreach": { + "version": "2.0.5", + "bundled": true + }, + "formatio": { + "version": "1.1.1", + "bundled": true + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "function-bind": { + "version": "1.1.0", + "bundled": true + }, + "generate-function": { + "version": "2.0.0", + "bundled": true + }, + "generate-object-property": { + "version": "1.2.0", + "bundled": true + }, + "glob": { + "version": "7.1.2", + "bundled": true + }, + "globals": { + "version": "9.17.0", + "bundled": true + }, + "globby": { + "version": "5.0.0", + "bundled": true + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true + }, + "graceful-readlink": { + "version": "1.0.1", + "bundled": true + }, + "growl": { + "version": "1.9.2", + "bundled": true + }, + "handlebars": { + "version": "4.0.10", + "bundled": true, + "dependencies": { + "async": { + "version": "1.5.2", + "bundled": true + }, + "source-map": { + "version": "0.4.4", + "bundled": true + } + } + }, + "has": { + "version": "1.0.1", + "bundled": true + }, + "has-ansi": { + "version": "2.0.0", + "bundled": true + }, + "has-flag": { + "version": "1.0.0", + "bundled": true + }, + "hosted-git-info": { + "version": "2.4.2", + "bundled": true + }, + "ignore": { + "version": "3.3.3", + "bundled": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "inquirer": { + "version": "0.12.0", + "bundled": true + }, + "interpret": { + "version": "1.0.3", + "bundled": true + }, + "is-arrayish": { + "version": "0.2.1", + "bundled": true + }, + "is-buffer": { + "version": "1.1.5", + "bundled": true + }, + "is-builtin-module": { + "version": "1.0.0", + "bundled": true + }, + "is-callable": { + "version": "1.1.3", + "bundled": true + }, + "is-date-object": { + "version": "1.0.1", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true + }, + "is-my-json-valid": { + "version": "2.16.0", + "bundled": true + }, + "is-path-cwd": { + "version": "1.0.0", + "bundled": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "bundled": true + }, + "is-path-inside": { + "version": "1.0.0", + "bundled": true + }, + "is-property": { + "version": "1.0.2", + "bundled": true + }, + "is-regex": { + "version": "1.0.4", + "bundled": true + }, + "is-resolvable": { + "version": "1.0.0", + "bundled": true + }, + "is-symbol": { + "version": "1.0.1", + "bundled": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true + }, + "istanbul": { + "version": "0.4.5", + "bundled": true, + "dependencies": { + "esprima": { + "version": "2.7.3", + "bundled": true + }, + "glob": { + "version": "5.0.15", + "bundled": true + }, + "resolve": { + "version": "1.1.7", + "bundled": true + }, + "supports-color": { + "version": "3.2.3", + "bundled": true + } + } + }, + "js-tokens": { + "version": "3.0.1", + "bundled": true + }, + "js-yaml": { + "version": "3.8.4", + "bundled": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true + }, + "json3": { + "version": "3.3.2", + "bundled": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true + }, + "jsonpointer": { + "version": "4.0.1", + "bundled": true + }, + "jsx-ast-utils": { + "version": "1.4.1", + "bundled": true + }, + "kind-of": { + "version": "3.2.2", + "bundled": true + }, + "lazy-cache": { + "version": "1.0.4", + "bundled": true, + "optional": true + }, + "levn": { + "version": "0.3.0", + "bundled": true + }, + "load-json-file": { + "version": "2.0.0", + "bundled": true + }, + "locate-path": { + "version": "2.0.0", + "bundled": true, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "bundled": true + } + } + }, + "lodash": { + "version": "4.17.4", + "bundled": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "bundled": true + }, + "lodash._basecopy": { + "version": "3.0.1", + "bundled": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "bundled": true + }, + "lodash._getnative": { + "version": "3.9.1", + "bundled": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "bundled": true + }, + "lodash.cond": { + "version": "4.5.2", + "bundled": true + }, + "lodash.create": { + "version": "3.1.1", + "bundled": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "bundled": true + }, + "lodash.isarray": { + "version": "3.0.4", + "bundled": true + }, + "lodash.keys": { + "version": "3.1.2", + "bundled": true + }, + "lolex": { + "version": "1.3.2", + "bundled": true + }, + "longest": { + "version": "1.0.1", + "bundled": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true + }, + "mocha": { + "version": "3.4.2", + "bundled": true, + "dependencies": { + "debug": { + "version": "2.6.0", + "bundled": true + }, + "glob": { + "version": "7.1.1", + "bundled": true + }, + "ms": { + "version": "0.7.2", + "bundled": true + }, + "supports-color": { + "version": "3.1.2", + "bundled": true + } + } + }, + "ms": { + "version": "2.0.0", + "bundled": true + }, + "mute-stream": { + "version": "0.0.5", + "bundled": true + }, + "natural-compare": { + "version": "1.4.0", + "bundled": true + }, + "nopt": { + "version": "3.0.6", + "bundled": true + }, + "normalize-package-data": { + "version": "2.3.8", + "bundled": true + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "object-keys": { + "version": "1.0.11", + "bundled": true + }, + "object.assign": { + "version": "4.0.4", + "bundled": true + }, + "once": { + "version": "1.4.0", + "bundled": true + }, + "onetime": { + "version": "1.1.0", + "bundled": true + }, + "optimist": { + "version": "0.6.1", + "bundled": true, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "bundled": true + } + } + }, + "optionator": { + "version": "0.8.2", + "bundled": true + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true + }, + "p-limit": { + "version": "1.1.0", + "bundled": true + }, + "p-locate": { + "version": "2.0.0", + "bundled": true + }, + "parse-json": { + "version": "2.2.0", + "bundled": true + }, + "path-exists": { + "version": "2.1.0", + "bundled": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "path-is-inside": { + "version": "1.0.2", + "bundled": true + }, + "path-parse": { + "version": "1.0.5", + "bundled": true + }, + "path-type": { + "version": "2.0.0", + "bundled": true + }, + "pify": { + "version": "2.3.0", + "bundled": true + }, + "pinkie": { + "version": "2.0.4", + "bundled": true + }, + "pinkie-promise": { + "version": "2.0.1", + "bundled": true + }, + "pkg-dir": { + "version": "1.0.0", + "bundled": true + }, + "pluralize": { + "version": "1.2.1", + "bundled": true + }, + "prelude-ls": { + "version": "1.1.2", + "bundled": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true + }, + "progress": { + "version": "1.1.8", + "bundled": true + }, + "read-pkg": { + "version": "2.0.0", + "bundled": true + }, + "read-pkg-up": { + "version": "2.0.0", + "bundled": true, + "dependencies": { + "find-up": { + "version": "2.1.0", + "bundled": true + } + } + }, + "readable-stream": { + "version": "2.2.10", + "bundled": true + }, + "readline2": { + "version": "1.0.1", + "bundled": true + }, + "rechoir": { + "version": "0.6.2", + "bundled": true + }, + "repeat-string": { + "version": "1.6.1", + "bundled": true + }, + "require-uncached": { + "version": "1.0.3", + "bundled": true + }, + "resolve": { + "version": "1.3.3", + "bundled": true + }, + "resolve-from": { + "version": "1.0.1", + "bundled": true + }, + "restore-cursor": { + "version": "1.0.1", + "bundled": true + }, + "right-align": { + "version": "0.1.3", + "bundled": true, + "optional": true + }, + "rimraf": { + "version": "2.6.1", + "bundled": true + }, + "run-async": { + "version": "0.1.0", + "bundled": true + }, + "rx-lite": { + "version": "3.1.2", + "bundled": true + }, + "safe-buffer": { + "version": "5.1.0", + "bundled": true + }, + "samsam": { + "version": "1.1.2", + "bundled": true + }, + "semver": { + "version": "5.3.0", + "bundled": true + }, + "shelljs": { + "version": "0.7.7", + "bundled": true + }, + "sinon": { + "version": "1.17.7", + "bundled": true + }, + "slice-ansi": { + "version": "0.0.4", + "bundled": true + }, + "source-map": { + "version": "0.2.0", + "bundled": true, + "optional": true + }, + "spdx-correct": { + "version": "1.0.2", + "bundled": true + }, + "spdx-expression-parse": { + "version": "1.0.4", + "bundled": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "bundled": true + }, + "sprintf-js": { + "version": "1.0.3", + "bundled": true + }, + "stack-trace": { + "version": "0.0.10", + "bundled": true + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true + }, + "strip-bom": { + "version": "3.0.0", + "bundled": true + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true + }, + "supports-color": { + "version": "2.0.0", + "bundled": true + }, + "table": { + "version": "3.8.3", + "bundled": true, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true + }, + "string-width": { + "version": "2.0.0", + "bundled": true + } + } + }, + "text-table": { + "version": "0.2.0", + "bundled": true + }, + "through": { + "version": "2.3.8", + "bundled": true + }, + "tryit": { + "version": "1.0.3", + "bundled": true + }, + "type-check": { + "version": "0.3.2", + "bundled": true + }, + "typedarray": { + "version": "0.0.6", + "bundled": true + }, + "uglify-js": { + "version": "2.8.27", + "bundled": true, + "optional": true, + "dependencies": { + "source-map": { + "version": "0.5.6", + "bundled": true, + "optional": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "user-home": { + "version": "2.0.0", + "bundled": true + }, + "util": { + "version": "0.10.3", + "bundled": true, + "dependencies": { + "inherits": { + "version": "2.0.1", + "bundled": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "bundled": true + }, + "which": { + "version": "1.2.14", + "bundled": true + }, + "window-size": { + "version": "0.1.0", + "bundled": true, + "optional": true + }, + "winston": { + "version": "2.3.1", + "bundled": true + }, + "wordwrap": { + "version": "1.0.0", + "bundled": true + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "write": { + "version": "0.2.1", + "bundled": true + }, + "xtend": { + "version": "4.0.1", + "bundled": true + }, + "yargs": { + "version": "3.10.0", + "bundled": true, + "optional": true + } + } + }, + "lolex": { + "version": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "dev": true + }, + "longest": { + "version": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "minimatch": { + "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true + }, + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true + }, + "mocha": { + "version": "https://registry.npmjs.org/mocha/-/mocha-3.3.0.tgz", + "integrity": "sha1-0pt0KNP1LILi5l3x7LcGThqrv7U=", + "dev": true, + "dependencies": { + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.6.0.tgz", + "integrity": "sha1-vFlryr52F/Edn6FTYe3tVgi4SZs=", + "dev": true + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true + } + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", + "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=", + "dev": true + }, + "mute-stream": { + "version": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + }, + "natural-compare": { + "version": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nopt": { + "version": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true + }, + "number-is-nan": { + "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-keys": { + "version": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object.assign": { + "version": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", + "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", + "dev": true + }, + "once": { + "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true + }, + "onetime": { + "version": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "optimist": { + "version": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "dependencies": { + "wordwrap": { + "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true + }, + "os-homedir": { + "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "path-exists": { + "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true + }, + "path-is-absolute": { + "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-parse": { + "version": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "pify": { + "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true + }, + "pkg-dir": { + "version": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true + }, + "pkg-up": { + "version": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", + "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", + "dev": true + }, + "pluralize": { + "version": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "precond": { + "version": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" + }, + "prelude-ls": { + "version": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "process-nextick-args": { + "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "progress": { + "version": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "readable-stream": { + "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "dev": true + }, + "readline2": { + "version": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true + }, + "rechoir": { + "version": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true + }, + "reconnect-core": { + "version": "https://registry.npmjs.org/reconnect-core/-/reconnect-core-1.3.0.tgz", + "integrity": "sha1-+65SkZp4d9hE4yRtAaLyZwHIM8g=" + }, + "repeat-string": { + "version": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-uncached": { + "version": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true + }, + "resolve": { + "version": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", + "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", + "dev": true + }, + "resolve-from": { + "version": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "restore-cursor": { + "version": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true + }, + "right-align": { + "version": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true + }, + "rimraf": { + "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true + }, + "run-async": { + "version": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true + }, + "rx-lite": { + "version": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "samsam": { + "version": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", + "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", + "dev": true + }, + "semver": { + "version": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", + "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU=" + }, + "shelljs": { + "version": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.7.tgz", + "integrity": "sha1-svXHfvlxSPS09uImguELuoZnz/E=", + "dev": true + }, + "sinon": { + "version": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "dev": true + }, + "slice-ansi": { + "version": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "source-map": { + "version": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true + }, + "sprintf-js": { + "version": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "stack-trace": { + "version": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=" + }, + "string_decoder": { + "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", + "integrity": "sha1-8G9BFXtmTYYGn4S9vcmw2KsoFmc=", + "dev": true + }, + "string-width": { + "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true + }, + "strip-ansi": { + "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true + }, + "strip-bom": { + "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "table": { + "version": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": { + "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "lodash": { + "version": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "string-width": { + "version": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", + "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", + "dev": true + } + } + }, + "text-table": { + "version": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tryit": { + "version": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "type-check": { + "version": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true + }, + "typedarray": { + "version": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.23.tgz", + "integrity": "sha1-gjDdl4M3EjLWKngh4s+agXJwqKA=", + "dev": true, + "optional": true, + "dependencies": { + "source-map": { + "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true, + "optional": true + } + } + }, + "uglify-to-browserify": { + "version": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "user-home": { + "version": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true + }, + "util": { + "version": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "dependencies": { + "inherits": { + "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "which": { + "version": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "dev": true + }, + "window-size": { + "version": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + }, + "winston": { + "version": "https://registry.npmjs.org/winston/-/winston-2.3.1.tgz", + "integrity": "sha1-C0hCDZeMAYBM8CMLZIhhWYIloRk=" + }, + "wordwrap": { + "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true + }, + "xtend": { + "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "yargs": { + "version": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true + } + } +} diff --git a/package.json b/package.json index 10802ee..f815887 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "@dialonce/logtify-logentries", + "name": "logtify-logentries", "version": "0.0.0", "description": "Logentries chain link for logtify logger", "main": "src/index.js", @@ -21,6 +21,7 @@ "homepage": "https://github.com/dial-once/node-logtify-logentries#readme", "dependencies": { "le_node": "^1.7.0", + "logtify": "file:../node-logtify", "winston": "^2.3.1" }, "devDependencies": { diff --git a/src/index.js b/src/index.js index 550b3be..7277ce5 100644 --- a/src/index.js +++ b/src/index.js @@ -1,5 +1,9 @@ require('le_node'); const winston = require('winston'); +const logtify = require('logtify'); + +const chainBuffer = logtify.chainBuffer; +const { chain } = logtify(); /** @class Logentries @@ -14,20 +18,20 @@ const winston = require('winston'); Environment variables have a higher priority over a settings object parameters **/ -class Logentries { +class Logentries extends chain.ChainLink { /** @constructor Construct an instance of a Logentries @class @param configs {Object} - LoggerChain configuration object @param utility {Object} - Logtify common rules object **/ - constructor(configs, utility) { + constructor(configs) { + super(); this.settings = configs || {}; - this.utility = utility; + this.name = 'LOGENTRIES'; if (this.settings.LOGS_TOKEN) { this.token = this.settings.LOGS_TOKEN; this.winston = new winston.Logger(); - this.name = 'LOGENTRIES'; this.loggers = { [this.token]: this.winston.add(winston.transports.Logentries, { token: this.token }) }; @@ -36,26 +40,6 @@ class Logentries { } } - /** - @function next - @param message {Object} - a message package object - Envoke the handle @function of the next chain link if provided - **/ - next(message) { - if (this.nextLink) { - this.nextLink.handle(message); - } - } - - /** - @function link - Links current chain link to a next chain link - @param nextLink {Object} - an optional next link for current chain link - **/ - link(nextLink) { - this.nextLink = nextLink; - } - /** @function isReady Check if a chain link is configured properly and is ready to be used @@ -73,8 +57,9 @@ class Logentries { @return {boolean} - if this chain link is switched on / off **/ isEnabled() { - return ['true', 'false'].includes(process.env.LOGENTRIES_LOGGING) ? - process.env.LOGENTRIES_LOGGING === 'true' : !!this.settings.LOGENTRIES_LOGGING; + const result = ['true', 'false'].includes(process.env.LOGENTRIES_LOGGING) ? + process.env.LOGENTRIES_LOGGING === 'true' : this.settings.LOGENTRIES_LOGGING; + return [null, undefined].includes(result) ? true : result; } /** @@ -91,10 +76,9 @@ class Logentries { handle(message) { if (this.isReady() && this.isEnabled() && message) { const content = message.payload; - const logLevels = this.utility.logLevels; - const messageLevel = logLevels.has(content.level) ? content.level : logLevels.get('default'); - const minLogLevel = this.utility.getMinLogLevel(this.settings, this.name); - if (logLevels.get(messageLevel) >= logLevels.get(minLogLevel)) { + const messageLevel = this.logLevels.has(content.level) ? content.level : this.logLevels.get('default'); + const minLogLevel = this.getMinLogLevel(this.settings, this.name); + if (this.logLevels.get(messageLevel) >= this.logLevels.get(minLogLevel)) { const prefix = message.getPrefix(this.settings); this.winston.log(messageLevel, `${prefix}${content.text}`, content.meta); } @@ -111,10 +95,16 @@ module.exports = (config) => { const configs = Object.assign({ LOGS_TOKEN: process.env.LOGS_TOKEN || process.env.LOGENTRIES_TOKEN }, config); - return { + const chainLinkData = { class: Logentries, config: configs }; + + chainBuffer.addChainLink(chainLinkData); + const mergedConfigs = Object.assign({}, configs, chain.settings); + chain.push(new Logentries(mergedConfigs)); + + return chainLinkData; }; module.exports.LogentriesChainLink = Logentries; diff --git a/test/logentries-spec.js b/test/logentries-spec.js index c72faa2..6f0fbe3 100644 --- a/test/logentries-spec.js +++ b/test/logentries-spec.js @@ -1,8 +1,9 @@ const assert = require('assert'); const sinon = require('sinon'); const Logentries = require('../src/index'); -const Message = require('./mocks/message'); -const ChainLinkUtility = require('./mocks/utility'); +const { chain } = require('logtify')(); + +const { Message } = chain; describe('Logentries chain link ', () => { before(() => { @@ -25,7 +26,7 @@ describe('Logentries chain link ', () => { delete process.env.MIN_LOG_LEVEL_LOGENTRIES; }); - it('should return configs and a constructor', () => { + it('should process configs', () => { const logentriesPackage = Logentries(); assert.equal(typeof logentriesPackage, 'object'); assert.deepEqual(logentriesPackage.config, { LOGS_TOKEN: undefined }); @@ -33,19 +34,19 @@ describe('Logentries chain link ', () => { }); it('should return given configs and a constructor', () => { - const logentriesPackage = Logentries({ LOGS_TOKEN: '123' }); + const logentriesPackage = Logentries({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000' }); assert.equal(typeof logentriesPackage, 'object'); - assert.deepEqual(logentriesPackage.config, { LOGS_TOKEN: '123' }); + assert.deepEqual(logentriesPackage.config, { LOGS_TOKEN: '00000000-0000-0000-0000-000000000000' }); assert.equal(typeof logentriesPackage.class, 'function'); }); it('should not throw if no settings are given', () => { - const logentries = new this.LogentriesLink({}, new ChainLinkUtility()); + const logentries = new this.LogentriesLink({}); assert.equal(logentries.winston, undefined); }); it('should expose its main functions', () => { - const logentries = new this.LogentriesLink({}, new ChainLinkUtility()); + const logentries = new this.LogentriesLink({}); assert.equal(typeof logentries, 'object'); assert.equal(typeof logentries.next, 'function'); assert.equal(typeof logentries.isReady, 'function'); @@ -53,44 +54,37 @@ describe('Logentries chain link ', () => { assert.equal(typeof logentries.isReady, 'function'); assert.equal(typeof logentries.isEnabled, 'function'); assert.equal(typeof logentries.handle, 'function'); - assert(logentries.utility); - assert.equal(typeof logentries.utility.getMinLogLevel, 'function'); - assert(logentries.utility.logLevels); - assert(logentries.utility.logLevels instanceof Map); }); it('should print out a warning if no token provided', () => { const spy = sinon.spy(console, 'warn'); - const logentries = new this.LogentriesLink({}, new ChainLinkUtility()); + const logentries = new this.LogentriesLink({}); assert(spy.calledWith('Logentries logging was not initialized due to a missing token')); assert.equal(logentries.winston, undefined); }); it('should initialize with a token', () => { - const logentries = new this.LogentriesLink( - { LOGS_TOKEN: '00000000-0000-0000-0000-000000000000' }, - new ChainLinkUtility() - ); + const logentries = new this.LogentriesLink({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000' }); assert.notEqual(logentries.winston, undefined); }); it('should return true/false if initialized/not initialized', () => { - const logentries = new this.LogentriesLink({}, new ChainLinkUtility()); + const logentries = new this.LogentriesLink({}); assert.equal(logentries.isReady(), false); }); it('should indicate if it is switched on/off [settings]', () => { - let logentries = new this.LogentriesLink({ LOGENTRIES_LOGGING: true }, new ChainLinkUtility()); + let logentries = new this.LogentriesLink({ LOGENTRIES_LOGGING: true }); assert.equal(logentries.isEnabled(), true); - logentries = new this.LogentriesLink({ LOGENTRIES_LOGGING: false }, new ChainLinkUtility()); - assert.equal(logentries.isEnabled(), false); - logentries = new this.LogentriesLink(null, new ChainLinkUtility()); + logentries = new this.LogentriesLink({ LOGENTRIES_LOGGING: false }); assert.equal(logentries.isEnabled(), false); + logentries = new this.LogentriesLink(null); + assert.equal(logentries.isEnabled(), true); }); it('should indicate if it is switched on/off [envs]', () => { - const logentries = new this.LogentriesLink(null, new ChainLinkUtility()); - assert.equal(logentries.isEnabled(), false); + const logentries = new this.LogentriesLink(null); + assert.equal(logentries.isEnabled(), true); process.env.LOGENTRIES_LOGGING = true; assert.equal(logentries.isEnabled(), true); process.env.LOGENTRIES_LOGGING = false; @@ -98,7 +92,7 @@ describe('Logentries chain link ', () => { }); it('should indicate if it is switched on/off [envs should have more privilege]', () => { - const logentries = new this.LogentriesLink({ LOGENTRIES_LOGGING: true }, new ChainLinkUtility()); + const logentries = new this.LogentriesLink({ LOGENTRIES_LOGGING: true }); assert.equal(logentries.isEnabled(), true); process.env.LOGENTRIES_LOGGING = false; assert.equal(logentries.isEnabled(), false); @@ -110,7 +104,7 @@ describe('Logentries chain link ', () => { const logentries = new this.LogentriesLink({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', LOGENTRIES_LOGGING: true - }, new ChainLinkUtility()); + }); logentries.handle(null); }); @@ -118,7 +112,7 @@ describe('Logentries chain link ', () => { const logentries = new this.LogentriesLink({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', LOGENTRIES_LOGGING: true - }, new ChainLinkUtility()); + }); const spy = sinon.spy(logentries.winston.log); logentries.winston.log = spy; const message = new Message(); @@ -130,7 +124,7 @@ describe('Logentries chain link ', () => { const logentries = new this.LogentriesLink({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', LOGENTRIES_LOGGING: false - }, new ChainLinkUtility()); + }); const spy = sinon.spy(logentries.winston.log); logentries.winston.log = spy; const message = new Message(); @@ -143,7 +137,7 @@ describe('Logentries chain link ', () => { LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', LOGENTRIES_LOGGING: true, MIN_LOG_LEVEL: 'error' - }, new ChainLinkUtility()); + }); const spy = sinon.spy(logentries.winston.log); logentries.winston.log = spy; const message = new Message(); @@ -155,7 +149,7 @@ describe('Logentries chain link ', () => { const logentries = new this.LogentriesLink({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', LOGENTRIES_LOGGING: true - }, new ChainLinkUtility()); + }); const spy = sinon.spy(logentries.winston.log); logentries.winston.log = spy; const message = new Message(); @@ -168,7 +162,7 @@ describe('Logentries chain link ', () => { const logentries = new this.LogentriesLink({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', LOGENTRIES_LOGGING: true - }, new ChainLinkUtility()); + }); const spy = sinon.spy(logentries.winston.log); logentries.winston.log = spy; const message = new Message('warn'); @@ -182,7 +176,7 @@ describe('Logentries chain link ', () => { const logentries = new this.LogentriesLink({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', LOGENTRIES_LOGGING: true - }, new ChainLinkUtility()); + }); const spy = sinon.spy(logentries.winston.log); logentries.winston.log = spy; const message = new Message('error'); @@ -195,7 +189,7 @@ describe('Logentries chain link ', () => { const logentries = new this.LogentriesLink({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', LOGENTRIES_LOGGING: true - }, new ChainLinkUtility()); + }); const spy = sinon.spy(logentries.winston.log); logentries.winston.log = spy; const message = new Message('error'); diff --git a/test/mocks/message.js b/test/mocks/message.js deleted file mode 100644 index ce4ab67..0000000 --- a/test/mocks/message.js +++ /dev/null @@ -1,31 +0,0 @@ -const sinon = require('sinon'); - -function Message(logLevel, message, ...metas) { - // if plain text - this.payload = { - level: logLevel || 'info', - text: message || '', - meta: { - instanceId: process.env.HOSTNAME, - notify: true - } - }; - - // if error - if (message instanceof Error) { - this.payload.text = message.message || 'Error: '; - this.payload.meta.stack = message.stack; - this.payload.error = message; - } - // all metas are included as message meta - if (metas.length > 0) { - const metadata = metas.reduce((sum, next) => Object.assign({}, sum, next)); - Object.assign(this.payload.meta, metadata); - } - // originally deep-freeze is used - this.payload = Object.freeze(this.payload); -} - -Message.prototype.getPrefix = sinon.stub().returns(''); - -module.exports = Message; diff --git a/test/mocks/utility.js b/test/mocks/utility.js deleted file mode 100644 index dadc28c..0000000 --- a/test/mocks/utility.js +++ /dev/null @@ -1,21 +0,0 @@ -function ChainLinkUtility() { - const levels = [ - ['silly', 0], - ['verbose', 1], - ['debug', 2], - ['info', 3], - ['warn', 4], - ['error', 5], - ['default', 'info'] - ]; - this.logLevels = Object.freeze(new Map(levels)); -} - -ChainLinkUtility.prototype.getMinLogLevel = (config, chain = '') => { - const settings = config || {}; - const minLogLevel = process.env[`MIN_LOG_LEVEL_${chain}`] || settings[`MIN_LOG_LEVEL_${chain}`] || - process.env.MIN_LOG_LEVEL || settings.MIN_LOG_LEVEL; - return minLogLevel || 'info'; -}; - -module.exports = ChainLinkUtility; From eb6c035ba13ee9b0e50f0646e64eb54aa20d88bd Mon Sep 17 00:00:00 2001 From: Daniyil Vasylenko Date: Sun, 18 Jun 2017 14:46:48 +0300 Subject: [PATCH 5/6] Rx approach --- .npmignore | 4 +- README.md | 8 +- package-lock.json | 1096 ++++++++++++++++++++++++--------------- package.json | 2 +- src/index.js | 52 +- test/logentries-spec.js | 65 +-- 6 files changed, 719 insertions(+), 508 deletions(-) diff --git a/.npmignore b/.npmignore index 411cf25..3e1829a 100644 --- a/.npmignore +++ b/.npmignore @@ -5,8 +5,8 @@ coverage test .sonar .gitignore -.jshintignore -.jshintrc +.eslintignore +.eslintrc .npmignore Makefile sonar-project.properties diff --git a/README.md b/README.md index 60ce4c6..5d3c087 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # logtify-logentries [![CircleCI](https://circleci.com/gh/dial-once/node-logtify-logentries.svg?style=svg)](https://circleci.com/gh/dial-once/node-logtify-logentries) -Logentries chain link for [logtify](https://github.com/dial-once/node-logtify) logger +Logentries subscriber for [logtify](https://github.com/dial-once/node-logtify) logger ## Installation ``` @@ -13,18 +13,18 @@ Used with [logtify](https://github.com/dial-once/node-logtify) module. ```js require('logtify-logentries')({ LOGS_TOKEN: 'YOUR_LOGENTRIES_TOKEN' }); -const { chain, logger } = require('logtify')(); +const { stream, logger } = require('logtify')(); logger.log('error', new Error('Test error')); logger.info('Hello world!'); ``` -The chainLink will make sure that a message will be sent to Logentries if: +The subscriber will make sure that a message will be sent to Logentries if: * ``message.level >= 'MIN_LOG_LEVEL_LOGENTRIES' || 'MIN_LOG_LEVEL'`` * ``process.env.LOGENTRIES_LOGGING !== 'false' || settings.LOGENTRIES_LOGGING !== false`` ## Configuration **Environment variables**: -* ``process.env.LOGENTRIES_LOGGING = 'true|false'`` - Switching on / off the chain link. On by default +* ``process.env.LOGENTRIES_LOGGING = 'true|false'`` - Switching on / off the subscriber. On by default * ``process.env.LOGS_TOKEN = 'TOKEN'`` - your Logentries token * ``process.env.MIN_LOG_LEVEL_LOGENTRIES = 'silly|verbose|info|warn|error'`` diff --git a/package-lock.json b/package-lock.json index 6d35663..e656d03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,182 +1,211 @@ { - "name": "@dialonce/logtify-logentries", + "name": "logtify-logentries", "version": "0.0.0", "lockfileVersion": 1, "dependencies": { "abbrev": { - "version": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", "dev": true }, "acorn": { - "version": "https://registry.npmjs.org/acorn/-/acorn-5.0.3.tgz", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.0.3.tgz", "integrity": "sha1-xGDfCEkUY/AozLguqzcwvwEIez0=", "dev": true }, "acorn-jsx": { - "version": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "dependencies": { "acorn": { - "version": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", "dev": true } } }, "ajv": { - "version": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true }, "ajv-keywords": { - "version": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", "dev": true }, "align-text": { - "version": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true }, "amdefine": { - "version": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, "ansi-escapes": { - "version": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", "dev": true }, "ansi-regex": { - "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "ansi-styles": { - "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, "argparse": { - "version": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", "dev": true }, "array-union": { - "version": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true }, "array-uniq": { - "version": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "dev": true }, "array.prototype.find": { - "version": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.0.4.tgz", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.0.4.tgz", "integrity": "sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=", "dev": true }, "arrify": { - "version": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, "async": { - "version": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" }, "babel-code-frame": { - "version": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", "dev": true }, "babel-runtime": { - "version": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.6.1.tgz", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.6.1.tgz", "integrity": "sha1-eIuUtvY04luRvWxd9y1GdFevsAA=" }, "backoff": { - "version": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", "integrity": "sha1-9hbtqdPktmuMp/ynn2lXIsX44m8=" }, "balanced-match": { - "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", "dev": true }, "brace-expansion": { - "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", "dev": true }, "browser-stdout": { - "version": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", "dev": true }, - "buffer-shims": { - "version": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, "builtin-modules": { - "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", "dev": true }, "caller-path": { - "version": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true }, "callsites": { - "version": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", "dev": true }, "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", "dev": true, "optional": true }, "center-align": { - "version": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, "optional": true }, "chalk": { - "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true }, "circular-json": { - "version": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.1.tgz", "integrity": "sha1-vos2rvzN6LPKeqLWr8B6NyQsDS0=", "dev": true }, "cli-cursor": { - "version": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true }, "cli-width": { - "version": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", "dev": true }, "cliui": { - "version": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, "optional": true, "dependencies": { "wordwrap": { - "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", "dev": true, "optional": true @@ -184,664 +213,838 @@ } }, "co": { - "version": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, "code-point-at": { - "version": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "codependency": { - "version": "https://registry.npmjs.org/codependency/-/codependency-0.1.4.tgz", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/codependency/-/codependency-0.1.4.tgz", "integrity": "sha1-0XY6tyZL1wyR2WJumIYtN5K/jUo=", "dependencies": { "semver": { - "version": "https://registry.npmjs.org/semver/-/semver-5.0.1.tgz", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.1.tgz", "integrity": "sha1-n7P0AE+QDYPEeWj+QvdYPgWDLMk=" } } }, "colors": { - "version": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" }, "commander": { - "version": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", "dev": true }, "concat-map": { - "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "concat-stream": { - "version": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "dev": true }, "contains-path": { - "version": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "dev": true }, "core-js": { - "version": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" }, "core-util-is": { - "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "cycle": { - "version": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" }, "d": { - "version": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true }, "damerau-levenshtein": { - "version": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz", "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=", "dev": true }, "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.6.6.tgz", - "integrity": "sha1-qfpvvpykPPHnn3O3XAGJy7fW21o=", + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", "dev": true }, "decamelize": { - "version": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true, "optional": true }, "deep-is": { - "version": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, "define-properties": { - "version": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "dev": true }, "del": { - "version": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true }, "diff": { - "version": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", "dev": true }, "doctrine": { - "version": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", "dev": true }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true + }, "es-abstract": { - "version": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.7.0.tgz", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.7.0.tgz", "integrity": "sha1-363ndOAb/Nl/lhgCmMRJyGI/uUw=", "dev": true }, "es-to-primitive": { - "version": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "dev": true }, "es5-ext": { - "version": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.16.tgz", - "integrity": "sha1-HvGwTz0J22pdYwIm1iIC8uQl5Fo=", + "version": "0.10.22", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.22.tgz", + "integrity": "sha512-YXTXSlZkJsVwMEVljp1Bh5P9+Raa3524OMl9kywGMp1aazKTCnAqORRL/8dkuqNHk+LRYe0LezuS8PlUt3+mOw==", "dev": true }, "es6-iterator": { - "version": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", "dev": true }, "es6-map": { - "version": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "dev": true }, "es6-set": { - "version": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true }, "es6-symbol": { - "version": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true }, "es6-weak-map": { - "version": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "dev": true }, "escape-string-regexp": { - "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "escodegen": { - "version": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", "dev": true, "dependencies": { "esprima": { - "version": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", "dev": true }, "estraverse": { - "version": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", "dev": true } } }, "escope": { - "version": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true }, "eslint": { - "version": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", "dev": true, "dependencies": { "lodash": { - "version": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", "dev": true } } }, "eslint-config-airbnb": { - "version": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-13.0.0.tgz", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-13.0.0.tgz", "integrity": "sha1-aI0V08J2wMdTrlOMkqRDl9dq5G4=", "dev": true }, "eslint-config-airbnb-base": { - "version": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-10.0.1.tgz", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-10.0.1.tgz", "integrity": "sha1-8X1OUpksHUXRt3E++81ezQ5+BQY=", "dev": true }, "eslint-import-resolver-node": { - "version": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", "dev": true }, "eslint-module-utils": { - "version": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.0.0.tgz", "integrity": "sha1-pvjCHZATWHWc3DXbrBmCrh7li84=", "dev": true, "dependencies": { "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true }, "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true } } }, "eslint-plugin-import": { - "version": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", - "integrity": "sha1-crowb60wXWfEgWNIpGmaQimsi04=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.3.0.tgz", + "integrity": "sha1-N8gB4K2g4pbL3yDD85OstbUq82s=", "dev": true, "dependencies": { "doctrine": { - "version": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true } } }, "eslint-plugin-jsx-a11y": { - "version": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-2.2.3.tgz", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-2.2.3.tgz", "integrity": "sha1-TjXLcbin23AqxBXIBuuOjZ6mxl0=", "dev": true }, "eslint-plugin-react": { - "version": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz", "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", "dev": true, "dependencies": { "doctrine": { - "version": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true } } }, "espree": { - "version": "https://registry.npmjs.org/espree/-/espree-3.4.3.tgz", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.4.3.tgz", "integrity": "sha1-KRC1zNSc6JPC//+qtP2LOjG4I3Q=", "dev": true }, "esprima": { - "version": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", "dev": true }, "esquery": { - "version": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", "dev": true }, "esrecurse": { - "version": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.1.0.tgz", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.1.0.tgz", "integrity": "sha1-RxO2U2rffyrE8yfVWed1a/9kgiA=", "dev": true, "dependencies": { "estraverse": { - "version": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.1.1.tgz", "integrity": "sha1-9srKcokzqFDvkGYdDheYK6RxEaI=", "dev": true } } }, "estraverse": { - "version": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", "dev": true }, "esutils": { - "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, "event-emitter": { - "version": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true }, "exit-hook": { - "version": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", "dev": true }, "eyes": { - "version": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" }, "fast-levenshtein": { - "version": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, "figures": { - "version": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true }, "file-entry-cache": { - "version": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true }, "find-up": { - "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true }, "flat-cache": { - "version": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", "dev": true }, "foreach": { - "version": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", "dev": true }, "formatio": { - "version": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", "dev": true }, "fs.realpath": { - "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "function-bind": { - "version": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", "dev": true }, "generate-function": { - "version": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", "dev": true }, "generate-object-property": { - "version": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", "dev": true }, "glob": { - "version": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true }, "globals": { - "version": "https://registry.npmjs.org/globals/-/globals-9.17.0.tgz", + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.17.0.tgz", "integrity": "sha1-DAymltm5u2lNLlRwvTd3fKrVAoY=", "dev": true }, "globby": { - "version": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true }, "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, "graceful-readlink": { - "version": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", "dev": true }, "growl": { - "version": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", "dev": true }, "handlebars": { - "version": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.8.tgz", - "integrity": "sha1-Irh1zT8ObL6jAxTxROgrx6cv9CA=", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", + "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", "dev": true, "dependencies": { "async": { - "version": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true } } }, "has": { - "version": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "dev": true }, "has-ansi": { - "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true }, "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, + "hosted-git-info": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz", + "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=", + "dev": true + }, "ignore": { - "version": "https://registry.npmjs.org/ignore/-/ignore-3.3.0.tgz", - "integrity": "sha1-OBLSLL6RJfLCtJFXVaG4q9dFoAE=", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", + "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=", "dev": true }, "imurmurhash": { - "version": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "inflight": { - "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true }, "inherits": { - "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "inquirer": { - "version": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", "dev": true, "dependencies": { "lodash": { - "version": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", "dev": true } } }, "interpret": { - "version": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", "dev": true }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, "is-buffer": { - "version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", "dev": true }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true + }, "is-callable": { - "version": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", "dev": true }, "is-date-object": { - "version": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", "dev": true }, "is-fullwidth-code-point": { - "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true }, "is-my-json-valid": { - "version": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", "dev": true }, "is-path-cwd": { - "version": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", "dev": true }, "is-path-in-cwd": { - "version": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", "dev": true }, "is-path-inside": { - "version": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", "dev": true }, "is-property": { - "version": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", "dev": true }, "is-regex": { - "version": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true }, "is-resolvable": { - "version": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", "dev": true }, "is-symbol": { - "version": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", "dev": true }, "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isexe": { - "version": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "isstream": { - "version": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul": { - "version": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", "dev": true, "dependencies": { "esprima": { - "version": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", "dev": true }, "glob": { - "version": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true }, "resolve": { - "version": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true } } }, "js-tokens": { - "version": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=", "dev": true }, "js-yaml": { - "version": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.4.tgz", + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.8.4.tgz", "integrity": "sha1-UgtFZPhlc7qWZir4Woyvp7S1pvY=", "dev": true }, "json-stable-stringify": { - "version": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true }, "json-stringify-safe": { - "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json3": { - "version": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", "dev": true }, "jsonify": { - "version": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, "jsonpointer": { - "version": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", "dev": true }, "jsx-ast-utils": { - "version": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", "dev": true }, "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.0.tgz", - "integrity": "sha1-tYq+TVwEStM3JqjBUltIz4kb/wc=", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true }, "lazy-cache": { - "version": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", "dev": true, "optional": true }, "le_node": { - "version": "https://registry.npmjs.org/le_node/-/le_node-1.7.0.tgz", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/le_node/-/le_node-1.7.0.tgz", "integrity": "sha1-EE5jTLTwvl/XBgNIg33vYTOospc=" }, "levn": { - "version": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, "lodash": { - "version": "https://registry.npmjs.org/lodash/-/lodash-3.9.3.tgz", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.9.3.tgz", "integrity": "sha1-AVnoaDL+/8bWHYUrEqlTuZSWvTI=" }, "lodash._baseassign": { - "version": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", "dev": true }, "lodash._basecopy": { - "version": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", "dev": true }, "lodash._basecreate": { - "version": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", "dev": true }, "lodash._getnative": { - "version": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", "dev": true }, "lodash._isiterateecall": { - "version": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", "dev": true }, "lodash.cond": { - "version": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", "dev": true }, "lodash.create": { - "version": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", "dev": true }, "lodash.isarguments": { - "version": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", "dev": true }, "lodash.isarray": { - "version": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", "dev": true }, "lodash.keys": { - "version": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "dev": true }, @@ -858,13 +1061,7 @@ }, "acorn-jsx": { "version": "3.0.1", - "bundled": true, - "dependencies": { - "acorn": { - "version": "3.3.0", - "bundled": true - } - } + "bundled": true }, "ajv": { "version": "4.11.8", @@ -880,7 +1077,8 @@ }, "amdefine": { "version": "1.0.1", - "bundled": true + "bundled": true, + "optional": true }, "ansi-escapes": { "version": "1.4.0", @@ -975,14 +1173,7 @@ "cliui": { "version": "2.1.0", "bundled": true, - "optional": true, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "bundled": true, - "optional": true - } - } + "optional": true }, "co": { "version": "4.6.0", @@ -1103,17 +1294,7 @@ }, "escodegen": { "version": "1.8.1", - "bundled": true, - "dependencies": { - "esprima": { - "version": "2.7.3", - "bundled": true - }, - "estraverse": { - "version": "1.9.3", - "bundled": true - } - } + "bundled": true }, "escope": { "version": "3.6.0", @@ -1137,27 +1318,11 @@ }, "eslint-module-utils": { "version": "2.0.0", - "bundled": true, - "dependencies": { - "debug": { - "version": "2.2.0", - "bundled": true - }, - "ms": { - "version": "0.7.1", - "bundled": true - } - } + "bundled": true }, "eslint-plugin-import": { "version": "2.3.0", - "bundled": true, - "dependencies": { - "doctrine": { - "version": "1.5.0", - "bundled": true - } - } + "bundled": true }, "eslint-plugin-jsx-a11y": { "version": "2.2.3", @@ -1165,13 +1330,7 @@ }, "eslint-plugin-react": { "version": "6.10.3", - "bundled": true, - "dependencies": { - "doctrine": { - "version": "1.5.0", - "bundled": true - } - } + "bundled": true }, "espree": { "version": "3.4.3", @@ -1187,13 +1346,7 @@ }, "esrecurse": { "version": "4.1.0", - "bundled": true, - "dependencies": { - "estraverse": { - "version": "4.1.1", - "bundled": true - } - } + "bundled": true }, "estraverse": { "version": "4.2.0", @@ -1285,17 +1438,7 @@ }, "handlebars": { "version": "4.0.10", - "bundled": true, - "dependencies": { - "async": { - "version": "1.5.2", - "bundled": true - }, - "source-map": { - "version": "0.4.4", - "bundled": true - } - } + "bundled": true }, "has": { "version": "1.0.1", @@ -1407,25 +1550,7 @@ }, "istanbul": { "version": "0.4.5", - "bundled": true, - "dependencies": { - "esprima": { - "version": "2.7.3", - "bundled": true - }, - "glob": { - "version": "5.0.15", - "bundled": true - }, - "resolve": { - "version": "1.1.7", - "bundled": true - }, - "supports-color": { - "version": "3.2.3", - "bundled": true - } - } + "bundled": true }, "js-tokens": { "version": "3.0.1", @@ -1474,13 +1599,7 @@ }, "locate-path": { "version": "2.0.0", - "bundled": true, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "bundled": true - } - } + "bundled": true }, "lodash": { "version": "4.17.4", @@ -1548,25 +1667,7 @@ }, "mocha": { "version": "3.4.2", - "bundled": true, - "dependencies": { - "debug": { - "version": "2.6.0", - "bundled": true - }, - "glob": { - "version": "7.1.1", - "bundled": true - }, - "ms": { - "version": "0.7.2", - "bundled": true - }, - "supports-color": { - "version": "3.1.2", - "bundled": true - } - } + "bundled": true }, "ms": { "version": "2.0.0", @@ -1614,13 +1715,7 @@ }, "optimist": { "version": "0.6.1", - "bundled": true, - "dependencies": { - "wordwrap": { - "version": "0.0.3", - "bundled": true - } - } + "bundled": true }, "optionator": { "version": "0.8.2", @@ -1700,13 +1795,7 @@ }, "read-pkg-up": { "version": "2.0.0", - "bundled": true, - "dependencies": { - "find-up": { - "version": "2.1.0", - "bundled": true - } - } + "bundled": true }, "readable-stream": { "version": "2.2.10", @@ -1832,17 +1921,7 @@ }, "table": { "version": "3.8.3", - "bundled": true, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true - }, - "string-width": { - "version": "2.0.0", - "bundled": true - } - } + "bundled": true }, "text-table": { "version": "0.2.0", @@ -1867,14 +1946,7 @@ "uglify-js": { "version": "2.8.27", "bundled": true, - "optional": true, - "dependencies": { - "source-map": { - "version": "0.5.6", - "bundled": true, - "optional": true - } - } + "optional": true }, "uglify-to-browserify": { "version": "1.0.2", @@ -1887,13 +1959,7 @@ }, "util": { "version": "0.10.3", - "bundled": true, - "dependencies": { - "inherits": { - "version": "2.0.1", - "bundled": true - } - } + "bundled": true }, "util-deprecate": { "version": "1.0.2", @@ -1940,382 +2006,531 @@ } }, "lolex": { - "version": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", "dev": true }, "longest": { - "version": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", "dev": true }, "minimatch": { - "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true }, "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, "mkdirp": { - "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true }, "mocha": { - "version": "https://registry.npmjs.org/mocha/-/mocha-3.3.0.tgz", - "integrity": "sha1-0pt0KNP1LILi5l3x7LcGThqrv7U=", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.4.2.tgz", + "integrity": "sha1-0O9NMyEm2/GNDWQMmzgt1IvpdZQ=", "dev": true, "dependencies": { "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.6.0.tgz", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.0.tgz", "integrity": "sha1-vFlryr52F/Edn6FTYe3tVgi4SZs=", "dev": true }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true + }, "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", "dev": true }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", "dev": true } } }, "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", - "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "mute-stream": { - "version": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", "dev": true }, "natural-compare": { - "version": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, "nopt": { - "version": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true }, + "normalize-package-data": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz", + "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=", + "dev": true + }, "number-is-nan": { - "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "object-assign": { - "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, "object-keys": { - "version": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", "dev": true }, "object.assign": { - "version": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", "dev": true }, "once": { - "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true }, "onetime": { - "version": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, "optimist": { - "version": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "dependencies": { "wordwrap": { - "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "dev": true } } }, "optionator": { - "version": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true }, "os-homedir": { - "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true + }, "path-exists": { - "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true }, "path-is-absolute": { - "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-is-inside": { - "version": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", "dev": true }, "path-parse": { - "version": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", "dev": true }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true + }, "pify": { - "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, "pinkie": { - "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", "dev": true }, "pinkie-promise": { - "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true }, "pkg-dir": { - "version": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dev": true }, - "pkg-up": { - "version": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", - "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", - "dev": true - }, "pluralize": { - "version": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", "dev": true }, "precond": { - "version": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", "integrity": "sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw=" }, "prelude-ls": { - "version": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, "process-nextick-args": { - "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "dev": true }, "progress": { - "version": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", "dev": true }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true + } + } + }, "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", - "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.10.tgz", + "integrity": "sha512-HQEnnoV404e0EtwB9yNiuk2tJ+egeVC8Y9QBAxzDg8DBJt4BzRp+yQuIb/t3FIWkSTmIi+sgx7yVv/ZM0GNoqw==", "dev": true }, "readline2": { - "version": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", "dev": true }, "rechoir": { - "version": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true }, "reconnect-core": { - "version": "https://registry.npmjs.org/reconnect-core/-/reconnect-core-1.3.0.tgz", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/reconnect-core/-/reconnect-core-1.3.0.tgz", "integrity": "sha1-+65SkZp4d9hE4yRtAaLyZwHIM8g=" }, "repeat-string": { - "version": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, "require-uncached": { - "version": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true }, "resolve": { - "version": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", "dev": true }, "resolve-from": { - "version": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", "dev": true }, "restore-cursor": { - "version": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true }, "right-align": { - "version": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, "optional": true }, "rimraf": { - "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", "dev": true }, "run-async": { - "version": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", "dev": true }, "rx-lite": { - "version": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", "dev": true }, + "safe-buffer": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.0.tgz", + "integrity": "sha512-aSLEDudu6OoRr/2rU609gRmnYboRLxgDG1z9o2Q0os7236FwvcqIOO8r8U5JUEwivZOhDaKlFO4SbPTJYyBEyQ==", + "dev": true + }, "samsam": { - "version": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", "dev": true }, "semver": { - "version": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU=" }, "shelljs": { - "version": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.7.tgz", + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.7.tgz", "integrity": "sha1-svXHfvlxSPS09uImguELuoZnz/E=", "dev": true }, "sinon": { - "version": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", "dev": true }, "slice-ansi": { - "version": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", "dev": true }, "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", "dev": true, "optional": true }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, "sprintf-js": { - "version": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "stack-trace": { - "version": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", - "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=" + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" }, "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz", - "integrity": "sha1-8G9BFXtmTYYGn4S9vcmw2KsoFmc=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", + "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", "dev": true }, "string-width": { - "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true }, "strip-ansi": { - "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true }, "strip-bom": { - "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, "strip-json-comments": { - "version": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, "table": { - "version": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "dev": true, "dependencies": { "is-fullwidth-code-point": { - "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "lodash": { - "version": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", "dev": true }, "string-width": { - "version": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", "dev": true } } }, "text-table": { - "version": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, "through": { - "version": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "tryit": { - "version": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", "dev": true }, "type-check": { - "version": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true }, "typedarray": { - "version": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, "uglify-js": { - "version": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.23.tgz", - "integrity": "sha1-gjDdl4M3EjLWKngh4s+agXJwqKA=", + "version": "2.8.28", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.28.tgz", + "integrity": "sha512-WqKNbmNJKzIdIEQu/U2ytgGBbhCy2PVks94GoetczOAJ/zCgVu2CuO7gguI5KPFGPtUtI1dmPQl6h0D4cPzypA==", "dev": true, "optional": true, "dependencies": { "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", "dev": true, "optional": true @@ -2323,70 +2538,89 @@ } }, "uglify-to-browserify": { - "version": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "dev": true, "optional": true }, "user-home": { - "version": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", "dev": true }, "util": { - "version": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "dependencies": { "inherits": { - "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", "dev": true } } }, "util-deprecate": { - "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true + }, "which": { - "version": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", "dev": true }, "window-size": { - "version": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", "dev": true, "optional": true }, "winston": { - "version": "https://registry.npmjs.org/winston/-/winston-2.3.1.tgz", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.3.1.tgz", "integrity": "sha1-C0hCDZeMAYBM8CMLZIhhWYIloRk=" }, "wordwrap": { - "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, "wrappy": { - "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "write": { - "version": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true }, "xtend": { - "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true }, "yargs": { - "version": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "optional": true diff --git a/package.json b/package.json index f815887..813e9de 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "homepage": "https://github.com/dial-once/node-logtify-logentries#readme", "dependencies": { "le_node": "^1.7.0", - "logtify": "file:../node-logtify", + "logtify": "^1.0.0", "winston": "^2.3.1" }, "devDependencies": { diff --git a/src/index.js b/src/index.js index 7277ce5..51d87f9 100644 --- a/src/index.js +++ b/src/index.js @@ -2,27 +2,27 @@ require('le_node'); const winston = require('winston'); const logtify = require('logtify'); -const chainBuffer = logtify.chainBuffer; -const { chain } = logtify(); +const streamBuffer = logtify.streamBuffer; +const { stream } = logtify(); /** @class Logentries - A Logentries logger chain link + A Logentries logger subscriber Has the following configurations (either env var or settings param): - - LOGENTRIES_LOGGING {'true'|'false'} - switches on / off the use of this chain link + - LOGENTRIES_LOGGING {'true'|'false'} - switches on / off the use of this subscriber - MIN_LOG_LEVEL_LOGENTRIES = {'silly'|'verbose'|'debug'|'info'|'warn'|'error'} - min log level of a message to log This config has a higher priority than a global DEFAULT_LOG_LEVEl config - @see ChainLink @class for info on the log level priorities + @see Subscriber @class for info on the log level priorities If a message's level is >= than a MIN_LOG_LEVEL_CONSOLE - it will be notified. Otherwise - skipped Environment variables have a higher priority over a settings object parameters **/ -class Logentries extends chain.ChainLink { +class Logentries extends stream.Subscriber { /** @constructor Construct an instance of a Logentries @class - @param configs {Object} - LoggerChain configuration object + @param configs {Object} - LoggerStream configuration object @param utility {Object} - Logtify common rules object **/ constructor(configs) { @@ -42,7 +42,7 @@ class Logentries extends chain.ChainLink { /** @function isReady - Check if a chain link is configured properly and is ready to be used + Check if a subscriber is configured properly and is ready to be used @return {boolean} **/ isReady() { @@ -51,10 +51,10 @@ class Logentries extends chain.ChainLink { /** @function isEnabled - Check if a chain link will be used + Check if a subscriber will be used Depends on configuration env variables / settings object parameters Checks LOGENTRIES_LOGGING env / settings object param - @return {boolean} - if this chain link is switched on / off + @return {boolean} - if this subscriber is switched on / off **/ isEnabled() { const result = ['true', 'false'].includes(process.env.LOGENTRIES_LOGGING) ? @@ -64,14 +64,10 @@ class Logentries extends chain.ChainLink { /** @function handle - Process a message and log it if the chain link is switched on and message's log level is >= than MIN_LOG_LEVEL - Finally, pass the message to the next chain link if any + Process a message and log it if the subscriber is switched on and message's log level is >= than MIN_LOG_LEVEL + Finally, pass the message to the next subscriber if any @param message {Object} - message package object - @see LoggerChain message package object structure description - - This function is NOT ALLOWED to modify the message - This function HAS to invoke the next() @function and pass the message further along the chain - This function HAS to check message level priority and skip if lower than MIN_LOG_LEVEL + @see LoggerStream message package object structure description **/ handle(message) { if (this.isReady() && this.isEnabled() && message) { @@ -80,31 +76,33 @@ class Logentries extends chain.ChainLink { const minLogLevel = this.getMinLogLevel(this.settings, this.name); if (this.logLevels.get(messageLevel) >= this.logLevels.get(minLogLevel)) { const prefix = message.getPrefix(this.settings); - this.winston.log(messageLevel, `${prefix}${content.text}`, content.meta); + const messageText = !prefix.isEmpty ? + `[${prefix.timestamp}${prefix.environment}${prefix.logLevel}${prefix.reqId}]${content.text}` : + content.text; + this.winston.log(messageLevel, messageText, content.meta); } } - this.next(message); } } /** - @param config {Object} - chain link configuration - @return { object } - chain link object with a class + @param config {Object} - subscriber configuration + @return { object } - subscriber object with a class **/ module.exports = (config) => { const configs = Object.assign({ LOGS_TOKEN: process.env.LOGS_TOKEN || process.env.LOGENTRIES_TOKEN }, config); - const chainLinkData = { + const streamLinkData = { class: Logentries, config: configs }; - chainBuffer.addChainLink(chainLinkData); - const mergedConfigs = Object.assign({}, configs, chain.settings); - chain.push(new Logentries(mergedConfigs)); + streamBuffer.addSubscriber(streamLinkData); + const mergedConfigs = Object.assign({}, configs, stream.settings); + stream.subscribe(new Logentries(mergedConfigs)); - return chainLinkData; + return streamLinkData; }; -module.exports.LogentriesChainLink = Logentries; +module.exports.LogentriesSubscriber = Logentries; diff --git a/test/logentries-spec.js b/test/logentries-spec.js index 6f0fbe3..1988ecd 100644 --- a/test/logentries-spec.js +++ b/test/logentries-spec.js @@ -1,11 +1,11 @@ const assert = require('assert'); const sinon = require('sinon'); const Logentries = require('../src/index'); -const { chain } = require('logtify')(); +const { stream } = require('logtify')(); -const { Message } = chain; +const { Message } = stream; -describe('Logentries chain link ', () => { +describe('Logentries subscriber ', () => { before(() => { delete process.env.LOGENTRIES_LOGGING; delete process.env.MIN_LOG_LEVEL; @@ -17,7 +17,7 @@ describe('Logentries chain link ', () => { beforeEach(() => { const logentriesPackage = Logentries(); - this.LogentriesLink = logentriesPackage.class; + this.LogentriesSubscriber = logentriesPackage.class; }); afterEach(() => { @@ -41,16 +41,13 @@ describe('Logentries chain link ', () => { }); it('should not throw if no settings are given', () => { - const logentries = new this.LogentriesLink({}); + const logentries = new this.LogentriesSubscriber({}); assert.equal(logentries.winston, undefined); }); it('should expose its main functions', () => { - const logentries = new this.LogentriesLink({}); + const logentries = new this.LogentriesSubscriber({}); assert.equal(typeof logentries, 'object'); - assert.equal(typeof logentries.next, 'function'); - assert.equal(typeof logentries.isReady, 'function'); - assert.equal(typeof logentries.link, 'function'); assert.equal(typeof logentries.isReady, 'function'); assert.equal(typeof logentries.isEnabled, 'function'); assert.equal(typeof logentries.handle, 'function'); @@ -58,32 +55,32 @@ describe('Logentries chain link ', () => { it('should print out a warning if no token provided', () => { const spy = sinon.spy(console, 'warn'); - const logentries = new this.LogentriesLink({}); + const logentries = new this.LogentriesSubscriber({}); assert(spy.calledWith('Logentries logging was not initialized due to a missing token')); assert.equal(logentries.winston, undefined); }); it('should initialize with a token', () => { - const logentries = new this.LogentriesLink({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000' }); + const logentries = new this.LogentriesSubscriber({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000' }); assert.notEqual(logentries.winston, undefined); }); it('should return true/false if initialized/not initialized', () => { - const logentries = new this.LogentriesLink({}); + const logentries = new this.LogentriesSubscriber({}); assert.equal(logentries.isReady(), false); }); it('should indicate if it is switched on/off [settings]', () => { - let logentries = new this.LogentriesLink({ LOGENTRIES_LOGGING: true }); + let logentries = new this.LogentriesSubscriber({ LOGENTRIES_LOGGING: true }); assert.equal(logentries.isEnabled(), true); - logentries = new this.LogentriesLink({ LOGENTRIES_LOGGING: false }); + logentries = new this.LogentriesSubscriber({ LOGENTRIES_LOGGING: false }); assert.equal(logentries.isEnabled(), false); - logentries = new this.LogentriesLink(null); + logentries = new this.LogentriesSubscriber(null); assert.equal(logentries.isEnabled(), true); }); it('should indicate if it is switched on/off [envs]', () => { - const logentries = new this.LogentriesLink(null); + const logentries = new this.LogentriesSubscriber(null); assert.equal(logentries.isEnabled(), true); process.env.LOGENTRIES_LOGGING = true; assert.equal(logentries.isEnabled(), true); @@ -92,7 +89,7 @@ describe('Logentries chain link ', () => { }); it('should indicate if it is switched on/off [envs should have more privilege]', () => { - const logentries = new this.LogentriesLink({ LOGENTRIES_LOGGING: true }); + const logentries = new this.LogentriesSubscriber({ LOGENTRIES_LOGGING: true }); assert.equal(logentries.isEnabled(), true); process.env.LOGENTRIES_LOGGING = false; assert.equal(logentries.isEnabled(), false); @@ -101,7 +98,7 @@ describe('Logentries chain link ', () => { }); it('should not break down if null is notified', () => { - const logentries = new this.LogentriesLink({ + const logentries = new this.LogentriesSubscriber({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', LOGENTRIES_LOGGING: true }); @@ -109,7 +106,7 @@ describe('Logentries chain link ', () => { }); it('should log message if LOGENTRIES_LOGGING = true', () => { - const logentries = new this.LogentriesLink({ + const logentries = new this.LogentriesSubscriber({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', LOGENTRIES_LOGGING: true }); @@ -121,7 +118,7 @@ describe('Logentries chain link ', () => { }); it('should not log message if LOGENTRIES_LOGGING = false', () => { - const logentries = new this.LogentriesLink({ + const logentries = new this.LogentriesSubscriber({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', LOGENTRIES_LOGGING: false }); @@ -133,7 +130,7 @@ describe('Logentries chain link ', () => { }); it('should not log if message level < MIN_LOG_LEVEL [settings]', () => { - const logentries = new this.LogentriesLink({ + const logentries = new this.LogentriesSubscriber({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', LOGENTRIES_LOGGING: true, MIN_LOG_LEVEL: 'error' @@ -146,7 +143,7 @@ describe('Logentries chain link ', () => { }); it('should not log if message level < MIN_LOG_LEVEL [envs]', () => { - const logentries = new this.LogentriesLink({ + const logentries = new this.LogentriesSubscriber({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', LOGENTRIES_LOGGING: true }); @@ -159,7 +156,7 @@ describe('Logentries chain link ', () => { }); it('should not log if message level >= MIN_LOG_LEVEL_LOGENTRIES but < MIN_LOG_LEVEL [envs]', () => { - const logentries = new this.LogentriesLink({ + const logentries = new this.LogentriesSubscriber({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', LOGENTRIES_LOGGING: true }); @@ -173,7 +170,7 @@ describe('Logentries chain link ', () => { }); it('should log if message level = MIN_LOG_LEVEL [envs]', () => { - const logentries = new this.LogentriesLink({ + const logentries = new this.LogentriesSubscriber({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', LOGENTRIES_LOGGING: true }); @@ -186,7 +183,7 @@ describe('Logentries chain link ', () => { }); it('should log if message level > MIN_LOG_LEVEL [envs]', () => { - const logentries = new this.LogentriesLink({ + const logentries = new this.LogentriesSubscriber({ LOGS_TOKEN: '00000000-0000-0000-0000-000000000000', LOGENTRIES_LOGGING: true }); @@ -197,22 +194,4 @@ describe('Logentries chain link ', () => { logentries.handle(message); assert(spy.called); }); - - it('should not throw if next link does not exist', () => { - const chainLink = new this.LogentriesLink(); - chainLink.next(); - }); - - it('should link a new chainLink', () => { - const chainLink = new this.LogentriesLink(); - const spy = sinon.spy(sinon.stub()); - const mock = { - handle: spy - }; - assert.equal(chainLink.nextLink, null); - chainLink.link(mock); - assert.equal(typeof chainLink.nextLink, 'object'); - chainLink.next(); - assert(spy.called); - }); }); From 88684e5a8c862bc69b947a52ed3c5e0f93e3a0c8 Mon Sep 17 00:00:00 2001 From: Daniyil Vasylenko Date: Thu, 6 Jul 2017 16:53:49 +0300 Subject: [PATCH 6/6] Bump to version 1.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 813e9de..54d6eef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "logtify-logentries", - "version": "0.0.0", + "version": "1.0.0", "description": "Logentries chain link for logtify logger", "main": "src/index.js", "directories": {