diff --git a/docker-compose.yml b/docker-compose.yml index c4eaa9a..34267a1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -83,6 +83,17 @@ services: - "7020:7020" - "7357:7357" + event-processor: + <<: *node + working_dir: /parcel-plug/services/event-processor + entrypoint: ["/parcel-plug/node_modules/.bin/gulp"] + environment: + <<: *env + ACCOUNT_KEY: devel + MONGO_DSN: mongodb://mongodb:27017/parcel-plug + depends_on: + - mongodb + volumes: mongodb: {} yarn-cache: {} diff --git a/scripts/deploy-rancher.sh b/scripts/deploy-rancher.sh index 25807dc..3ca0f7b 100755 --- a/scripts/deploy-rancher.sh +++ b/scripts/deploy-rancher.sh @@ -7,5 +7,6 @@ deploy-to-rancher "nginx:alpine" manage-nginx deploy-to-rancher "basecms/parcel-plug:${TRAVIS_TAG}" manage deploy-to-rancher "basecms/parcel-plug:${TRAVIS_TAG}" graphql deploy-to-rancher "basecms/parcel-plug:${TRAVIS_TAG}" delivery +deploy-to-rancher "basecms/parcel-plug:${TRAVIS_TAG}" event-processor ./scripts/deploy-notify.sh diff --git a/services/event-processor/.eslintrc.js b/services/event-processor/.eslintrc.js new file mode 100644 index 0000000..8cd5537 --- /dev/null +++ b/services/event-processor/.eslintrc.js @@ -0,0 +1,10 @@ +const { join } = require('path'); + +module.exports = { + rules: { + 'import/no-extraneous-dependencies': [ + 'error', + { packageDir: [join(__dirname, 'package.json'), join(__dirname, '../../package.json')] }, + ], + }, +}; diff --git a/services/event-processor/gulpfile.js b/services/event-processor/gulpfile.js new file mode 100644 index 0000000..4c6832b --- /dev/null +++ b/services/event-processor/gulpfile.js @@ -0,0 +1,36 @@ +const { + task, + watch, + src, + parallel, +} = require('gulp'); +const eslint = require('gulp-eslint'); +const cache = require('gulp-cached'); +const { spawn } = require('child_process'); + +const { log } = console; + +let node; + +const serve = async () => { + if (node) node.kill(); + node = await spawn('node', ['src/index.js'], { stdio: 'inherit' }); + node.on('close', (code) => { + if (code === 8) { + log('Error detected, waiting for changes...'); + } + }); +}; + +const lint = () => src(['src/**/*.js']) + .pipe(cache('lint')) + .pipe(eslint()) + .pipe(eslint.format()); + +task('default', () => { + watch( + ['src/**/*.js'], + { queue: false, ignoreInitial: false }, + parallel([serve, lint]), + ); +}); diff --git a/services/event-processor/newrelic.js b/services/event-processor/newrelic.js new file mode 100644 index 0000000..d58bf9c --- /dev/null +++ b/services/event-processor/newrelic.js @@ -0,0 +1,58 @@ +/** + * New Relic agent configuration. + * + * See lib/config/default.js in the agent distribution for a more complete + * description of configuration variables and their potential values. + */ +exports.config = { + /** + * Array of application names. + */ + app_name: ['email-x/event-processor-service'], + /** + * Your New Relic license key. + */ + license_key: process.env.NEW_RELIC_LICENSE_KEY, + logging: { + /** + * Level at which to log. 'trace' is most useful to New Relic when diagnosing + * issues with the agent, 'info' and higher will impose the least overhead on + * production applications. + */ + level: 'info', + }, + /** + * Alias that should be ignored by New Relic. + */ + rules: { + ignore: [/^\/_health$/], + }, + /** + * When true, all request headers except for those listed in attributes.exclude + * will be captured for all traces, unless otherwise specified in a destination's + * attributes include/exclude lists. + */ + allow_all_headers: true, + attributes: { + /** + * Prefix of attributes to exclude from all destinations. Allows * as wildcard + * at end. + * + * NOTE: If excluding headers, they must be in camelCase form to be filtered. + * + * @env NEW_RELIC_ATTRIBUTES_EXCLUDE + */ + exclude: [ + 'request.headers.cookie', + 'request.headers.authorization', + 'request.headers.proxyAuthorization', + 'request.headers.setCookie*', + 'request.headers.x*', + 'response.headers.cookie', + 'response.headers.authorization', + 'response.headers.proxyAuthorization', + 'response.headers.setCookie*', + 'response.headers.x*', + ], + }, +}; diff --git a/services/event-processor/package.json b/services/event-processor/package.json new file mode 100644 index 0000000..2806c6b --- /dev/null +++ b/services/event-processor/package.json @@ -0,0 +1,17 @@ +{ + "name": "@base-cms/parcel-plug-event-processor", + "version": "1.0.5", + "description": "Processes and flags fraudulent events", + "main": "src/index.js", + "author": "Josh Worden ", + "repository": "https://github.com/base-cms/parcel-plug/tree/master/services/event-processor", + "license": "MIT", + "private": true, + "dependencies": { + "@newrelic/native-metrics": "^4.1.0", + "envalid": "^4.1.4", + "forever": "^1.0.0", + "mongoose": "^5.4.1", + "newrelic": "^5.9.1" + } +} diff --git a/services/event-processor/src/db.js b/services/event-processor/src/db.js new file mode 100644 index 0000000..06cbdb5 --- /dev/null +++ b/services/event-processor/src/db.js @@ -0,0 +1,18 @@ +const mongoose = require('mongoose'); +const env = require('./env'); +const { name, version } = require('../../../package.json'); + +const { MONGO_DSN, ACCOUNT_KEY } = env; + +const instanceDSN = MONGO_DSN.replace('/parcel-plug', `/parcel-plug-${ACCOUNT_KEY}`); + +const connection = mongoose.createConnection(instanceDSN, { + autoIndex: false, + appname: `${name} v${version}`, + bufferMaxEntries: 0, // Default -1 + ignoreUndefined: true, + useNewUrlParser: true, + useFindAndModify: false, + useCreateIndex: true, +}); +module.exports = connection; diff --git a/services/event-processor/src/env.js b/services/event-processor/src/env.js new file mode 100644 index 0000000..7b0b2cb --- /dev/null +++ b/services/event-processor/src/env.js @@ -0,0 +1,25 @@ +const { + cleanEnv, + makeValidator, + bool, + num, +} = require('envalid'); + +const nonemptystr = makeValidator((v) => { + const err = new Error('Expected a non-empty string'); + if (v === undefined || v === null || v === '') { + throw err; + } + const trimmed = String(v).trim(); + if (!trimmed) throw err; + return trimmed; +}); + +module.exports = cleanEnv(process.env, { + ACCOUNT_KEY: nonemptystr({ desc: 'The account/tenant key. Is used for querying the account information and settings from the core database connection.' }), + MONGO_DSN: nonemptystr({ desc: 'The MongoDB DSN to connect to.' }), + NEW_RELIC_ENABLED: bool({ desc: 'Whether New Relic is enabled.', default: true, devDefault: false }), + NEW_RELIC_LICENSE_KEY: nonemptystr({ desc: 'The license key for New Relic.', devDefault: '(unset)' }), + CLICK_FREQUENCY_NUMBER: num({ desc: 'The click event threshold (x events in n time)', default: 10 }), + CLICK_FREQUENCY_INTERVAL: num({ desc: 'The click event threshold (n events in x time) (milliseconds)', default: 10000 }), +}); diff --git a/services/event-processor/src/index.js b/services/event-processor/src/index.js new file mode 100644 index 0000000..628307a --- /dev/null +++ b/services/event-processor/src/index.js @@ -0,0 +1,42 @@ +require('./newrelic'); +const pkg = require('../package.json'); +const db = require('./db'); +const clickFrequency = require('./rules/click-frequency'); + +const { log } = console; + +const stop = () => db.close(); + +const run = async () => { + const r = await db; + const { url } = r.client.s; + log(`> db connected (${url})`); + + log('Processing rules'); + await Promise.all([ + clickFrequency(), + ]); + log('Done processing.'); + + return stop(); +}; + +// Simulate future NodeJS behavior by throwing unhandled Promise rejections. +process.on('unhandledRejection', (e) => { + log('> Unhandled promise rejection. Throwing error...'); + throw e; +}); + +process.on('SIGINT', async () => { + log('> SIGINT recieved, shutting down gracefully.'); + await stop(); +}); + +process.on('SIGTERM', () => { + log('> SIGTERM recieved, shutting down!'); + stop(); + process.exit(); +}); + +log(`> Booting ${pkg.name} v${pkg.version}...`); +run().catch(e => setImmediate(() => { throw e; })); diff --git a/services/event-processor/src/newrelic.js b/services/event-processor/src/newrelic.js new file mode 100644 index 0000000..db8c790 --- /dev/null +++ b/services/event-processor/src/newrelic.js @@ -0,0 +1,5 @@ +const { NEW_RELIC_ENABLED } = require('./env'); + +process.env.NEW_RELIC_ENABLED = NEW_RELIC_ENABLED; + +module.exports = require('newrelic'); diff --git a/services/event-processor/src/rules/click-frequency.js b/services/event-processor/src/rules/click-frequency.js new file mode 100644 index 0000000..1da324c --- /dev/null +++ b/services/event-processor/src/rules/click-frequency.js @@ -0,0 +1,84 @@ +const db = require('../db'); +const { CLICK_FREQUENCY_NUMBER, CLICK_FREQUENCY_INTERVAL } = require('../env'); + +const { log } = console; + +const filterByThreshold = (items) => { + const values = items.reduce((arr, { _id, date }) => { + const v = date.valueOf(); + return { ...arr, [v]: _id }; + }, {}); + const dates = Object.keys(values).map(n => parseInt(n, 10)); + dates.sort((a, b) => a - b); + const badDates = []; + let bad = []; + let now = dates.shift(); + while (dates.length) { + const n = dates.shift(); + if (n < now + CLICK_FREQUENCY_INTERVAL) { + bad.push(n); + } else { + // Reset our frequency start to the current date + now = n; + // Push bad dates if we've met the frequency cap + if (bad.length >= CLICK_FREQUENCY_NUMBER) bad.forEach(d => badDates.push(d)); + // Reset the bad date queue + bad = []; + } + } + if (bad.length >= CLICK_FREQUENCY_NUMBER) bad.forEach(d => badDates.push(d)); + + return [...new Set([...badDates])].map(v => values[v]); +}; + +/** + * This rule marks clicks as fraudlent if a significant number of clicks are recorded + * from the same IP address, within a set time period. + * + * It will query from the oldest record to the newest, and will only process records once. + * If a record is considered fraudulent, all clicks (events?) from that IP will be invalidated. + */ +module.exports = async () => { + log('click-frequency: Starting'); + const coll = db.collection('events'); + + const pipeline = [ + { $match: { type: 'click', ip: { $exists: true } } }, + { $sort: { date: -1 } }, + { + $group: { + _id: '$ip', + clicks: { $addToSet: { _id: '$_id', date: '$date' } }, + count: { $sum: 1 }, + }, + }, + { $match: { count: { $gt: 1 } } }, + { $sort: { count: 1 } }, + ]; + + const events = await coll.aggregate(pipeline); + + // eslint-disable-next-line no-await-in-loop + while (await events.hasNext()) { + // eslint-disable-next-line no-await-in-loop + const event = await events.next(); + const { _id: ip, clicks } = event; + + log(`click-frequency: Checking ip ${ip}...`); + const flagged = filterByThreshold(clicks); + log(`click-frequency: Found ${flagged.length} to flag for ${ip}`); + + if (flagged.length) { + const bulkOps = flagged.map(_id => ({ + updateOne: { + filter: { _id }, + update: { $set: { flagged: true, flagReason: 'click-frequency' } }, + }, + })); + // eslint-disable-next-line no-await-in-loop + const { matchedCount } = await coll.bulkWrite(bulkOps); + log(`click-frequency: Updated ${matchedCount} flagged events.`); + } + } + log('click-frequency: Done'); +}; diff --git a/yarn.lock b/yarn.lock index 84c5df6..95c22a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1845,6 +1845,14 @@ ansicolors@~0.2.1: resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" integrity sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8= +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + integrity sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA== + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -2352,6 +2360,16 @@ async-settle@^1.0.0: dependencies: async-done "^1.2.2" +async@0.2.9: + version "0.2.9" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.9.tgz#df63060fbf3d33286a76aaf6d55a2986d9ff8619" + integrity sha1-32MGD789Myhqdqr21Vophtn/hhk= + +async@0.2.x, async@~0.2.9: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= + async@2.6.1, async@^2.0.1, async@^2.4.1, async@^2.5.0: version "2.6.1" resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" @@ -2371,10 +2389,10 @@ async@^2.1.4: dependencies: lodash "^4.17.11" -async@~0.2.9: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= +async@~0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= asynckit@^0.4.0: version "0.4.0" @@ -3215,6 +3233,17 @@ braces@^2.3.0, braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" +broadway@~0.3.2, broadway@~0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/broadway/-/broadway-0.3.6.tgz#7dbef068b954b7907925fd544963b578a902ba7a" + integrity sha1-fb7waLlUt5B5Jf1USWO1eKkCuno= + dependencies: + cliff "0.1.9" + eventemitter2 "0.4.14" + nconf "0.6.9" + utile "0.2.1" + winston "0.8.0" + broccoli-amd-funnel@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/broccoli-amd-funnel/-/broccoli-amd-funnel-2.0.1.tgz#dbdbfd28841731342d538126567c25bea3f15310" @@ -3987,6 +4016,13 @@ caller-path@^2.0.0: dependencies: caller-callsite "^2.0.0" +caller@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/caller/-/caller-0.0.1.tgz#f37a1d6ea10e829d94721ae29a90bb4fb52ab767" + integrity sha1-83odbqEOgp2UchrimpC7T7Uqt2c= + dependencies: + tape "~2.3.2" + callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" @@ -4141,6 +4177,22 @@ charm@^1.0.0: dependencies: inherits "^2.0.1" +chokidar@^1.0.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + chokidar@^2.0.0, chokidar@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" @@ -4259,6 +4311,24 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= +cliff@0.1.9: + version "0.1.9" + resolved "https://registry.yarnpkg.com/cliff/-/cliff-0.1.9.tgz#a211e09c6a3de3ba1af27d049d301250d18812bc" + integrity sha1-ohHgnGo947oa8n0EnTASUNGIErw= + dependencies: + colors "0.x.x" + eyes "0.1.x" + winston "0.8.x" + +cliff@~0.1.9: + version "0.1.10" + resolved "https://registry.yarnpkg.com/cliff/-/cliff-0.1.10.tgz#53be33ea9f59bec85609ee300ac4207603e52013" + integrity sha1-U74z6p9ZvshWCe4wCsQgdgPlIBM= + dependencies: + colors "~1.0.3" + eyes "~0.1.8" + winston "0.8.x" + cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -4358,11 +4428,21 @@ color-support@^1.1.3: resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== -colors@1.0.3: +colors@0.6.x, colors@0.x.x, colors@~0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" + integrity sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w= + +colors@1.0.3, colors@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= +colors@^1.1.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" + integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== + columnify@^1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" @@ -4827,6 +4907,11 @@ currently-unhandled@^0.4.1: dependencies: array-find-index "^1.0.1" +cycle@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI= + cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" @@ -4943,6 +5028,28 @@ deep-assign@^3.0.0: dependencies: is-obj "^1.0.0" +deep-equal@*: + version "1.1.0" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.0.tgz#3103cdf8ab6d32cf4a8df7865458f2b8d33f3745" + integrity sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw== + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +deep-equal@~0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.1.2.tgz#b246c2b80a570a47c11be1d9bd1070ec878b87ce" + integrity sha1-skbCuApXCkfBG+HZvRBw7IeLh84= + +deep-equal@~0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz#84b745896f34c684e98f2ce0e42abaf43bba017d" + integrity sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0= + deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -5006,6 +5113,11 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +defined@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-0.0.0.tgz#f35eea7d705e933baf13b2f03b3f83d921403b3e" + integrity sha1-817qfXBekzuvE7LwOz+D2SFAOz4= + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -5099,6 +5211,11 @@ dir-glob@^2.0.0: arrify "^1.0.1" path-type "^3.0.0" +director@1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/director/-/director-1.2.7.tgz#bfd3741075fd7fb1a5b2e13658c5f4bec77736f3" + integrity sha1-v9N0EHX9f7GlsuE2WMX0vsd3NvM= + dns-prefetch-control@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz#60ddb457774e178f1f9415f0cabb0e85b0b300b2" @@ -6424,6 +6541,18 @@ event-stream@^4.0.1: stream-combiner "^0.2.2" through "^2.3.8" +event-stream@~0.5: + version "0.5.3" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-0.5.3.tgz#b77b9309f7107addfeab63f0c0eafd8db0bd8c1c" + integrity sha1-t3uTCfcQet3+q2PwwOr9jbC9jBw= + dependencies: + optimist "0.2" + +eventemitter2@0.4.14, eventemitter2@~0.4.14: + version "0.4.14" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab" + integrity sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas= + eventemitter3@^3.0.0, eventemitter3@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" @@ -6659,6 +6788,11 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= +eyes@0.1.x, eyes@~0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= + fancy-log@^1.3.2: version "1.3.3" resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" @@ -6943,6 +7077,16 @@ flat-cache@^1.2.1: rimraf "~2.6.2" write "^0.2.1" +flatiron@~0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/flatiron/-/flatiron-0.4.3.tgz#248cf79a3da7d7dc379e2a11c92a2719cbb540f6" + integrity sha1-JIz3mj2n19w3nioRySonGcu1QPY= + dependencies: + broadway "~0.3.2" + director "1.2.7" + optimist "0.6.0" + prompt "0.2.14" + flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" @@ -6982,6 +7126,39 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +forever-monitor@~1.7.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/forever-monitor/-/forever-monitor-1.7.1.tgz#5d820f4a3a78db2d81ae2671f158b9e86a091bb8" + integrity sha1-XYIPSjp42y2BriZx8Vi56GoJG7g= + dependencies: + broadway "~0.3.6" + chokidar "^1.0.1" + minimatch "~3.0.2" + ps-tree "0.0.x" + utile "~0.2.1" + +forever@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/forever/-/forever-1.0.0.tgz#d6dc092da8e44da838318fabe45205b191f2a094" + integrity sha512-ZaNWo5aMdtfui5GZWxaPcmFPW/TaaJZgGE0/p47lhn0FGRhFehuG338zuUURIqjn0dZEmgNPUAahZMOdykEAiw== + dependencies: + async "~0.2.9" + cliff "~0.1.9" + clone "^1.0.2" + colors "~0.6.2" + flatiron "~0.4.2" + forever-monitor "~1.7.0" + mkdirp "0.x.x" + nconf "~0.6.9" + nssocket "~0.5.1" + object-assign "^3.0.0" + optimist "~0.6.0" + path-is-absolute "~1.0.0" + prettyjson "^1.1.2" + shush "^1.0.0" + utile "~0.3.0" + winston "~0.8.1" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -7153,6 +7330,14 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +fsevents@^1.0.0: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + dependencies: + nan "^2.12.1" + node-pre-gyp "^0.12.0" + fsevents@^1.2.2, fsevents@^1.2.3: version "1.2.4" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" @@ -7905,6 +8090,11 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" +i@0.3.x: + version "0.3.6" + resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d" + integrity sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0= + iconv-lite@0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" @@ -8032,7 +8222,7 @@ inherits@2.0.1: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= -ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: +ini@1.x.x, ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -8175,6 +8365,11 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -8511,7 +8706,7 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isstream@~0.1.2: +isstream@0.1.x, isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= @@ -8797,6 +8992,11 @@ last-run@^1.1.0: default-resolution "^2.0.0" es6-weak-map "^2.0.1" +lazy@~1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/lazy/-/lazy-1.0.11.tgz#daa068206282542c088288e975c297c1ae77b690" + integrity sha1-2qBoIGKCVCwIgojpdcKXwa53tpA= + lazystream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" @@ -9839,7 +10039,7 @@ methods@^1.1.2, methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^2.3.11: +micromatch@^2.1.5, micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= @@ -9986,7 +10186,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: +mkdirp@0.5.x, mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -10240,6 +10440,25 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +nconf@0.6.9, nconf@~0.6.9: + version "0.6.9" + resolved "https://registry.yarnpkg.com/nconf/-/nconf-0.6.9.tgz#9570ef15ed6f9ae6b2b3c8d5e71b66d3193cd661" + integrity sha1-lXDvFe1vmuays8jV5xtm0xk81mE= + dependencies: + async "0.2.9" + ini "1.x.x" + optimist "0.6.0" + +ncp@0.4.x: + version "0.4.2" + resolved "https://registry.yarnpkg.com/ncp/-/ncp-0.4.2.tgz#abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574" + integrity sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ= + +ncp@1.0.x: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ncp/-/ncp-1.0.1.tgz#d15367e5cb87432ba117d2bf80fdf45aecfb4246" + integrity sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY= + needle@^2.2.1: version "2.2.4" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" @@ -10379,7 +10598,7 @@ node-notifier@^5.0.1: shellwords "^0.1.1" which "^1.3.0" -node-pre-gyp@0.12.0: +node-pre-gyp@0.12.0, node-pre-gyp@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== @@ -10468,7 +10687,7 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package- semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= @@ -10571,6 +10790,14 @@ npm-run-path@^2.0.0: gauge "~2.7.3" set-blocking "~2.0.0" +nssocket@~0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/nssocket/-/nssocket-0.5.3.tgz#883ca2ec605f5ed64a4d5190b2625401928f8f8d" + integrity sha1-iDyi7GBfXtZKTVGQsmJUAZKPj40= + dependencies: + eventemitter2 "~0.4.14" + lazy "~1.0.11" + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -10596,6 +10823,11 @@ object-assign@^2.0.0: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" integrity sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo= +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + integrity sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I= + object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" @@ -10615,11 +10847,21 @@ object-hash@^1.3.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== +object-is@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" + integrity sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY= + object-keys@^1.0.11, object-keys@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + object-path@^0.11.4: version "0.11.4" resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.4.tgz#370ae752fbf37de3ea70a861c23bba8915691949" @@ -10739,7 +10981,22 @@ optimism@^0.6.8: dependencies: immutable-tuple "^0.4.9" -optimist@^0.6.1: +optimist@0.2: + version "0.2.8" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.2.8.tgz#e981ab7e268b457948593b55674c099a815cac31" + integrity sha1-6YGrfiaLRXlIWTtVZ0wJmoFcrDE= + dependencies: + wordwrap ">=0.0.1 <0.1.0" + +optimist@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.0.tgz#69424826f3405f79f142e6fc3d9ae58d4dbb9200" + integrity sha1-aUJIJvNAX3nxQub8PZrljU27kgA= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optimist@^0.6.1, optimist@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= @@ -11089,7 +11346,7 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= -path-is-absolute@1.0.1, path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-is-absolute@1.0.1, path-is-absolute@^1.0.0, path-is-absolute@^1.0.1, path-is-absolute@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -11232,6 +11489,16 @@ pkg-up@^2.0.0: dependencies: find-up "^2.1.0" +pkginfo@0.3.x: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" + integrity sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE= + +pkginfo@0.x.x: + version "0.4.1" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" + integrity sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8= + platform@1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.5.tgz#fb6958c696e07e2918d2eeda0f0bc9448d733444" @@ -11288,6 +11555,14 @@ pretty-ms@^3.1.0: dependencies: parse-ms "^1.0.0" +prettyjson@^1.1.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prettyjson/-/prettyjson-1.2.1.tgz#fcffab41d19cab4dfae5e575e64246619b12d289" + integrity sha1-/P+rQdGcq0365eV15kJGYZsS0ok= + dependencies: + colors "^1.1.2" + minimist "^1.2.0" + printf@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/printf/-/printf-0.5.1.tgz#e0466788260859ed153006dc6867f09ddf240cf3" @@ -11354,6 +11629,17 @@ promise.prototype.finally@^3.1.0: es-abstract "^1.9.0" function-bind "^1.1.1" +prompt@0.2.14: + version "0.2.14" + resolved "https://registry.yarnpkg.com/prompt/-/prompt-0.2.14.tgz#57754f64f543fd7b0845707c818ece618f05ffdc" + integrity sha1-V3VPZPVD/XsIRXB8gY7OYY8F/9w= + dependencies: + pkginfo "0.x.x" + read "1.0.x" + revalidator "0.1.x" + utile "0.2.x" + winston "0.8.x" + promzard@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" @@ -11405,6 +11691,13 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= +ps-tree@0.0.x: + version "0.0.3" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-0.0.3.tgz#dbf8d752a7fe22fa7d58635689499610e9276ddc" + integrity sha1-2/jXUqf+Ivp9WGNWiUmWEOknbdw= + dependencies: + event-stream "~0.5" + pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -11672,7 +11965,7 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -read@1, read@~1.0.1: +read@1, read@1.0.x, read@~1.0.1: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= @@ -11872,6 +12165,13 @@ regexp-clone@0.0.1: resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-0.0.1.tgz#a7c2e09891fdbf38fbb10d376fb73003e68ac589" integrity sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk= +regexp.prototype.flags@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz#6b30724e306a27833eeb171b66ac8890ba37e41c" + integrity sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA== + dependencies: + define-properties "^1.1.2" + regexpp@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" @@ -12132,6 +12432,13 @@ restore-cursor@^2.0.0: onetime "^2.0.0" signal-exit "^3.0.2" +resumer@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= + dependencies: + through "~2.3.4" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -12147,6 +12454,11 @@ retry@^0.10.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= +revalidator@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b" + integrity sha1-/s5hv6DBtSoga9axgZgYS91SOjs= + rimraf@2, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" @@ -12154,6 +12466,13 @@ rimraf@2, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2. dependencies: glob "^7.0.5" +rimraf@2.x.x: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@^2.2.8, rimraf@^2.3.4, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.3: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -12468,6 +12787,14 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +shush@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shush/-/shush-1.0.0.tgz#c27415a9e458f2fed39b27cf8eb37c003782b431" + integrity sha1-wnQVqeRY8v7TmyfPjrN8ADeCtDE= + dependencies: + caller "~0.0.1" + strip-json-comments "~0.1.1" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -12836,7 +13163,7 @@ ssri@^6.0.0, ssri@^6.0.1: dependencies: figgy-pudding "^3.5.1" -stack-trace@0.0.10: +stack-trace@0.0.10, stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= @@ -13027,6 +13354,11 @@ strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= +strip-json-comments@~0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-0.1.3.tgz#164c64e370a8a3cc00c9e01b539e569823f0ee54" + integrity sha1-Fkxk43Coo8wAyeAbU55WmCPw7lQ= + strong-log-transformer@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" @@ -13132,6 +13464,18 @@ tapable@^1.0.0, tapable@^1.1.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== +tape@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tape/-/tape-2.3.3.tgz#2e7ce0a31df09f8d6851664a71842e0ca5057af7" + integrity sha1-Lnzgox3wn41oUWZKcYQuDKUFevc= + dependencies: + deep-equal "~0.1.0" + defined "~0.0.0" + inherits "~2.0.1" + jsonify "~0.0.0" + resumer "~0.0.0" + through "~2.3.4" + tar@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" @@ -13731,6 +14075,30 @@ util@^0.10.3: dependencies: inherits "2.0.3" +utile@0.2.1, utile@0.2.x, utile@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/utile/-/utile-0.2.1.tgz#930c88e99098d6220834c356cbd9a770522d90d7" + integrity sha1-kwyI6ZCY1iIINMNWy9mncFItkNc= + dependencies: + async "~0.2.9" + deep-equal "*" + i "0.3.x" + mkdirp "0.x.x" + ncp "0.4.x" + rimraf "2.x.x" + +utile@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/utile/-/utile-0.3.0.tgz#1352c340eb820e4d8ddba039a4fbfaa32ed4ef3a" + integrity sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo= + dependencies: + async "~0.9.0" + deep-equal "~0.2.1" + i "0.3.x" + mkdirp "0.x.x" + ncp "1.0.x" + rimraf "2.x.x" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -14007,7 +14375,32 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -wordwrap@~0.0.2: +winston@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-0.8.0.tgz#61d0830fa699706212206b0a2b5ca69a93043668" + integrity sha1-YdCDD6aZcGISIGsKK1ymmpMENmg= + dependencies: + async "0.2.x" + colors "0.6.x" + cycle "1.0.x" + eyes "0.1.x" + pkginfo "0.3.x" + stack-trace "0.0.x" + +winston@0.8.x, winston@~0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/winston/-/winston-0.8.3.tgz#64b6abf4cd01adcaefd5009393b1d8e8bec19db0" + integrity sha1-ZLar9M0Brcrv1QCTk7HY6L7BnbA= + dependencies: + async "0.2.x" + colors "0.6.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + pkginfo "0.3.x" + stack-trace "0.0.x" + +"wordwrap@>=0.0.1 <0.1.0", wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc=