diff --git a/.circleci/config.yml b/.circleci/config.yml index 7bf5c09..6115a4c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -4,7 +4,7 @@ jobs: build: working_directory: ~/cp-badges-service docker: - - image: node:8 + - image: node:carbon environment: NODE_ENV: testing steps: @@ -33,12 +33,12 @@ jobs: command: | set -x VER="17.03.0-ce" - curl -L -o /tmp/docker-$VER.tgz https://get.docker.com/builds/Linux/x86_64/docker-$VER.tgz - tar -xz -C /tmp -f /tmp/docker-$VER.tgz + curl -L -o /tmp/docker-"$VER".tgz https://get.docker.com/builds/Linux/x86_64/docker-"$VER".tgz + tar -xz -C /tmp -f /tmp/docker-"$VER".tgz mv /tmp/docker/* /usr/bin - run: name: Deploy to K8 - command: GIT_SHA1=$CIRCLE_SHA1 GIT_BRANCH=$CIRCLE_BRANCH ./.circleci/kube.sh + command: GIT_SHA1="$CIRCLE_SHA1" GIT_BRANCH="$CIRCLE_BRANCH" ./.circleci/kube.sh workflows: version: 2 build-test-and-deploy: @@ -51,4 +51,3 @@ workflows: branches: only: - master - - staging diff --git a/.circleci/kube.sh b/.circleci/kube.sh index 0e0bc91..8c4ce7f 100755 --- a/.circleci/kube.sh +++ b/.circleci/kube.sh @@ -5,25 +5,22 @@ set -e if [ "$GIT_BRANCH" = "master" ]; then DEP_VER=latest HOST=$PROD_HOST - echo "$PROD_CA_CERT" | base64 -i --decode > ca.pem - echo "$PROD_ADMIN_KEY" | base64 -i --decode > admin-key.pem - echo "$PROD_ADMIN_CERT" | base64 -i --decode > admin.pem -elif [ "$GIT_BRANCH" = "staging" ]; then - DEP_VER=staging - HOST=$STAGING_HOST - echo "$STAGING_CA_CERT" | base64 -i --decode > ca.pem - echo "$STAGING_ADMIN_KEY" | base64 -i --decode > admin-key.pem - echo "$STAGING_ADMIN_CERT" | base64 -i --decode > admin.pem + echo "$PROD_CA_CERT" | base64 -i --decode >ca.pem + echo "$PROD_ADMIN_KEY" | base64 -i --decode >admin-key.pem + echo "$PROD_ADMIN_CERT" | base64 -i --decode >admin.pem else exit 0 fi -docker build --rm=false --build-arg DEP_VERSION=$DEP_VER -t coderdojo/cp-badges-service:"$GIT_SHA1" . + +TIMESTAMP=$(date +%s) + +docker build --rm=false --build-arg DEP_VERSION=$DEP_VER -t coderdojo/cp-badges-service:"${GIT_SHA1}-${TIMESTAMP}" . docker login -u "$DOCKER_USER" -p "$DOCKER_PASS" -e "$DOCKER_EMAIL" -docker push coderdojo/cp-badges-service:"$GIT_SHA1" +docker push coderdojo/cp-badges-service:"${GIT_SHA1}-${TIMESTAMP}" curl -O https://storage.googleapis.com/kubernetes-release/release/v1.6.1/bin/linux/amd64/kubectl chmod +x kubectl ./kubectl config set-cluster default-cluster --server=https://"$HOST" --certificate-authority=ca.pem ./kubectl config set-credentials default-admin --certificate-authority=ca.pem --client-key=admin-key.pem --client-certificate=admin.pem ./kubectl config set-context default-system --cluster=default-cluster --user=default-admin ./kubectl config use-context default-system -./kubectl patch deployment badges -p '{"spec":{"template":{"spec":{"containers":[{"name":"badges","image":"coderdojo/cp-badges-service:'"$GIT_SHA1"'"}]}}}}' +./kubectl patch deployment badges -p '{"spec":{"template":{"spec":{"containers":[{"name":"badges","image":"coderdojo/cp-badges-service:'"${GIT_SHA1}-${TIMESTAMP}"'"}]}}}}' diff --git a/.dockerignore b/.dockerignore index 54090bf..43cc696 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,5 @@ .git +node_modules .gitignore README.md coverage @@ -7,4 +8,3 @@ test *.yml *.md *.sh -!docker-entrypoint.sh diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +node_modules/ diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..619bcd6 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + extends: 'coderdojo', +}; diff --git a/Dockerfile b/Dockerfile index 050d5b0..0024ead 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,5 @@ -FROM node:8-alpine -MAINTAINER CoderDojo Foundation -ARG DEP_VERSION=latest +FROM node:carbon-alpine +LABEL maintainer="CoderDojo Foundation " RUN apk add --update git make gcc g++ python && \ mkdir -p /usr/src/app WORKDIR /usr/src/app diff --git a/appspec.yml b/appspec.yml deleted file mode 100644 index 2cb57cc..0000000 --- a/appspec.yml +++ /dev/null @@ -1,26 +0,0 @@ -version: 0.0 -os: linux -files: - - source: deploy/cp-badges-service.conf - destination: /etc/init/ - - source: / - destination: /opt/zen/cp-badges-service - -permissions: - - object: /opt/zen/cp-badges-service - owner: ubuntu - group: ubuntu - -hooks: - ApplicationStop: - - location: deploy/stop-server.sh - timeout: 300 - runas: root - - ApplicationStart: - - location: deploy/start-server.sh - timeout: 300 - runas: root - - - diff --git a/config/permissions.js b/config/permissions.js index c5c0679..f810abc 100644 --- a/config/permissions.js +++ b/config/permissions.js @@ -1,60 +1,32 @@ -'use strict'; +module.exports = () => ({ + 'cd-badges': { + listBadges: [{ role: 'none' }], -module.exports = function () { - return { - 'cd-badges': { - 'listBadges': [{ - role: 'none' - }], + // NOTE: Must be defined by visibility ? + getBadge: [{ role: 'none' }], - // NOTE: Must be defined by visibility ? - 'getBadge': [{ - role: 'none' - }], + sendBadgeApplication: [ + { role: 'basic-user', customValidator: [{ role: 'cd-dojos', cmd: 'can_award_badge' }] }, + ], - 'sendBadgeApplication': [{ + acceptBadge: [ + { role: 'basic-user', - customValidator: [{ - role: 'cd-dojos', - cmd: 'can_award_badge' - }] - }], - - 'acceptBadge': [{ - role: 'basic-user', - // TODO : this is buggy, it seems the userId in the badge is not set making the validation not working + // TODO : this is buggy, + // it seems the userId in the badge is not set making the validation not working // customValidator: [{ // role: 'cd-badges', // cmd: 'ownBadge' // }] - }], - // NOTE: Must be defined by visibility ? - 'loadUserBadges': [{ - role: 'basic-user' - }], - - 'loadBadgeCategories': [{ - role: 'none' - }], - 'loadBadgeByCode': [{ - role: 'none' - }], - 'claimBadge': [{ - role: 'basic-user' - }], - 'exportBadges': [{ - role: 'basic-user', - customValidator: [{ - role: 'cd-users', - cmd: 'is_self' - }] - }], - 'kpiNumberOfBadgesAwarded': [{ - role: 'cdf-admin' - }], - 'kpiNumberOfBadgesPublished' :[{ - role: 'cdf-admin' - }] - } - }; -}; + }, + ], + // NOTE: Must be defined by visibility ? + loadUserBadges: [{ role: 'basic-user' }], + loadBadgeCategories: [{ role: 'none' }], + loadBadgeByCode: [{ role: 'none' }], + claimBadge: [{ role: 'basic-user' }], + exportBadges: [{ role: 'basic-user', customValidator: [{ role: 'cd-users', cmd: 'is_self' }] }], + kpiNumberOfBadgesAwarded: [{ role: 'cdf-admin' }], + kpiNumberOfBadgesPublished: [{ role: 'cdf-admin' }], + }, +}); diff --git a/config/seneca-options.js b/config/seneca-options.js index a82acbb..7233a09 100644 --- a/config/seneca-options.js +++ b/config/seneca-options.js @@ -1,21 +1,20 @@ -'use strict'; -var assert = require('assert'); -var LogEntries = require('le_node'); - -var senecaOptions = { +const senecaOptions = { transport: { type: 'web', web: { timeout: 120000, - port: 10305 - } + port: 10305, + }, }, apiBaseUrl: process.env.BADGEKIT_API_BASE_URL || 'http://localhost:8080', apiSecret: process.env.BADGEKIT_API_SECRET || '', claimCodePrefix: 'code-', timeout: 120000, - strict: { add: false, result: false }, - actcache: { active:false } + strict: { + add: false, + result: false, + }, + actcache: { active: false }, }; module.exports = senecaOptions; diff --git a/dev.Dockerfile b/dev.Dockerfile index b471157..7673dd1 100644 --- a/dev.Dockerfile +++ b/dev.Dockerfile @@ -1,8 +1,8 @@ -FROM node:8-alpine -MAINTAINER butlerx +FROM node:carbon-alpine +LABEL maintainer="CoderDojo Foundation " WORKDIR /usr/src/app ENV NODE_ENV development -RUN apk add --update git build-base python && \ +RUN apk add --update git make gcc g++ python && \ mkdir -p /usr/src/app COPY docker-entrypoint.sh /usr/src EXPOSE 10305 diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index cdc4f80..f69cc87 100755 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -1,11 +1,13 @@ #! /usr/bin/env sh + set -e + cd /usr/src/app || exit touch .yarn.sha1 OLD_SHA=$(cat .yarn.sha1) NEW_SHA=$(sha1sum yarn.lock) if [ "$OLD_SHA" != "$NEW_SHA" ]; then - echo "$NEW_SHA" > .yarn.sha1 + echo "$NEW_SHA" >.yarn.sha1 yarn fi yarn dev diff --git a/lib/accept-badge.js b/lib/accept-badge.js index 7a92a8d..58163ed 100644 --- a/lib/accept-badge.js +++ b/lib/accept-badge.js @@ -1,47 +1,53 @@ -'use strict'; - -var _ = require('lodash'); - -function acceptBadge (args, callback) { - var seneca = this; - var zenHostname = process.env.HOSTNAME || '127.0.0.1:8000'; - var badgeData = args.badgeData; - var user = args.user; - var protocol = process.env.PROTOCOL || 'http'; - - if (badgeData.userId !== user.id && !args.badgeData.parent) return callback(null, { error: 'Only the nominated user or their parent can accept this badge.' }); +const { find } = require('lodash'); + +function acceptBadge(args, callback) { + const seneca = this; + const zenHostname = process.env.HOSTNAME || '127.0.0.1:8000'; + const badgeData = args.badgeData; + const user = args.user; + const protocol = process.env.PROTOCOL || 'http'; + + if (badgeData.userId !== user.id && !args.badgeData.parent) { + return callback(null, { + error: 'Only the nominated user or their parent can accept this badge.', + }); + } - seneca.act({role: 'cd-profiles', cmd: 'list', query: {userId: badgeData.userId}}, function (err, response) { + seneca.act({ + role: 'cd-profiles', + cmd: 'list', + query: { userId: badgeData.userId }, + }, (err, response) => { if (err) return callback(err); - var profile = response[0]; + const profile = response[0]; - var badgeFound = _.find(profile.badges, function (userBadge) { - return userBadge.slug === badgeData.badgeSlug; - }); + const badgeFound = find(profile.badges, userBadge => userBadge.slug === badgeData.badgeSlug); if (!badgeFound) return callback(null, { error: 'Badge not found.' }); - if (badgeFound.status === 'accepted') return callback(null, { error: 'This badge has already been accepted.' }); + if (badgeFound.status === 'accepted') { + return callback(null, { error: 'This badge has already been accepted.' }); + } badgeFound.status = 'accepted'; badgeFound.dateAccepted = new Date(); // Add assertion for badge baking. badgeFound.assertion = { - uid: 'coderdojo-' + user.id + badgeFound.id, + uid: `coderdojo-${user.id}${badgeFound.id}`, recipient: { identity: user.email, type: 'email', - hashed: false + hashed: false, }, - badge: 'http://badgekit.coderdojo.com:8080/public/systems/coderdojo/badges/' + badgeFound.slug, + badge: `http://badgekit.coderdojo.com:8080/public/systems/coderdojo/badges/${badgeFound.slug}`, verify: { - url: protocol + '://' + zenHostname + '/api/1.0/verify_badge/' + user.id + '/' + badgeFound.id + '/assertion', // url should return badgeAssertion object. - type: 'hosted' + url: `${protocol}://${zenHostname}/api/1.0/verify_badge/${user.id}/${badgeFound.id}/assertion`, // url should return badgeAssertion object. + type: 'hosted', }, - issuedOn: new Date() + issuedOn: new Date(), }; - seneca.act({role: 'cd-profiles', cmd: 'save', profile: profile}, callback); + seneca.act({ role: 'cd-profiles', cmd: 'save', profile }, callback); }); } diff --git a/lib/add-badge-to-profile.js b/lib/add-badge-to-profile.js index 32dd7e4..1910599 100644 --- a/lib/add-badge-to-profile.js +++ b/lib/add-badge-to-profile.js @@ -1,18 +1,14 @@ -'use strict'; +const _ = require('lodash'); -var _ = require('lodash'); - -function addBadgeToProfile (args, callback) { - var seneca = this; - var profile = args.profile; - var badge = args.badge; +function addBadgeToProfile(args, callback) { + const seneca = this; + const profile = args.profile; + const badge = args.badge; if (!profile.badges) profile.badges = []; - var badgeFound = _.find(profile.badges, function (userBadge) { - return userBadge.id === badge.id; - }); + const badgeFound = _.find(profile.badges, userBadge => userBadge.id === badge.id); if (badgeFound) return callback(null, { error: 'User has already received this badge.' }); profile.badges.push(badge); - seneca.act({ role: 'cd-profiles', cmd: 'save', profile: profile }, callback); + seneca.act({ role: 'cd-profiles', cmd: 'save', profile }, callback); } module.exports = addBadgeToProfile; diff --git a/lib/assign-recurrent-badges.js b/lib/assign-recurrent-badges.js index 2e653bb..b6abd75 100644 --- a/lib/assign-recurrent-badges.js +++ b/lib/assign-recurrent-badges.js @@ -1,119 +1,130 @@ -'use strict'; +const async = require('async'); +const _ = require('lodash'); +const moment = require('moment'); -var async = require('async'); -var _ = require('lodash'); -var moment = require('moment'); - -function assignRecurrentBadges (args, callback) { - var seneca = this; - var plugin = args.role; - var application = args.application; +function assignRecurrentBadges(args, callback) { + const seneca = this; + const plugin = args.role; + const application = args.application; // TODO: migration to qualify badges? - var recurrentBadges = [ - {slug: 'my-1st-dojo!', recurrence: 1, only: ['attendee-u13', 'attendee-o13']}, - {slug: 'europe-code-week-2016', recurrence: 1, dates: ['2016-10-15 00:00:00', '2016-10-31 23:59:59'], - evidence: 'Participed in Code Week 2016 by attending a CoderDojo event on the ' + moment.utc(args.application.attendance[0]).format('DD/MM/YYYY')}, - {slug: 'attend-5-dojo-sessions!', recurrence: 5, only: ['attendee-u13', 'attendee-o13']}, - {slug: 'attend-10-dojo-sessions!', recurrence: 10, only: ['attendee-u13', 'attendee-o13']}, - {slug: 'attend-25-dojo-sessions!', recurrence: 25, only: ['attendee-u13', 'attendee-o13']}, - {slug: 'mentor-badge', recurrence: 2, only: ['mentor']} + const recurrentBadges = [ + { slug: 'my-1st-dojo!', recurrence: 1, only: ['attendee-u13', 'attendee-o13'] }, + { + slug: 'europe-code-week-2016', + recurrence: 1, + dates: ['2016-10-15 00:00:00', '2016-10-31 23:59:59'], + evidence: `Participed in Code Week 2016 by attending a CoderDojo event on the ${moment + .utc(args.application.attendance[0]) + .format('DD/MM/YYYY')}`, + }, + { slug: 'attend-5-dojo-sessions!', recurrence: 5, only: ['attendee-u13', 'attendee-o13'] }, + { slug: 'attend-10-dojo-sessions!', recurrence: 10, only: ['attendee-u13', 'attendee-o13'] }, + { slug: 'attend-25-dojo-sessions!', recurrence: 25, only: ['attendee-u13', 'attendee-o13'] }, + { slug: 'mentor-badge', recurrence: 2, only: ['mentor'] }, ]; - var zenHostname = process.env.HOSTNAME || '127.0.0.1:8000'; + const zenHostname = process.env.HOSTNAME || '127.0.0.1:8000'; - async.waterfall([ - getProfile, - getBadges, - checkAvailableBadges, - awardBadges - ], function (err, res) { - if (err) return callback(null, {error: err}); + async.waterfall([getProfile, getBadges, checkAvailableBadges, awardBadges], (err, res) => { + if (err) return callback(null, { error: err }); return callback(null, res); }); - function getProfile (done) { - seneca.act({role: 'cd-dojos', cmd: 'load_usersdojos', query: {userId: application.userId}}, function (err, dojoUser) { + function getProfile(done) { + seneca.act({ + role: 'cd-dojos', + cmd: 'load_usersdojos', + query: { userId: application.userId }, + }, (err, dojoUser) => { if (err) return done(err); - var user = { + const user = { id: application.userId, - userType: _.uniq(_.flatten(_.map(dojoUser, 'userTypes'))) + userType: _.uniq(_.flatten(_.map(dojoUser, 'userTypes'))), // TODO : differenciate badges per dojos ? }; - seneca.act({role: 'cd-profiles', cmd: 'load_user_profile', userId: application.userId}, function (err, profile) { - if (err) return done(err); + seneca.act({ + role: 'cd-profiles', + cmd: 'load_user_profile', + userId: application.userId, + }, (error, profile) => { + if (error) return done(error); user.badges = profile.badges; return done(null, user); }); }); } - function getBadges (dojoUser, done) { - var mozillaRecurrentBadges = []; - seneca.act({role: plugin, cmd: 'listBadges'}, function (err, response) { + function getBadges(dojoUser, done) { + let mozillaRecurrentBadges = []; + seneca.act({ role: plugin, cmd: 'listBadges' }, (err, response) => { if (err) return done(err); - mozillaRecurrentBadges = _.filter(response.badges, function (b) { - return _.find(recurrentBadges, {slug: b.slug}); - }); + mozillaRecurrentBadges = _.filter(response.badges, b => + _.find(recurrentBadges, { slug: b.slug })); return done(null, dojoUser, mozillaRecurrentBadges); }); } - function checkAvailableBadges (dojoUser, mozillaBadges, done) { - var badges = []; - seneca.act({role: 'cd-events', cmd: 'searchApplications', query: {userId: application.userId, 'attendance': {ne$: '{}'}}}, - function (err, applications) { + function checkAvailableBadges(dojoUser, mozillaBadges, done) { + let badges = []; + const filterRecurrent = (value, reference) => value >= reference; + const filterUserType = (value, references) => _.intersection(references, value).length > 0; + seneca.act({ + role: 'cd-events', + cmd: 'searchApplications', + query: { + userId: application.userId, + attendance: { ne$: '{}' }, + }, + }, (err, applications) => { if (err) return done(err); - badges = _.filter(recurrentBadges, function (badge) { - var acceptedUserType = true; - var inDates = true; + badges = _.filter(recurrentBadges, (badge) => { + let acceptedUserType = true; + let inDates = true; if (badge.only) { acceptedUserType = filterUserType(dojoUser.userType, badge.only); } if (badge.dates) { inDates = moment().isBetween(badge.dates[0], badge.dates[1], 'seconds'); } - return filterRecurrent(applications.length, badge.recurrence) && acceptedUserType && inDates; + return ( + filterRecurrent(applications.length, badge.recurrence) && acceptedUserType && inDates + ); }); // Make the link between our restrictions declaration and the real mozillaBadges - var awardableBadges = []; - _.each(badges, function (badge) { - var mozillaBadge = _.find(mozillaBadges, {slug: badge.slug}); + const awardableBadges = []; + _.each(badges, (badge) => { + const mozillaBadge = _.find(mozillaBadges, { slug: badge.slug }); if (mozillaBadge) { mozillaBadge.evidence = badge.evidence; awardableBadges.push(mozillaBadge); } }); // Remove the badges he already owns - var newBadges = _.filter(awardableBadges, function (badge) { - return !_.find(dojoUser.badges, { 'id': badge.id }); - }); - + const newBadges = _.filter( + awardableBadges, + badge => !_.find(dojoUser.badges, { id: badge.id }), + ); return done(null, dojoUser, newBadges); }); - - function filterRecurrent (value, reference) { - return value >= reference; - } - function filterUserType (value, references) { - return _.intersection(references, value).length > 0; - } } - function awardBadges (dojoUser, badges, done) { + function awardBadges(dojoUser, badges, done) { if (badges.length > 0) { - async.eachSeries(badges, function (badge, callback) { - var applicationData = { + async.eachSeries(badges, (badge, cb) => { + const applicationData = { user: dojoUser, - badge: badge, - emailSubject: 'You have been awarded a new CoderDojo digital badge!' + badge, + emailSubject: 'You have been awarded a new CoderDojo digital badge!', }; if (badge.evidence) applicationData.evidence = badge.evidence; - seneca.act({role: plugin, cmd: 'sendBadgeApplication', - applicationData: _.clone(applicationData), user: {id: null}, - zenHostname: zenHostname}, - callback); - }, - function (err) { + seneca.act({ + role: plugin, + cmd: 'sendBadgeApplication', + applicationData: _.clone(applicationData), + user: { id: null }, + zenHostname, + }, cb); + }, (err) => { if (err) return done(err); return done(); }); diff --git a/lib/award-badge.js b/lib/award-badge.js index e06915d..f96e2fc 100644 --- a/lib/award-badge.js +++ b/lib/award-badge.js @@ -1,99 +1,113 @@ -'use strict'; +const async = require('async'); +const moment = require('moment'); +const _ = require('lodash'); -var async = require('async'); -var moment = require('moment'); -var _ = require('lodash'); +function sendBadgeApplication(args, callback) { + const seneca = this; + const plugin = args.role; + const zenHostname = process.env.HOSTNAME || '127.0.0.1:8000'; + const protocol = process.env.PROTOCOL || 'http'; + const applicationData = args.applicationData; + const badge = applicationData.badge; + const earner = applicationData.user; + const emailSubject = applicationData.emailSubject; + const requestingUser = args.user; -function sendBadgeApplication (args, callback) { - var seneca = this; - var plugin = args.role; - var zenHostname = process.env.HOSTNAME || '127.0.0.1:8000'; - var protocol = process.env.PROTOCOL || 'http'; - var applicationData = args.applicationData; - var badge = applicationData.badge; - var earner = applicationData.user; - var emailSubject = applicationData.emailSubject; - var requestingUser = args.user; - - if (earner.id === requestingUser.id) return callback(null, {error: "You can't request a badge application for your own user account."}); + if (earner.id === requestingUser.id) { + return callback(null, { + error: "You can't request a badge application for your own user account.", + }); + } async.waterfall([ getEarnerUser, saveBadgeToUserProfile, loadUserParent, - sendEarnerEmail - ], function (err, res) { - if (err) return callback(null, {error: err}); + sendEarnerEmail, + ], (err, res) => { + if (err) return callback(null, { error: err }); return callback(null, res); }); - - function getEarnerUser (done) { - seneca.act({role: 'cd-users', cmd: 'load', id: earner.id }, function (err, user) { + function getEarnerUser(done) { + seneca.act({ role: 'cd-users', cmd: 'load', id: earner.id }, (err, user) => { if (err) return callback(err); return done(null, user); }); } - function saveBadgeToUserProfile (user, done) { + function saveBadgeToUserProfile(user, done) { badge.status = 'accepted'; badge.dateAccepted = new Date(); // Add assertion for badge baking. badge.assertion = { - uid: 'coderdojo-' + user.id + badge.id, + uid: `coderdojo-${user.id}${badge.id}`, recipient: { identity: user.email, type: 'email', - hashed: false + hashed: false, }, - badge: 'http://badgekit.coderdojo.com:8080/public/systems/coderdojo/badges/' + badge.slug, + badge: `http://badgekit.coderdojo.com:8080/public/systems/coderdojo/badges/${badge.slug}`, verify: { - url: protocol + '://' + zenHostname + '/api/1.0/verify_badge/' + user.id + '/' + badge.id + '/assertion', // url should return badgeAssertion object. - type: 'hosted' + url: `${protocol}://${zenHostname}/api/1.0/verify_badge/${user.id}/${badge.id}/assertion`, // url should return badgeAssertion object. + type: 'hosted', }, - issuedOn: new Date() + issuedOn: new Date(), }; if (applicationData.evidence) { badge.assertion.evidence = applicationData.evidence; } - // Use list_query command instead because cmd_list has security checks and adds unnecessary fields. - seneca.act({role: 'cd-profiles', cmd: 'list', query: {userId: earner.id}}, function (err, response) { + // Use list_query command instead because + // cmd_list has security checks and adds unnecessary fields. + seneca.act({ + role: 'cd-profiles', + cmd: 'list', + query: { userId: earner.id }, + }, (err, profiles) => { if (err) return done(err); - seneca.act({role: plugin, cmd: 'addBadgeToProfile', profile: response[0], badge: badge}, function (err, response) { - if (err) return done(err); + seneca.act({ + role: plugin, + cmd: 'addBadgeToProfile', + profile: profiles[0], + badge, + }, (error, response) => { + if (error) return done(error); if (response.error) return done(response.error); return done(null, response); }); }); } - function loadUserParent (profile, done) { - if (_.contains(earner.types, 'attendee-u13') || _.isEmpty(profile.email) ) { + function loadUserParent(profile, done) { + if (_.contains(earner.types, 'attendee-u13') || _.isEmpty(profile.email)) { if (profile && profile.parents && profile.parents.length > 0) { - seneca.act({role: 'cd-profiles', cmd: 'list', query: {userId: profile.parents[0]}}, function (err, parentProfiles) { + seneca.act({ + role: 'cd-profiles', + cmd: 'list', + query: { userId: profile.parents[0] }, + }, (err, parentProfiles) => { if (err) return done(err); - var parentProfile = parentProfiles[0]; + const parentProfile = parentProfiles[0]; return done(null, profile, parentProfile); }); } else { - if (_.isEmpty(profile.email)){ - return done(new Error('Missing email for user ' + profile.userId + ' and no parents found')); - } else { - return done(null, profile, {}); + if (_.isEmpty(profile.email)) { + return done(new Error(`Missing email for user ${profile.userId} and no parents found`)); } + return done(null, profile, {}); } } else { return done(null, profile, {}); } } - function sendEarnerEmail (profile, parentProfile, done) { - var recipientEmail; - var emailCode = 'award-badge-'; - var locality = args.locality || 'en_US'; + function sendEarnerEmail(profile, parentProfile, done) { + let recipientEmail; + const emailCode = 'award-badge-'; + const locality = args.locality || 'en_US'; if (!_.isEmpty(parentProfile)) { recipientEmail = parentProfile.email; @@ -101,21 +115,21 @@ function sendBadgeApplication (args, callback) { recipientEmail = profile.email; } - var payload = { + const payload = { to: recipientEmail, code: emailCode, - locality: locality, + locality, subject: emailSubject, content: { recipientName: profile.name, badgeName: badge.name, badgeLink: badge.url, - badgeListLink: protocol + '://' + zenHostname + '/dashboard/badges', - profileLink: protocol + '://' + zenHostname + '/profile/' + profile.userId, - year: moment(new Date()).format('YYYY') - } + badgeListLink: `${protocol}://${zenHostname}/dashboard/badges`, + profileLink: `${protocol}://${zenHostname}/profile/${profile.userId}`, + year: moment(new Date()).format('YYYY'), + }, }; - seneca.act({role: 'cd-dojos', cmd: 'send_email', payload: payload}, done); + seneca.act({ role: 'cd-dojos', cmd: 'send_email', payload }, done); } } diff --git a/lib/cd-badges.js b/lib/cd-badges.js index 9b5e0d9..57d2a1c 100644 --- a/lib/cd-badges.js +++ b/lib/cd-badges.js @@ -1,60 +1,89 @@ -'use strict'; - -var listBadges = require('./list-badges'); -var getBadge = require('./get-badge'); -var deleteBadge = require('./delete-badge'); -var updateBadge = require('./update-badge'); -var createBadge = require('./create-badge'); -var awardBadge = require('./award-badge'); -var acceptBadge = require('./accept-badge'); -var loadUserBadges = require('./load-user-badges'); -var loadBadgeCategories = require('./load-badge-categories'); -var loadBadgeByCode = require('./load-badge-by-code'); -var claimBadge = require('./claim-badge'); -var addBadgeToProfile = require('./add-badge-to-profile'); -var exportBadges = require('./export-badges'); -var verifyBadge = require('./verify-badge'); -var assignRecurrentBadges = require('./assign-recurrent-badges'); +const listBadges = require('./list-badges'); +const getBadge = require('./get-badge'); +const deleteBadge = require('./delete-badge'); +const updateBadge = require('./update-badge'); +const createBadge = require('./create-badge'); +const awardBadge = require('./award-badge'); +const acceptBadge = require('./accept-badge'); +const loadUserBadges = require('./load-user-badges'); +const loadBadgeCategories = require('./load-badge-categories'); +const loadBadgeByCode = require('./load-badge-by-code'); +const claimBadge = require('./claim-badge'); +const addBadgeToProfile = require('./add-badge-to-profile'); +const exportBadges = require('./export-badges'); +const verifyBadge = require('./verify-badge'); +const assignRecurrentBadges = require('./assign-recurrent-badges'); +const ping = require('./ping'); // KPIs -var kpiNumberOfBadgesAwarded = require('./kpi-number-of-badges-awarded'); -var kpiNumberOfBadgesPublished = require('./kpi-number-of-badges-published'); +const kpiNumberOfBadgesAwarded = require('./kpi-number-of-badges-awarded'); +const kpiNumberOfBadgesPublished = require('./kpi-number-of-badges-published'); // Perms -var ownBadge = require('./perm/own-badge'); +const ownBadge = require('./perm/own-badge'); -module.exports = function () { - var seneca = this; - var plugin = 'cd-badges'; - var options = seneca.export('options'); +function cdBadges() { + const seneca = this; + const plugin = 'cd-badges'; + const options = seneca.export('options'); - seneca.add({role: plugin, cmd: 'listBadges'}, listBadges({ apiBaseUrl: options.apiBaseUrl, apiSecret: options.apiSecret, claimCodePrefix: options.claimCodePrefix })); - seneca.add({role: plugin, cmd: 'getBadge'}, getBadge({ apiBaseUrl: options.apiBaseUrl, apiSecret: options.apiSecret })); - seneca.add({role: plugin, cmd: 'deleteBadge'}, deleteBadge({ apiBaseUrl: options.apiBaseUrl, apiSecret: options.apiSecret })); - seneca.add({role: plugin, cmd: 'updateBadge'}, updateBadge({ apiBaseUrl: options.apiBaseUrl, apiSecret: options.apiSecret })); - seneca.add({role: plugin, cmd: 'createBadge'}, createBadge({ apiBaseUrl: options.apiBaseUrl, apiSecret: options.apiSecret })); - seneca.add({role: plugin, cmd: 'awardBadge'}, awardBadge.bind(seneca)); + seneca.add( + { role: plugin, cmd: 'listBadges' }, + listBadges({ + apiBaseUrl: options.apiBaseUrl, + apiSecret: options.apiSecret, + claimCodePrefix: options.claimCodePrefix, + }), + ); + seneca.add( + { role: plugin, cmd: 'getBadge' }, + getBadge({ apiBaseUrl: options.apiBaseUrl, apiSecret: options.apiSecret }), + ); + seneca.add( + { role: plugin, cmd: 'deleteBadge' }, + deleteBadge({ apiBaseUrl: options.apiBaseUrl, apiSecret: options.apiSecret }), + ); + seneca.add( + { role: plugin, cmd: 'updateBadge' }, + updateBadge({ apiBaseUrl: options.apiBaseUrl, apiSecret: options.apiSecret }), + ); + seneca.add( + { role: plugin, cmd: 'createBadge' }, + createBadge({ apiBaseUrl: options.apiBaseUrl, apiSecret: options.apiSecret }), + ); + seneca.add({ role: plugin, cmd: 'awardBadge' }, awardBadge.bind(seneca)); // Legacy, used for accepting old badges && to support old code // Do not remove until the rest is refactored/ensured not-used anymore - seneca.add({role: plugin, cmd: 'sendBadgeApplication'}, awardBadge.bind(seneca)); - seneca.add({role: plugin, cmd: 'acceptBadge'}, acceptBadge.bind(seneca)); + seneca.add({ role: plugin, cmd: 'sendBadgeApplication' }, awardBadge.bind(seneca)); + seneca.add({ role: plugin, cmd: 'acceptBadge' }, acceptBadge.bind(seneca)); - seneca.add({role: plugin, cmd: 'loadUserBadges'}, loadUserBadges.bind(seneca)); - seneca.add({role: plugin, cmd: 'loadBadgeCategories'}, loadBadgeCategories); - seneca.add({role: plugin, cmd: 'loadBadgeByCode'}, loadBadgeByCode({ apiBaseUrl: options.apiBaseUrl, apiSecret: options.apiSecret})); - seneca.add({role: plugin, cmd: 'claimBadge'}, claimBadge.bind(seneca)); - seneca.add({role: plugin, cmd: 'addBadgeToProfile'}, addBadgeToProfile.bind(seneca)); - seneca.add({role: plugin, cmd: 'exportBadges'}, exportBadges.bind(seneca)); - seneca.add({role: plugin, cmd: 'verifyBadge'}, verifyBadge.bind(seneca)); - seneca.add({role: plugin, cmd: 'assignRecurrentBadges'}, assignRecurrentBadges.bind(seneca)); + seneca.add({ role: plugin, cmd: 'loadUserBadges' }, loadUserBadges.bind(seneca)); + seneca.add({ role: plugin, cmd: 'loadBadgeCategories' }, loadBadgeCategories); + seneca.add( + { role: plugin, cmd: 'loadBadgeByCode' }, + loadBadgeByCode({ apiBaseUrl: options.apiBaseUrl, apiSecret: options.apiSecret }), + ); + seneca.add({ role: plugin, cmd: 'claimBadge' }, claimBadge.bind(seneca)); + seneca.add({ role: plugin, cmd: 'addBadgeToProfile' }, addBadgeToProfile.bind(seneca)); + seneca.add({ role: plugin, cmd: 'exportBadges' }, exportBadges.bind(seneca)); + seneca.add({ role: plugin, cmd: 'verifyBadge' }, verifyBadge.bind(seneca)); + seneca.add({ role: plugin, cmd: 'assignRecurrentBadges' }, assignRecurrentBadges.bind(seneca)); // KPIs - seneca.add({role: plugin, cmd: 'kpiNumberOfBadgesAwarded'}, kpiNumberOfBadgesAwarded.bind(seneca)); - seneca.add({role: plugin, cmd: 'kpiNumberOfBadgesPublished'}, kpiNumberOfBadgesPublished.bind(seneca)); + seneca.add( + { role: plugin, cmd: 'kpiNumberOfBadgesAwarded' }, + kpiNumberOfBadgesAwarded.bind(seneca), + ); + seneca.add( + { role: plugin, cmd: 'kpiNumberOfBadgesPublished' }, + kpiNumberOfBadgesPublished.bind(seneca), + ); // Perms - seneca.add({role: plugin, cmd: 'ownBadge'}, ownBadge.bind(seneca)); + seneca.add({ role: plugin, cmd: 'ownBadge' }, ownBadge.bind(seneca)); // System - seneca.add({ role: plugin, cmd: 'ping' }, require('./ping')); + seneca.add({ role: plugin, cmd: 'ping' }, ping); return { - name: plugin + name: plugin, }; -}; +} + +module.exports = cdBadges; diff --git a/lib/claim-badge.js b/lib/claim-badge.js index 7022492..c7ba933 100644 --- a/lib/claim-badge.js +++ b/lib/claim-badge.js @@ -1,41 +1,41 @@ -'use strict'; +const async = require('async'); -var _ = require('lodash'); -var async = require('async'); - -function claimBadge (args, callback) { - var seneca = this; - var plugin = args.role; - var options = seneca.export('options'); +function claimBadge(args, callback) { + const seneca = this; + const plugin = args.role; if (!args.badge) return callback(null, { error: 'Invalid request. No badge received.' }); - var badge = args.badge; - var requestingUser = args.user; - var claimCodePrefix = options.claimCodePrefix; - var proxiedUser = args.userId; // Very likely to be their children + const badge = args.badge; + const requestingUser = args.user; + const proxiedUser = args.userId; // Very likely to be their children badge.status = 'accepted'; badge.dateAccepted = new Date(); - async.waterfall([ - checkProxyClaim, - awardBadge - ]); + async.waterfall([checkProxyClaim, awardBadge]); /** * [checkProxyClaim check if the requesting user is having any link to the awarded user] * @param {Function} cb waterfall callback - * @return {} the requested user is global (var requestingUser), though the use of an empty response + * @return {} the requested user is global (requestingUser), though the use of an empty response */ - function checkProxyClaim (cb){ + function checkProxyClaim(cb) { if (proxiedUser) { - var params = {}; + const params = {}; params.userId = proxiedUser; - seneca.act({role: 'cd-users', cmd: 'is_parent_of', user: requestingUser, params: params }, function (err, response){ - if(response.allowed === true){ + seneca.act({ + role: 'cd-users', + cmd: 'is_parent_of', + user: requestingUser, + params, + }, (err, response) => { + if (response.allowed === true) { requestingUser.id = proxiedUser; cb(); - }else { - callback(null, {ok: false, error: 'You cannot claim for somebody else but your own children'}); + } else { + callback(null, { + ok: false, + error: 'You cannot claim for somebody else but your own children', + }); } }); } else { @@ -47,17 +47,25 @@ function claimBadge (args, callback) { * [awardBadge add a badge to the targetUser's list of badges] * @param {Function} cb waterfall callback */ - function awardBadge (cb) { - seneca.act({role: 'cd-profiles', cmd: 'list', query: {userId: requestingUser.id}}, function (err, response) { - if (err) return callback(err); - seneca.act({role: plugin, cmd: 'addBadgeToProfile', profile: response[0], badge: badge}, function (err, response) { - if (err) return callback(err); - if (response.error) return callback(null, {error: response.error}); - return callback(null, response); + function awardBadge(cb) { + seneca.act({ + role: 'cd-profiles', + cmd: 'list', + query: { userId: requestingUser.id }, + }, (err, profiles) => { + if (err) return cb(err); + seneca.act({ + role: plugin, + cmd: 'addBadgeToProfile', + profile: profiles[0], + badge, + }, (error, response) => { + if (error) return cb(error); + if (response.error) return callback(null, { error: response.error }); + return cb(null, response); }); }); } - } module.exports = claimBadge; diff --git a/lib/create-badge.js b/lib/create-badge.js index 49825f7..b75d96d 100644 --- a/lib/create-badge.js +++ b/lib/create-badge.js @@ -1,32 +1,28 @@ -'use strict'; +const request = require('request'); +const getToken = require('./utils/get-token'); +const parseResponse = require('./utils/parse-response'); -var request = require('request'); -var getToken = require('./utils/get-token'); -var parseResponse = require('./utils/parse-response'); - -module.exports = function (options) { - var apiBaseUrl = options.apiBaseUrl; - var apiSecret = options.apiSecret; - var requestWithDefaults = request.defaults({ - baseUrl: apiBaseUrl +module.exports = (options) => { + const apiBaseUrl = options.apiBaseUrl; + const apiSecret = options.apiSecret; + const requestWithDefaults = request.defaults({ + baseUrl: apiBaseUrl, }); - function createBadge (args, callback) { - var resource = '/systems/coderdojo/badges'; - var method = 'POST'; - var token = getToken(resource, apiSecret, method, JSON.stringify(args.badgeInfo)); + return (args, callback) => { + const resource = '/systems/coderdojo/badges'; + const method = 'POST'; + const token = getToken(resource, apiSecret, method, JSON.stringify(args.badgeInfo)); - var requestOptions = { + const requestOptions = { uri: resource, - method: method, + method, headers: { - 'Authorization': 'JWT token="' + token + '"' + Authorization: `JWT token="${token}"`, }, - json: args.badgeInfo + json: args.badgeInfo, }; requestWithDefaults(requestOptions, parseResponse.bind(null, 201, callback)); - } - - return createBadge; + }; }; diff --git a/lib/delete-badge.js b/lib/delete-badge.js index a558229..2c45cf2 100644 --- a/lib/delete-badge.js +++ b/lib/delete-badge.js @@ -1,30 +1,26 @@ -'use strict'; +const request = require('request'); +const getToken = require('./utils/get-token'); +const parseResponse = require('./utils/parse-response'); -var request = require('request'); -var getToken = require('./utils/get-token'); -var parseResponse = require('./utils/parse-response'); - -module.exports = function (options) { - var apiBaseUrl = options.apiBaseUrl; - var apiSecret = options.apiSecret; - var requestWithDefaults = request.defaults({ - baseUrl: apiBaseUrl +module.exports = (options) => { + const apiBaseUrl = options.apiBaseUrl; + const apiSecret = options.apiSecret; + const requestWithDefaults = request.defaults({ + baseUrl: apiBaseUrl, }); - function deleteBadge (args, callback) { - var resource = '/systems/coderdojo/badges/' + args.slug; - var method = 'DELETE'; + return (args, callback) => { + const resource = `/systems/coderdojo/badges/${args.slug}`; + const method = 'DELETE'; - var requestOptions = { + const requestOptions = { uri: resource, - method: method, + method, headers: { - 'Authorization': 'JWT token="' + getToken(resource, apiSecret, method) + '"' - } + Authorization: `JWT token="${getToken(resource, apiSecret, method)}"`, + }, }; requestWithDefaults(requestOptions, parseResponse.bind(null, 200, callback)); - } - - return deleteBadge; + }; }; diff --git a/lib/export-badges.js b/lib/export-badges.js index 90a2db0..46a8f19 100644 --- a/lib/export-badges.js +++ b/lib/export-badges.js @@ -1,74 +1,76 @@ -'use strict'; +const async = require('async'); +const request = require('request'); +const bakery = require('openbadges-bakery'); -var async = require('async'); -var request = require('request'); -var bakery = require('openbadges-bakery'); - -function exportBadges (args, callback) { - var seneca = this; - var user = args.user; +function exportBadges(args, callback) { + const seneca = this; + const user = args.user; async.waterfall([ loadUsersBadges, downloadBadgeImages, - bakeBadgeImages - ], function (err, res) { - if (err) return callback(null, {error: err.message}); + bakeBadgeImages, + ], (err, res) => { + if (err) return callback(null, { error: err.message }); return callback(null, res); }); - function loadUsersBadges (done) { - seneca.act({role: 'cd-profiles', cmd: 'list', query: {userId: user.id}}, function (err, response) { + function loadUsersBadges(done) { + seneca.act({ + role: 'cd-profiles', + cmd: 'list', + query: { userId: user.id }, + }, (err, response) => { if (err) return done(err); - var profile = response[0]; + const profile = response[0]; return done(null, profile.badges); }); } - function downloadBadgeImages (badges, done) { - var badgeData = []; - async.each(badges, function (badge, cb) { + function downloadBadgeImages(badges, done) { + const badgeData = []; + async.each(badges, (badge, cb) => { if (!badge.assertion) return cb(); - download(badge.imageUrl, badge.slug + '.png', function (err, response) { + download(badge.imageUrl, `${badge.slug}.png`, (err, response) => { if (err) return cb(err); badge.encodedImage = response; badgeData.push(badge); cb(); }); - }, function (err) { + }, (err) => { if (err) return done(err); return done(null, badgeData); }); } - function bakeBadgeImages (badgeData, done) { - var bakedBadges = []; - async.eachSeries(badgeData, function (badge, cb) { - var badgeImage = badge.encodedImage; - var badgeAssertion = badge.assertion; - var options = { + function bakeBadgeImages(badgeData, done) { + const bakedBadges = []; + async.eachSeries(badgeData, (badge, cb) => { + const badgeImage = badge.encodedImage; + const badgeAssertion = badge.assertion; + const options = { image: badgeImage, - assertion: badgeAssertion + assertion: badgeAssertion, }; // bake assertion into image - bakery.bake(options, function (err, data) { + bakery.bake(options, (err, data) => { if (err) return done(err); bakedBadges.push(data); cb(); }); - }, function (err) { + }, (err) => { if (err) return done(err); return done(null, bakedBadges); }); } - var download = function (uri, filename, callback) { - request.get({uri: uri, encoding: null}, function (err, res, body) { - if (err) return callback(err); - return callback(null, body); + function download(uri, filename, done) { + request.get({ uri, encoding: null }, (err, res, body) => { + if (err) return done(err); + return done(null, body); }); - }; + } } module.exports = exportBadges; diff --git a/lib/get-badge.js b/lib/get-badge.js index e23e5cd..923535f 100644 --- a/lib/get-badge.js +++ b/lib/get-badge.js @@ -1,29 +1,24 @@ -'use strict'; +const request = require('request'); +const getToken = require('./utils/get-token'); +const parseResponse = require('./utils/parse-response'); -var request = require('request'); -var getToken = require('./utils/get-token'); -var parseResponse = require('./utils/parse-response'); - -module.exports = function (options) { - var apiBaseUrl = options.apiBaseUrl; - var apiSecret = options.apiSecret; - var requestWithDefaults = request.defaults({ - baseUrl: apiBaseUrl +module.exports = (options) => { + const apiBaseUrl = options.apiBaseUrl; + const apiSecret = options.apiSecret; + const requestWithDefaults = request.defaults({ + baseUrl: apiBaseUrl, }); - function getBadge (args, callback) { - var resource = '/systems/coderdojo/badges/' + args.slug; + return (args, callback) => { + const resource = `/systems/coderdojo/badges/${args.slug}`; - var requestOptions = { + const requestOptions = { uri: resource, method: 'GET', headers: { - 'Authorization': 'JWT token="' + getToken(resource, apiSecret) + '"' - } + Authorization: `JWT token="${getToken(resource, apiSecret)}"`, + }, }; - requestWithDefaults(requestOptions, parseResponse.bind(null, 200, callback)); - } - - return getBadge; + }; }; diff --git a/lib/kpi-number-of-badges-awarded.js b/lib/kpi-number-of-badges-awarded.js index e0a9a58..00a7062 100644 --- a/lib/kpi-number-of-badges-awarded.js +++ b/lib/kpi-number-of-badges-awarded.js @@ -1,43 +1,44 @@ -'use strict'; +const _ = require('lodash'); -var _ = require('lodash'); -var async = require('async'); +function kpiNumberOfBadgesAwarded(args, callback) { + const seneca = this; + const plugin = args.role; -function kpiNumberOfBadgesAwarded (args, callback) { - var seneca = this; - var plugin = args.role; + loadBadgeCategories() + .then(countBadges) + .then(numberOfBadgesAwarded => callback(null, numberOfBadgesAwarded)) + .catch(err => callback(null, { error: err })); - async.waterfall([ - loadBadgeCategories, - countBadges - ], function (err, numberOfBadgesAwarded) { - if (err) return callback(null, {error: err}); - return callback(null, numberOfBadgesAwarded); - }); - - function loadBadgeCategories (done) { - seneca.act({role: plugin, cmd: 'loadBadgeCategories'}, done); + function loadBadgeCategories() { + return new Promise((resolve, reject) => { + seneca.act({ role: plugin, cmd: 'loadBadgeCategories' }, (err, cat) => { + if (err) reject(err); + resolve(cat); + }); + }); } - function countBadges (badgeCategories, done) { - var numberOfBadgesAwarded = {total: 0}; - seneca.act({role: 'cd-profiles', cmd: 'list'}, function (err, profiles) { - if (err) return callback(err); - _.each(profiles, function (profile) { - _.each(profile.badges, function (badge) { - _.each(badgeCategories.categories, function (category) { - var categoryFound = _.find(badge.tags, function (tag) { - return tag.value === category; + function countBadges(badgeCategories) { + return new Promise((resolve, reject) => { + const numberOfBadgesAwarded = { total: 0 }; + seneca.act({ role: 'cd-profiles', cmd: 'list' }, (err, profiles) => { + if (err) reject(err); + _.each(profiles, (profile) => { + _.each(profile.badges, (badge) => { + _.each(badgeCategories.categories, (category) => { + const categoryFound = _.find(badge.tags, tag => tag.value === category); + if (categoryFound) { + if (!numberOfBadgesAwarded[categoryFound.value]) { + numberOfBadgesAwarded[categoryFound.value] = 0; + } + numberOfBadgesAwarded[categoryFound.value] += 1; + numberOfBadgesAwarded.total += 1; + } }); - if (categoryFound) { - if (!numberOfBadgesAwarded[categoryFound.value]) numberOfBadgesAwarded[categoryFound.value] = 0; - numberOfBadgesAwarded[categoryFound.value] += 1; - numberOfBadgesAwarded.total += 1; - } }); }); + resolve(numberOfBadgesAwarded); }); - return done(null, numberOfBadgesAwarded); }); } } diff --git a/lib/kpi-number-of-badges-published.js b/lib/kpi-number-of-badges-published.js index a1445f0..bfecd14 100644 --- a/lib/kpi-number-of-badges-published.js +++ b/lib/kpi-number-of-badges-published.js @@ -1,34 +1,27 @@ -'use strict'; +const async = require('async'); +const _ = require('lodash'); -var async = require('async'); -var _ = require('lodash'); +function kpiNumberOfBadgesPublished(args, callback) { + const seneca = this; + const plugin = args.role; -function kpiNumberOfBadgesPublished (args, callback) { - var seneca = this; - var plugin = args.role; - - async.waterfall([ - loadBadgeCategories, - countPublishedBadges - ], function (err, kpiData) { - if (err) return callback(null, {error: err}); + async.waterfall([loadBadgeCategories, countPublishedBadges], (err, kpiData) => { + if (err) return callback(null, { error: err }); return callback(null, kpiData); }); - function loadBadgeCategories (done) { - seneca.act({role: plugin, cmd: 'loadBadgeCategories'}, done); + function loadBadgeCategories(done) { + seneca.act({ role: plugin, cmd: 'loadBadgeCategories' }, done); } - function countPublishedBadges (badgeCategories, done) { - var kpiData = {total: 0}; - seneca.act({role: plugin, cmd: 'listBadges'}, function (err, data) { + function countPublishedBadges(badgeCategories, done) { + const kpiData = { total: 0 }; + seneca.act({ role: plugin, cmd: 'listBadges' }, (err, data) => { if (err) return done(err); - var badges = data.badges; - _.each(badgeCategories.categories, function (category) { - _.each(badges, function (badge) { - var categoryFound = _.find(badge.tags, function (tag) { - return tag.value === category; - }); + const badges = data.badges; + _.each(badgeCategories.categories, (category) => { + _.each(badges, (badge) => { + const categoryFound = _.find(badge.tags, tag => tag.value === category); if (categoryFound) { if (!kpiData[categoryFound.value]) kpiData[categoryFound.value] = 0; kpiData[categoryFound.value] += 1; diff --git a/lib/list-badges.js b/lib/list-badges.js index 1cfdf72..dbe80f8 100644 --- a/lib/list-badges.js +++ b/lib/list-badges.js @@ -1,35 +1,34 @@ -'use strict'; +const request = require('request'); +const getToken = require('./utils/get-token'); +const _ = require('lodash'); -var request = require('request'); -var getToken = require('./utils/get-token'); -var _ = require('lodash'); - -module.exports = function (options) { - var apiBaseUrl = options.apiBaseUrl; - var apiSecret = options.apiSecret; - var requestWithDefaults = request.defaults({ - baseUrl: apiBaseUrl +module.exports = (options) => { + const apiBaseUrl = options.apiBaseUrl; + const apiSecret = options.apiSecret; + const requestWithDefaults = request.defaults({ + baseUrl: apiBaseUrl, }); - function listBadges (args, callback) { - var clientRequest = args.clientRequest; + return (args, callback) => { + let clientRequest = args.clientRequest; if (typeof clientRequest === 'undefined') { clientRequest = true; } - var claimCodePrefix = options.claimCodePrefix; - var resource = '/systems/coderdojo/badges'; - var requestOptions = { + const claimCodePrefix = options.claimCodePrefix; + const resource = '/systems/coderdojo/badges'; + const requestOptions = { uri: resource, method: 'GET', headers: { - 'Authorization': 'JWT token="' + getToken(resource, apiSecret) + '"' - } + Authorization: `JWT token="${getToken(resource, apiSecret)}"`, + }, }; - function cb (error, response, body) { + function cb(error, response, body) { + // TODO: Break this out in to its own file it is ues all calls to badgekit if (typeof body === 'string') { try { - body = JSON.parse(body); + body = JSON.parse(body); // eslint-disable-line no-param-reassign } catch (e) { return callback(e); } @@ -37,9 +36,9 @@ module.exports = function (options) { if (!error && response.statusCode === 200) { if (clientRequest) { // Remove tags containing claimCodePrefix. - _.each(body.badges, function (badge) { - var indexFound; - var containsPrefix = _.find(badge.tags, function (tag, index) { + _.each(body.badges, (badge) => { + let indexFound; + const containsPrefix = _.find(badge.tags, (tag, index) => { indexFound = index; return _.contains(tag.value, claimCodePrefix); }); @@ -53,9 +52,6 @@ module.exports = function (options) { } return callback(error || new Error(body.message)); } - requestWithDefaults(requestOptions, cb); - } - - return listBadges; + }; }; diff --git a/lib/load-badge-by-code.js b/lib/load-badge-by-code.js index 106230f..a58d9de 100644 --- a/lib/load-badge-by-code.js +++ b/lib/load-badge-by-code.js @@ -1,35 +1,32 @@ -'use strict'; +const request = require('request'); +const getToken = require('./utils/get-token'); -var request = require('request'); -var getToken = require('./utils/get-token'); -var _ = require('lodash'); - -module.exports = function (options) { - var apiBaseUrl = options.apiBaseUrl; - var apiSecret = options.apiSecret; - var requestWithDefaults = request.defaults({ - baseUrl: apiBaseUrl +module.exports = (options) => { + const apiBaseUrl = options.apiBaseUrl; + const apiSecret = options.apiSecret; + const requestWithDefaults = request.defaults({ + baseUrl: apiBaseUrl, }); - function loadBadgeByCode (args, callback) { - var code = args.code; - var clientRequest = args.clientRequest; + return (args, callback) => { + const code = args.code; + let clientRequest = args.clientRequest; if (typeof clientRequest === 'undefined') { clientRequest = true; } - var resource = '/systems/coderdojo/codes/' + code; - var requestOptions = { + const resource = `/systems/coderdojo/codes/${code}`; + const requestOptions = { uri: resource, method: 'GET', headers: { - 'Authorization': 'JWT token="' + getToken(resource, apiSecret) + '"' - } + Authorization: `JWT token="${getToken(resource, apiSecret)}"`, + }, }; - function cb (error, response, body) { + function cb(error, response, body) { if (typeof body === 'string') { try { - body = JSON.parse(body); + body = JSON.parse(body); // eslint-disable-line no-param-reassign } catch (e) { return callback(e); } @@ -40,6 +37,5 @@ module.exports = function (options) { return callback(error || new Error(body.message)); } requestWithDefaults(requestOptions, cb); - } - return loadBadgeByCode; + }; }; diff --git a/lib/load-badge-categories.js b/lib/load-badge-categories.js index 71ec61a..30caca3 100644 --- a/lib/load-badge-categories.js +++ b/lib/load-badge-categories.js @@ -1,8 +1,6 @@ -'use strict'; - -function loadBadgeCategories (args, callback) { - var categories = ['programming', 'soft-skills', 'events']; - callback(null, {categories: categories}); +function loadBadgeCategories(args, callback) { + const categories = ['programming', 'soft-skills', 'events']; + callback(null, { categories }); } module.exports = loadBadgeCategories; diff --git a/lib/load-user-badges.js b/lib/load-user-badges.js index 5c40297..ea847d4 100644 --- a/lib/load-user-badges.js +++ b/lib/load-user-badges.js @@ -1,14 +1,15 @@ -'use strict'; - -function loadUserBadges (args, callback) { - var seneca = this; - var userId = args.userId; +function loadUserBadges(args, callback) { + const seneca = this; + const userId = args.userId; // Retrieve the badges through the cd_profiles cmd_list action to apply security checks. - seneca.act({role: 'cd-profiles', cmd: 'list', query: {userId: userId}}, function (err, response) { + seneca.act({ + role: 'cd-profiles', + cmd: 'list', + query: { userId }, + }, (err, response) => { if (err) return callback(err); - var badges = response.badges; - return callback(null, badges); + return callback(null, response.badges); }); } diff --git a/lib/perm/own-badge.js b/lib/perm/own-badge.js index 39ac39f..716a85f 100644 --- a/lib/perm/own-badge.js +++ b/lib/perm/own-badge.js @@ -1,14 +1,9 @@ -'use strict'; - -function ownBadge (args, callback) { - var seneca = this; - var requestUser = args.user.id; - var badgeUser = args.params.badgeData.userId; - var validity = false; - if (requestUser === badgeUser) { - validity = true; - } - return callback(null, {'allowed': validity}); +function ownBadge(args, callback) { + const requestUser = args.user.id; + const badgeUser = args.params.badgeData.userId; + let validity = false; + if (requestUser === badgeUser) validity = true; + return callback(null, { allowed: validity }); } module.exports = ownBadge; diff --git a/lib/ping.js b/lib/ping.js index 672cd93..c511c1a 100644 --- a/lib/ping.js +++ b/lib/ping.js @@ -1,4 +1,5 @@ -var ping = function (args, done) { - done(null, {status: 'ok'}); -}; +function ping(args, done) { + done(null, { status: 'ok' }); +} + module.exports = ping; diff --git a/lib/update-badge.js b/lib/update-badge.js index a81b77f..102a34e 100644 --- a/lib/update-badge.js +++ b/lib/update-badge.js @@ -1,32 +1,28 @@ -'use strict'; +const request = require('request'); +const getToken = require('./utils/get-token'); +const parseResponse = require('./utils/parse-response'); -var request = require('request'); -var getToken = require('./utils/get-token'); -var parseResponse = require('./utils/parse-response'); - -module.exports = function (options) { - var apiBaseUrl = options.apiBaseUrl; - var apiSecret = options.apiSecret; - var requestWithDefaults = request.defaults({ - baseUrl: apiBaseUrl +module.exports = (options) => { + const apiBaseUrl = options.apiBaseUrl; + const apiSecret = options.apiSecret; + const requestWithDefaults = request.defaults({ + baseUrl: apiBaseUrl, }); - function updateBadge (args, callback) { - var resource = '/systems/coderdojo/badges/' + args.slug; - var method = 'PUT'; - var token = getToken(resource, apiSecret, method, JSON.stringify(args.badgeInfo)); + return (args, callback) => { + const resource = `/systems/coderdojo/badges/${args.slug}`; + const method = 'PUT'; + const token = getToken(resource, apiSecret, method, JSON.stringify(args.badgeInfo)); - var requestOptions = { + const requestOptions = { uri: resource, - method: method, + method, headers: { - 'Authorization': 'JWT token="' + token + '"' + Authorization: `JWT token="${token}"`, }, - json: args.badgeInfo + json: args.badgeInfo, }; requestWithDefaults(requestOptions, parseResponse.bind(null, 200, callback)); - } - - return updateBadge; + }; }; diff --git a/lib/utils/get-sha256-hash.js b/lib/utils/get-sha256-hash.js index e42065b..51e0f67 100644 --- a/lib/utils/get-sha256-hash.js +++ b/lib/utils/get-sha256-hash.js @@ -1,10 +1,3 @@ -'use strict'; +const crypto = require('crypto'); -var crypto = require('crypto'); - -function getSha256Hash (data) { - var computedHash = crypto.createHash('sha256').update(data).digest('hex'); - return computedHash; -} - -module.exports = getSha256Hash; +module.exports = data => crypto.createHash('sha256').update(data).digest('hex'); diff --git a/lib/utils/get-token.js b/lib/utils/get-token.js index de7ac8b..0d2e127 100644 --- a/lib/utils/get-token.js +++ b/lib/utils/get-token.js @@ -1,27 +1,27 @@ -'use strict'; +const jws = require('jws'); +const getSha256Hash = require('./get-sha256-hash'); -var jws = require('jws'); -var getSha256Hash = require('./get-sha256-hash'); +const seconds = sec => sec * 1000; -function getToken (resource, apiSecret, method, body) { - var claimData = { +function getToken(resource, apiSecret, method, body) { + const claimData = { header: { typ: 'JWT', - alg: 'HS256' + alg: 'HS256', }, payload: { key: 'master', - exp: Date.now() + (1000 * 60), + exp: Date.now() + seconds(60), method: method || 'GET', - path: resource + path: resource, }, - secret: apiSecret + secret: apiSecret, }; if (body) { claimData.payload.body = { alg: 'sha256', - hash: getSha256Hash(body) + hash: getSha256Hash(body), }; } diff --git a/lib/utils/parse-response.js b/lib/utils/parse-response.js index 790487d..5b52195 100644 --- a/lib/utils/parse-response.js +++ b/lib/utils/parse-response.js @@ -1,17 +1,13 @@ -'use strict'; - -function parseResponse (expectedStatusCode, cb, error, response, body) { +function parseResponse(expectedStatusCode, cb, error, response, body) { if (typeof body === 'string') { try { - body = JSON.parse(body); + body = JSON.parse(body); // eslint-disable-line no-param-reassign } catch (e) { return cb(e); } } - if (!error && response.statusCode === expectedStatusCode) { - return cb(null, body); - } + if (!error && response.statusCode === expectedStatusCode) return cb(null, body); return cb(error || new Error(body.message)); } diff --git a/lib/verify-badge.js b/lib/verify-badge.js index 97437b7..54181d3 100644 --- a/lib/verify-badge.js +++ b/lib/verify-badge.js @@ -1,21 +1,19 @@ -'use strict'; +const { find } = require('lodash'); -var _ = require('lodash'); - -function verifyBadge (args, callback) { - var seneca = this; - var userId = args.userId; - var badgeId = parseInt(args.badgeId, 10); +function verifyBadge(args, callback) { + const seneca = this; + const userId = args.userId; + const badgeId = parseInt(args.badgeId, 10); // Retrieve badge assertion object - seneca.act({role: 'cd-profiles', cmd: 'list', query: {userId: userId}}, function (err, response) { + seneca.act({ + role: 'cd-profiles', + cmd: 'list', + query: { userId }, + }, (err, response) => { if (err) return callback(err); - var profile = response[0]; - - var badgeFound = _.find(profile.badges, function (badge) { - return badge.id === badgeId; - }); - + const profile = response[0]; + const badgeFound = find(profile.badges, badge => badge.id === badgeId); return callback(null, badgeFound.assertion); }); } diff --git a/newrelic.js b/newrelic.js index 5c0f033..a713e84 100644 --- a/newrelic.js +++ b/newrelic.js @@ -10,6 +10,9 @@ exports.config = { app_name: ['cp-badges-service'], agent_enabled: false, // set via NEW_RELIC_ENABLED for production - license_key: '', // set via NEW_RELIC_LICENSE_KEY - filepath: '/tmp/newrelic_agent_badges.log' + license_key: '', // set via NEW_RELIC_LICENSE_KEY + logging: { + level: 'info', + filepath: '/tmp/newrelic_agent_badges.log', + }, }; diff --git a/package.json b/package.json index c2afb4f..6390720 100644 --- a/package.json +++ b/package.json @@ -2,17 +2,14 @@ "name": "badges-service", "version": "0.1.0", "description": "", - "private": true, "main": "service.js", "scripts": { "start": "node .", "dev": "nodemon .", - "lint": "./node_modules/.bin/semistandard *.js config/config.js lib", - "test": "npm run lint && ./node_modules/.bin/lab --ignore __core-js_shared__ --flat --threshold 92 -r html -o ./coverage/coverage.html -r lcov -o ./coverage/lcov.info -r json -o ./coverage/coverage.json -r console -o stdout" + "lint": "eslint .", + "fix": "eslint . --fix", + "test": "lab --ignore __core-js_shared__ --flat --threshold 91 -r html -o ./coverage/coverage.html -r lcov -o ./coverage/lcov.info -r json -o ./coverage/coverage.json -r console -o stdout" }, - "pre-commit": [ - "test" - ], "repository": { "type": "git", "url": "git://github.com/CoderDojo/cp-badges-service.git" @@ -23,27 +20,31 @@ "url": "https://github.com/CoderDojo/community-platform/issues" }, "dependencies": { - "async": "1.3.0", - "cp-logs-lib": "git://github.com/CoderDojo/cp-logs-lib#1.1.0", - "cp-permissions-plugin": "git://github.com/CoderDojo/cp-permissions-plugin#1.0.2", - "jws": "3.0.0", - "le_node": "1.1.0", - "lodash": "3.7.0", - "moment": "2.10.3", - "newrelic": "1.21.1", - "openbadges-bakery": "1.0.4", - "request": "2.58.0", - "seneca": "0.7.2" + "async": "^1.3.0", + "cp-logs-lib": "CoderDojo/cp-logs-lib#1.1.0", + "cp-permissions-plugin": "CoderDojo/cp-permissions-plugin#1.0.2", + "jws": "^3.0.0", + "le_node": "^1.1.0", + "lodash": "^3.7.0", + "moment": "^2.10.3", + "newrelic": "^2.4.2", + "openbadges-bakery": "^1.0.5", + "request": "^2.58.0", + "seneca": "^0.7.2" }, "devDependencies": { - "chai": "2.3.0", - "lab": "14.x", - "nodemon": "1.11.0", - "pre-commit": "1.1.2", - "semistandard": "7.0.3", - "sinon": "1.14.1" + "chai": "^4.0.2", + "eslint": "4.6.0", + "eslint-config-coderdojo": "^1.1.0", + "eslint-plugin-chai-friendly": "0.4.0", + "eslint-plugin-import": "2.7.0", + "eslint-plugin-jsx-a11y": "5.1.1", + "eslint-plugin-react": "7.3.0", + "lab": "^14.1.0", + "nodemon": "^1.11.0", + "sinon": "^2.3.6" }, "engine": { - "node": "0.10.x" + "node": ">8.9" } } diff --git a/service.js b/service.js index dd22c8e..ec7ddab 100644 --- a/service.js +++ b/service.js @@ -1,47 +1,46 @@ -'use strict'; process.setMaxListeners(0); -require('events').EventEmitter.prototype._maxListeners = 100; +require('events').EventEmitter.prototype._maxListeners = 100; // eslint-disable-line no-underscore-dangle -if (process.env.NEW_RELIC_ENABLED === 'true') require('newrelic'); +if (process.env.NEW_RELIC_ENABLED === 'true') require('newrelic'); // eslint-disable-line global-require + +const options = require('./config/seneca-options'); +const seneca = require('seneca')(options); +const log = require('cp-logs-lib')({ name: 'cp-badges-service', level: 'warn' }); -var options = require('./config/seneca-options'); -var seneca = require('seneca')(options); -var log = require('cp-logs-lib')({name: 'cp-badges-service', level: 'warn'}); options.log = log.log; -var cdBadges = require('./lib/cd-badges'); +const cdBadges = require('./lib/cd-badges'); seneca.options(options); -seneca.log.info( - 'Seneca options', - JSON.stringify(options, null, 4) -); +seneca.log.info('Seneca options', JSON.stringify(options, null, 4)); seneca.use(cdBadges); seneca.use(require('cp-permissions-plugin'), { - config: __dirname + '/config/permissions' + config: `${__dirname}/config/permissions`, }); -seneca.listen() + +seneca + .listen() .client({ type: 'web', host: process.env.CD_DOJOS || 'localhost', port: 10301, - pin: { role: 'cd-dojos', cmd: '*' } + pin: { role: 'cd-dojos', cmd: '*' }, }) .client({ type: 'web', host: process.env.CD_USERS || 'localhost', port: 10303, - pin: { role: 'cd-profiles', cmd: '*' } + pin: { role: 'cd-profiles', cmd: '*' }, }) .client({ type: 'web', host: process.env.CD_USERS || 'localhost', port: 10303, - pin: { role: 'cd-users', cmd: '*' } + pin: { role: 'cd-users', cmd: '*' }, }) .client({ type: 'web', host: process.env.CD_EVENTS || 'localhost', port: 10306, - pin: { role: 'cd-events', cmd: '*' } + pin: { role: 'cd-events', cmd: '*' }, }); diff --git a/test/create-badge.spec.js b/test/create-badge.spec.js index 32c5ac3..3afac39 100644 --- a/test/create-badge.spec.js +++ b/test/create-badge.spec.js @@ -1,169 +1,171 @@ -'use strict'; - -var expect = require('chai').expect; -var sinon = require('sinon'); -var jws = require('jws'); -var startTestApi = require('./utils/test-server'); -var getSha256Hash = require('../lib/utils/get-sha256-hash'); -var lab = exports.lab = require('lab').script(); - -var testApi; - -var badgeInfo = { - name: 'name', - imageUrl: 'http://issuersite.com/badge.png', - unique: false, - criteriaUrl: 'http://issuersite.com/criteria', - earnerDescription: 'description for potential earners', - consumerDescription: 'description for consumers', - strapline: 'strapline', - issuerUrl: 'http://issuersite.com', - rubricUrl: 'http://issuersite.com/rubric', - timeValue: 10, - timeUnits: 'minutes', - evidenceType: 'URL', - limit: 5, - archived: false, - criteria: [{ - id: 1, - description: 'criteria description', - required: 1, - note: 'note for assessor' - }], - type: 'badge type', - categories: [], - tags: [], - milestones: [] +exports.lab = require('lab').script(); + +const lab = exports.lab; +const { expect } = require('chai'); +const sinon = require('sinon'); +const jws = require('jws'); +const startTestApi = require('./utils/test-server'); +const getSha256Hash = require('../lib/utils/get-sha256-hash'); +const createBadge = require('../lib/create-badge'); + +let testApi; +const seconds = sec => sec * 1000; + +const badgeInfo = { + name: 'name', + imageUrl: 'http://issuersite.com/badge.png', + unique: false, + criteriaUrl: 'http://issuersite.com/criteria', + earnerDescription: 'description for potential earners', + consumerDescription: 'description for consumers', + strapline: 'strapline', + issuerUrl: 'http://issuersite.com', + rubricUrl: 'http://issuersite.com/rubric', + timeValue: 10, + timeUnits: 'minutes', + evidenceType: 'URL', + limit: 5, + archived: false, + criteria: [ + { + id: 1, + description: 'criteria description', + required: 1, + note: 'note for assessor', + }, + ], + type: 'badge type', + categories: [], + tags: [], + milestones: [], }; - -lab.experiment('create badge', function() { - var sandbox; - var clock; - var now = 0; - var jwsSignStub; - var checkRequestStub; - var testApiTestResponseStub; - var createBadge; - var resource = '/systems/coderdojo/badges'; - var dummyBaseUrl = 'http://localhost:3000'; - var dummyToken = 'dummyToken'; - var dummySecret = 'dummySecret'; - - lab.before(function(done) { - testApi = startTestApi(done); +lab.experiment('create badge', () => { + let sandbox; + let clock; + const now = 0; + let jwsSignStub; + let checkRequestStub; + let testApiTestResponseStub; + let createdBadge; + const resource = '/systems/coderdojo/badges'; + const dummyBaseUrl = 'http://localhost:3000'; + const dummyToken = 'dummyToken'; + const dummySecret = 'dummySecret'; + + lab.before((done) => { + testApi = startTestApi(done); + }); + + lab.after((done) => { + testApi.server.close(done); + }); + + lab.beforeEach((done) => { + sandbox = sinon.sandbox.create(); + + jwsSignStub = sandbox.stub(jws, 'sign').returns(dummyToken); + checkRequestStub = sandbox.stub(testApi, 'checkRequest'); + testApiTestResponseStub = sandbox.stub(testApi, 'getTestResponse').returns({ + statusCode: 201, + data: [1, 2, 3], }); - lab.after(function(done) { - testApi.server.close(done); + createdBadge = createBadge({ + apiBaseUrl: dummyBaseUrl, + apiSecret: dummySecret, }); + done(); + }); + + lab.afterEach((done) => { + sandbox.restore(); + done(); + }); + + lab.experiment('request', () => { + lab.beforeEach((done) => { + clock = sinon.useFakeTimers(now); + createdBadge( + { + badgeInfo, + }, + done, + ); + }); - lab.beforeEach(function(done) { - sandbox = sinon.sandbox.create(); - - jwsSignStub = sandbox.stub(jws, 'sign').returns(dummyToken); - checkRequestStub = sandbox.stub(testApi, 'checkRequest'); - testApiTestResponseStub = sandbox.stub(testApi, 'getTestResponse') - .returns({ - statusCode: 201, - data: [1, 2, 3] - }); - - createBadge = require('../lib/create-badge')({ - apiBaseUrl: dummyBaseUrl, - apiSecret: dummySecret - }); - - done(); + lab.afterEach((done) => { + clock.restore(); + done(); }); + lab.test('makes a POST request to /systems/coderdojo/badges', (done) => { + expect(checkRequestStub.args[0][0].method).to.equal('POST'); + expect(checkRequestStub.args[0][0].url).to.equal(resource); + done(); + }); - lab.afterEach(function(done) { - sandbox.restore(); + lab.experiment('request header', () => { + lab.test('sets the Authorization header', (done) => { + expect(checkRequestStub.args[0][0].headers.authorization).to.equal(`JWT token="${dummyToken}"`); + done(); + }); + + lab.test('calls jws sign with claimData', (done) => { + const claimData = { + header: { + typ: 'JWT', + alg: 'HS256', + }, + payload: { + key: 'master', + exp: Date.now() + seconds(60), + method: 'POST', + path: resource, + body: { + alg: 'sha256', + hash: getSha256Hash(JSON.stringify(badgeInfo)), + }, + }, + secret: dummySecret, + }; + + expect(jwsSignStub.args[0][0]).to.deep.equal(claimData); done(); + }); }); - - - lab.experiment('request', function() { - lab.beforeEach(function(done) { - clock = sinon.useFakeTimers(now); - createBadge({ - badgeInfo: badgeInfo - }, done); - }); - - lab.afterEach(function(done) { - clock.restore(); - done(); - }); - - lab.test('makes a POST request to /systems/coderdojo/badges', function(done) { - expect(checkRequestStub.args[0][0].method).to.equal('POST'); - expect(checkRequestStub.args[0][0].url).to.equal(resource); - done(); - }); - - lab.experiment('request header', function() { - lab.test('sets the Authorization header', function(done) { - expect(checkRequestStub.args[0][0].headers.authorization) - .to.equal('JWT token="' + dummyToken + '"'); - done(); - }); - - lab.test('calls jws sign with claimData', function(done) { - var claimData = { - header: { - typ: 'JWT', - alg: 'HS256' - }, - payload: { - key: 'master', - exp: Date.now() + (1000 * 60), - method: 'POST', - path: resource, - body: { - alg: 'sha256', - hash: getSha256Hash(JSON.stringify(badgeInfo)) - } - }, - secret: dummySecret - }; - - expect(jwsSignStub.args[0][0]).to.deep.equal(claimData); - done(); - }); - }); + }); + + lab.experiment('response', () => { + lab.test('passes the error to the callback', (done) => { + testApiTestResponseStub.returns({ + statusCode: 500, + data: {}, + }); + + createdBadge( + { + badgeInfo, + }, + (err) => { + expect(err).to.exist; + done(); + }, + ); }); - - lab.experiment('response', function() { - lab.test('passes the error to the callback', function(done) { - testApiTestResponseStub.returns({ - statusCode: 500, - data: {} - }); - - createBadge({ - badgeInfo: badgeInfo - }, - function(err, res) { - expect(err).to.exist; - done(); - } - ); - }); - - lab.test('passes the data to the callback', function(done) { - createBadge({ - badgeInfo: badgeInfo - }, - function(err, res) { - expect(err).to.not.exist; - expect(res).to.exist; - done(); - } - ); - }); + lab.test('passes the data to the callback', (done) => { + createdBadge( + { + badgeInfo, + }, + (err, res) => { + expect(err).to.not.exist; + expect(res).to.exist; + done(); + }, + ); }); + }); }); diff --git a/test/data/badgeData.json b/test/data/badgeData.json index b757814..be643d0 100644 --- a/test/data/badgeData.json +++ b/test/data/badgeData.json @@ -1,68 +1,68 @@ [ - { - "id": 11, - "slug": "python-level-1a", - "name": "Python Level 1A", - "strapline": "python level 1", - "earnerDescription": "Python level 1 short description", - "consumerDescription": "Python level 1 short description 2", - "issuerUrl": "coderdojo.com", - "rubricUrl": "", - "timeValue": 0, - "timeUnits": "minutes", - "limit": 0, - "unique": 0, - "created": "2015-07-08T13:26:29.000Z", - "imageUrl": "http://52.17.20.218:80/images/badge/10", - "type": "", - "archived": false, - "system": { - "id": 1, - "slug": "coderdojo", - "url": "http://52.17.20.218", - "name": "CoderDojo", - "email": null, - "imageUrl": null, - "issuers": [] - }, - "criteriaUrl": "http://52.17.20.218:80/system/coderdojo/badge/python-level-1a/criteria", - "criteria": [ - { - "id": 8, - "description": "python level 1", - "required": 0, - "note": "" - } - ], - "alignments": [], - "evidenceType": null, - "categories": [], - "tags": [ - { - "id": 9, - "value": "programming" - }, - { - "id": 10, - "value": "python" - } - ], - "milestones": [], - "status": "accepted", - "dateAccepted": "2015-08-24T09:44:52.127Z", - "assertion": { - "uid": "coderdojo-c615cdc2-416b-4a17-b199-6b8273948ffd11", - "recipient": { - "identity": "ninjaover13@gmail.com", - "type": "email", - "hashed": false - }, - "badge": "http://badgekit.coderdojo.com:8080/public/systems/coderdojo/badges/python-level-1a", - "verify": { - "url": "http://localhost:8000/api/1.0/verify_badge/c615cdc2-416b-4a17-b199-6b8273948ffd/11/assertion", - "type": "hosted" - }, - "issuedOn": "2015-08-24T09:44:52.127Z" - } + { + "id": 11, + "slug": "python-level-1a", + "name": "Python Level 1A", + "strapline": "python level 1", + "earnerDescription": "Python level 1 short description", + "consumerDescription": "Python level 1 short description 2", + "issuerUrl": "coderdojo.com", + "rubricUrl": "", + "timeValue": 0, + "timeUnits": "minutes", + "limit": 0, + "unique": 0, + "created": "2015-07-08T13:26:29.000Z", + "imageUrl": "http://52.17.20.218:80/images/badge/10", + "type": "", + "archived": false, + "system": { + "id": 1, + "slug": "coderdojo", + "url": "http://52.17.20.218", + "name": "CoderDojo", + "email": null, + "imageUrl": null, + "issuers": [] + }, + "criteriaUrl": "http://52.17.20.218:80/system/coderdojo/badge/python-level-1a/criteria", + "criteria": [ + { + "id": 8, + "description": "python level 1", + "required": 0, + "note": "" + } + ], + "alignments": [], + "evidenceType": null, + "categories": [], + "tags": [ + { + "id": 9, + "value": "programming" + }, + { + "id": 10, + "value": "python" + } + ], + "milestones": [], + "status": "accepted", + "dateAccepted": "2015-08-24T09:44:52.127Z", + "assertion": { + "uid": "coderdojo-c615cdc2-416b-4a17-b199-6b8273948ffd11", + "recipient": { + "identity": "ninjaover13@gmail.com", + "type": "email", + "hashed": false + }, + "badge": "http://badgekit.coderdojo.com:8080/public/systems/coderdojo/badges/python-level-1a", + "verify": { + "url": "http://localhost:8000/api/1.0/verify_badge/c615cdc2-416b-4a17-b199-6b8273948ffd/11/assertion", + "type": "hosted" + }, + "issuedOn": "2015-08-24T09:44:52.127Z" } -] \ No newline at end of file + } +] diff --git a/test/delete-badge.spec.js b/test/delete-badge.spec.js index 644dc0d..3e557e4 100644 --- a/test/delete-badge.spec.js +++ b/test/delete-badge.spec.js @@ -1,147 +1,149 @@ -'use strict'; - -var expect = require('chai').expect; -var sinon = require('sinon'); -var jws = require('jws'); -var startTestApi = require('./utils/test-server'); -var lab = exports.lab = require('lab').script(); - -var testApi; +exports.lab = require('lab').script(); + +const lab = exports.lab; +const { expect } = require('chai'); +const sinon = require('sinon'); +const jws = require('jws'); +const startTestApi = require('./utils/test-server'); + +const resource = '/systems/coderdojo/badges/'; +const dummyBaseUrl = 'http://localhost:3000'; +const dummyToken = 'dummyToken'; +const dummySecret = 'dummySecret'; + +const deleteBadge = require('../lib/delete-badge')({ + apiBaseUrl: dummyBaseUrl, + apiSecret: dummySecret, +}); -var dummyBadge = { - slug: 'slug' +let testApi; +const seconds = sec => sec * 1000; +const dummyBadge = { + slug: 'slug', }; - -lab.experiment('delete badge', function() { - var sandbox; - var clock; - var now = 0; - var jwsSignStub; - var checkRequestStub; - var deleteBadge; - var resource = '/systems/coderdojo/badges/'; - var dummyBaseUrl = 'http://localhost:3000'; - var dummyToken = 'dummyToken'; - var dummySecret = 'dummySecret'; - - lab.before(function(done) { - testApi = startTestApi(done); +lab.experiment('delete badge', () => { + let sandbox; + let clock; + const now = 0; + let jwsSignStub; + let checkRequestStub; + lab.before((done) => { + testApi = startTestApi(done); + }); + + lab.after((done) => { + testApi.server.close(done); + }); + + lab.beforeEach((done) => { + sandbox = sinon.sandbox.create(); + + jwsSignStub = sandbox.stub(jws, 'sign').returns(dummyToken); + checkRequestStub = sandbox.stub(testApi, 'checkRequest'); + + done(); + }); + + lab.afterEach((done) => { + sandbox.restore(); + done(); + }); + + lab.experiment('request', () => { + lab.beforeEach((done) => { + clock = sinon.useFakeTimers(now); + deleteBadge( + { + slug: dummyBadge.slug, + }, + done, + ); }); - lab.after(function(done) { - testApi.server.close(done); + lab.afterEach((done) => { + clock.restore(); + done(); }); - - lab.beforeEach(function(done) { - sandbox = sinon.sandbox.create(); - - jwsSignStub = sandbox.stub(jws, 'sign').returns(dummyToken); - checkRequestStub = sandbox.stub(testApi, 'checkRequest'); - - deleteBadge = require('../lib/delete-badge')({ - apiBaseUrl: dummyBaseUrl, - apiSecret: dummySecret - }); - done(); + lab.test('makes a DELETE request to /systems/coderdojo/badges/slug', (done) => { + expect(checkRequestStub.args[0][0].method).to.equal('DELETE'); + expect(checkRequestStub.args[0][0].url).to.equal(resource + dummyBadge.slug); + done(); }); - - lab.afterEach(function(done) { - sandbox.restore(); + lab.experiment('request header', () => { + lab.test('sets the Authorization header', (done) => { + expect(checkRequestStub.args[0][0].headers.authorization).to.equal(`JWT token="${dummyToken}"`); done(); + }); + + lab.test('calls jws sign with claimData', (done) => { + const claimData = { + header: { + typ: 'JWT', + alg: 'HS256', + }, + payload: { + key: 'master', + exp: Date.now() + seconds(60), + method: 'DELETE', + path: resource + dummyBadge.slug, + }, + secret: dummySecret, + }; + + expect(jwsSignStub.args[0][0]).to.deep.equal(claimData); + done(); + }); }); + }); + lab.experiment('response', () => { + let testApiTestResponseStub; - lab.experiment('request', function() { - lab.beforeEach(function(done) { - clock = sinon.useFakeTimers(now); - deleteBadge({ - slug: dummyBadge.slug - }, done); - }); - - lab.afterEach(function(done) { - clock.restore(); - done(); - }); - - lab.test('makes a DELETE request to /systems/coderdojo/badges/slug', function(done) { - expect(checkRequestStub.args[0][0].method).to.equal('DELETE'); - expect(checkRequestStub.args[0][0].url).to.equal(resource + dummyBadge.slug); - done(); - }); - - lab.experiment('request header', function() { - lab.test('sets the Authorization header', function(done) { - expect(checkRequestStub.args[0][0].headers.authorization) - .to.equal('JWT token="' + dummyToken + '"'); - done(); - }); - - lab.test('calls jws sign with claimData', function(done) { - var claimData = { - header: { - typ: 'JWT', - alg: 'HS256' - }, - payload: { - key: 'master', - exp: Date.now() + (1000 * 60), - method: 'DELETE', - path: resource + dummyBadge.slug - }, - secret: dummySecret - }; - - expect(jwsSignStub.args[0][0]).to.deep.equal(claimData); - done(); - }); - }); + lab.beforeEach((done) => { + testApiTestResponseStub = sandbox.stub(testApi, 'getTestResponse'); + done(); }); + lab.test('passes the error to the callback', (done) => { + testApiTestResponseStub.returns({ + statusCode: 500, + data: {}, + }); + + deleteBadge( + { + slug: dummyBadge.slug, + }, + (err) => { + expect(err).to.exist; + done(); + }, + ); + }); - lab.experiment('response', function() { - var testApiTestResponseStub; - - lab.beforeEach(function(done) { - testApiTestResponseStub = sandbox.stub(testApi, 'getTestResponse'); - done(); - }); - - lab.test('passes the error to the callback', function(done) { - testApiTestResponseStub.returns({ - statusCode: 500, - data: {} - }); - - deleteBadge({ - slug: dummyBadge.slug - }, function(err, res) { - expect(err).to.exist; - done(); - }); - }); - - lab.test('passes the data to the callback', function(done) { - var error = null; - var data = { - result: [1, 2, 3] - }; - - testApiTestResponseStub.returns({ - statusCode: 200, - data: data - }); - - deleteBadge({ - slug: dummyBadge.slug - }, function(err, res) { - expect(err).to.not.exist; - expect(res).to.exist; - done(); - }); - }); + lab.test('passes the data to the callback', (done) => { + const data = { + result: [1, 2, 3], + }; + + testApiTestResponseStub.returns({ + statusCode: 200, + data, + }); + + deleteBadge( + { + slug: dummyBadge.slug, + }, + (err, res) => { + expect(err).to.not.exist; + expect(res).to.exist; + done(); + }, + ); }); + }); }); diff --git a/test/get-badge.spec.js b/test/get-badge.spec.js index 645406d..bb87f07 100644 --- a/test/get-badge.spec.js +++ b/test/get-badge.spec.js @@ -1,148 +1,148 @@ -'use strict'; - -var expect = require('chai').expect; -var sinon = require('sinon'); -var jws = require('jws'); -var startTestApi = require('./utils/test-server'); -var lab = exports.lab = require('lab').script(); +exports.lab = require('lab').script(); + +const lab = exports.lab; +const { expect } = require('chai'); +const sinon = require('sinon'); +const jws = require('jws'); +const startTestApi = require('./utils/test-server'); + +const resource = '/systems/coderdojo/badges/'; +const dummyBaseUrl = 'http://localhost:3000'; +const dummyToken = 'dummyToken'; +const dummySecret = 'dummySecret'; +const getBadge = require('../lib/get-badge')({ + apiBaseUrl: dummyBaseUrl, + apiSecret: dummySecret, +}); -var testApi; +let testApi; +const seconds = sec => sec * 1000; -var dummyBadge = { - slug: 'slug' +const dummyBadge = { + slug: 'slug', }; - -lab.experiment('get badge', function() { - var sandbox; - var clock; - var now = 0; - var jwsSignStub; - var checkRequestStub; - var getBadge; - var resource = '/systems/coderdojo/badges/'; - var dummyBaseUrl = 'http://localhost:3000'; - var dummyToken = 'dummyToken'; - var dummySecret = 'dummySecret'; - - lab.before(function(done) { - testApi = startTestApi(done); +lab.experiment('get badge', () => { + let sandbox; + let clock; + const now = 0; + let jwsSignStub; + let checkRequestStub; + + lab.before((done) => { + testApi = startTestApi(done); + }); + + lab.after((done) => { + testApi.server.close(done); + }); + + lab.beforeEach((done) => { + sandbox = sinon.sandbox.create(); + jwsSignStub = sandbox.stub(jws, 'sign').returns(dummyToken); + checkRequestStub = sandbox.stub(testApi, 'checkRequest'); + done(); + }); + + lab.afterEach((done) => { + sandbox.restore(); + done(); + }); + + lab.experiment('request', () => { + lab.beforeEach((done) => { + clock = sinon.useFakeTimers(now); + getBadge( + { + slug: dummyBadge.slug, + }, + done, + ); }); - lab.after(function(done) { - testApi.server.close(done); + lab.afterEach((done) => { + clock.restore(); + done(); }); - - lab.beforeEach(function(done) { - sandbox = sinon.sandbox.create(); - - jwsSignStub = sandbox.stub(jws, 'sign').returns(dummyToken); - checkRequestStub = sandbox.stub(testApi, 'checkRequest'); - - getBadge = require('../lib/get-badge')({ - apiBaseUrl: dummyBaseUrl, - apiSecret: dummySecret - }); - - done(); + lab.test('makes a GET request to /systems/coderdojo/badges/slug', (done) => { + expect(checkRequestStub.args[0][0].method).to.equal('GET'); + expect(checkRequestStub.args[0][0].url).to.equal(resource + dummyBadge.slug); + done(); }); - - lab.afterEach(function(done) { - sandbox.restore(); + lab.experiment('request header', () => { + lab.test('sets the Authorization header', (done) => { + expect(checkRequestStub.args[0][0].headers.authorization).to.equal(`JWT token="${dummyToken}"`); done(); + }); + + lab.test('calls jws sign with claimData', (done) => { + const claimData = { + header: { + typ: 'JWT', + alg: 'HS256', + }, + payload: { + key: 'master', + exp: Date.now() + seconds(60), + method: 'GET', + path: resource + dummyBadge.slug, + }, + secret: dummySecret, + }; + + expect(jwsSignStub.args[0][0]).to.deep.equal(claimData); + done(); + }); }); + }); + lab.experiment('response', () => { + let testApiTestResponseStub; - lab.experiment('request', function() { - lab.beforeEach(function(done) { - clock = sinon.useFakeTimers(now); - getBadge({ - slug: dummyBadge.slug - }, done); - }); - - lab.afterEach(function(done) { - clock.restore(); - done(); - }); - - lab.test('makes a GET request to /systems/coderdojo/badges/slug', function(done) { - expect(checkRequestStub.args[0][0].method).to.equal('GET'); - expect(checkRequestStub.args[0][0].url).to.equal(resource + dummyBadge.slug); - done(); - }); - - lab.experiment('request header', function() { - lab.test('sets the Authorization header', function(done) { - expect(checkRequestStub.args[0][0].headers.authorization) - .to.equal('JWT token="' + dummyToken + '"'); - done(); - }); - - lab.test('calls jws sign with claimData', function(done) { - var claimData = { - header: { - typ: 'JWT', - alg: 'HS256' - }, - payload: { - key: 'master', - exp: Date.now() + (1000 * 60), - method: 'GET', - path: resource + dummyBadge.slug - }, - secret: dummySecret - }; - - expect(jwsSignStub.args[0][0]).to.deep.equal(claimData); - done(); - }); - }); + lab.beforeEach((done) => { + testApiTestResponseStub = sandbox.stub(testApi, 'getTestResponse'); + done(); }); + lab.test('passes the error to the callback', (done) => { + testApiTestResponseStub.returns({ + statusCode: 500, + data: {}, + }); + + getBadge( + { + slug: dummyBadge.slug, + }, + (err) => { + expect(err).to.exist; + done(); + }, + ); + }); - lab.experiment('response', function() { - var testApiTestResponseStub; - - lab.beforeEach(function(done) { - testApiTestResponseStub = sandbox.stub(testApi, 'getTestResponse'); - done(); - }); - - lab.test('passes the error to the callback', function(done) { - testApiTestResponseStub.returns({ - statusCode: 500, - data: {} - }); - - getBadge({ - slug: dummyBadge.slug - }, function(err, res) { - expect(err).to.exist; - done(); - }); - }); - - lab.test('passes the data to the callback', function(done) { - var error = null; - var data = { - result: [1, 2, 3] - }; - - testApiTestResponseStub.returns({ - statusCode: 200, - data: data - }); - - getBadge({ - slug: dummyBadge.slug - }, function(err, res) { - expect(err).to.not.exist; - expect(res).to.exist; - done(); - }); - }); + lab.test('passes the data to the callback', (done) => { + const data = { + result: [1, 2, 3], + }; + + testApiTestResponseStub.returns({ + statusCode: 200, + data, + }); + + getBadge( + { + slug: dummyBadge.slug, + }, + (err, res) => { + expect(err).to.not.exist; + expect(res).to.exist; + done(); + }, + ); }); + }); }); diff --git a/test/kpi-number-of-badges-awarded-spec.js b/test/kpi-number-of-badges-awarded-spec.js index 56ce816..ddae0c8 100644 --- a/test/kpi-number-of-badges-awarded-spec.js +++ b/test/kpi-number-of-badges-awarded-spec.js @@ -1,27 +1,30 @@ -'use strict' +exports.lab = require('lab').script(); -var seneca = require('seneca')(); -var _ = require('lodash'); -var expect = require('chai').expect; -var lab = exports.lab = require('lab').script(); -var plugin = 'cd-badges'; +const lab = exports.lab; +const { expect } = require('chai'); +const seneca = require('seneca')(); +const _ = require('lodash'); +const kpiNumberOfBadgesAwarded = require('../lib/kpi-number-of-badges-awarded'); +const loadBadgeCategories = require('../lib/load-badge-categories'); -var kpiNumberOfBadgesAwarded = require('../lib/kpi-number-of-badges-awarded'); -var loadBadgeCategories = require('../lib/load-badge-categories'); +const plugin = 'cd-badges'; seneca.use('./stubs/cd-profiles.js'); -seneca.add({role: plugin, cmd: 'kpiNumberOfBadgesAwarded'}, kpiNumberOfBadgesAwarded.bind(seneca)); -seneca.add({role: plugin, cmd: 'loadBadgeCategories'}, loadBadgeCategories.bind(seneca)); +seneca.add( + { role: plugin, cmd: 'kpiNumberOfBadgesAwarded' }, + kpiNumberOfBadgesAwarded.bind(seneca), +); +seneca.add({ role: plugin, cmd: 'loadBadgeCategories' }, loadBadgeCategories.bind(seneca)); -lab.experiment('KPI', function () { - lab.test('Number of Badges Awarded', function (done) { - seneca.act({role: plugin, cmd: 'kpiNumberOfBadgesAwarded'}, function (err, kpiData) { - if(err) return done(err); +lab.experiment('KPI', () => { + lab.test('Number of Badges Awarded', (done) => { + seneca.act({ role: plugin, cmd: 'kpiNumberOfBadgesAwarded' }, (err, kpiData) => { + if (err) return done(err); expect(kpiData).to.have.property('total').that.is.a('number'); - _.each(Object.keys(kpiData), function (field) { + _.each(Object.keys(kpiData), (field) => { expect(kpiData).to.have.property(field).that.is.a('number'); }); return done(); }); - }); -}); \ No newline at end of file + }); +}); diff --git a/test/list-badges.spec.js b/test/list-badges.spec.js index db3e6e9..f997087 100644 --- a/test/list-badges.spec.js +++ b/test/list-badges.spec.js @@ -1,132 +1,121 @@ -'use strict'; - -var expect = require('chai').expect; -var sinon = require('sinon'); -var jws = require('jws'); -var startTestApi = require('./utils/test-server'); -var lab = exports.lab = require('lab').script(); - -lab.experiment('listBadges', function() { - var sandbox; - var clock; - var jwsSignStub; - var resource = '/systems/coderdojo/badges'; - var dummyBaseUrl = 'http://localhost:3000'; - var dummyToken = 'dummyToken'; - var dummySecret = 'dummySecret'; - var now = 1433288850689; - var testApi; - var listBadges; - var checkRequestStub; - - - lab.before(function(done) { - testApi = startTestApi(done); - }); +exports.lab = require('lab').script(); + +const lab = exports.lab; +const { expect } = require('chai'); +const sinon = require('sinon'); +const jws = require('jws'); +const startTestApi = require('./utils/test-server'); + +const dummyBaseUrl = 'http://localhost:3000'; +const dummyToken = 'dummyToken'; +const dummySecret = 'dummySecret'; +const listBadges = require('../lib/list-badges')({ + apiBaseUrl: dummyBaseUrl, + apiSecret: dummySecret, +}); - lab.after(function(done) { - testApi.server.close(done); +const seconds = sec => sec * 1000; + +lab.experiment('listBadges', () => { + let sandbox; + let clock; + let jwsSignStub; + const resource = '/systems/coderdojo/badges'; + const now = 1433288850689; + let testApi; + let checkRequestStub; + + lab.before((done) => { + testApi = startTestApi(done); + }); + + lab.after((done) => { + testApi.server.close(done); + }); + + lab.beforeEach((done) => { + sandbox = sinon.sandbox.create(); + clock = sinon.useFakeTimers(now); + jwsSignStub = sandbox.stub(jws, 'sign').returns(dummyToken); + checkRequestStub = sandbox.stub(testApi, 'checkRequest'); + done(); + }); + + lab.afterEach((done) => { + clock.restore(); + sandbox.restore(); + done(); + }); + + lab.experiment('request', () => { + lab.beforeEach((done) => { + listBadges({}, done); }); - lab.beforeEach(function(done) { - sandbox = sinon.sandbox.create(); - clock = sinon.useFakeTimers(now); - - jwsSignStub = sandbox.stub(jws, 'sign').returns(dummyToken); - - checkRequestStub = sandbox.stub(testApi, 'checkRequest'); - - listBadges = require('../lib/list-badges')({ - apiBaseUrl: dummyBaseUrl, - apiSecret: dummySecret - }); - - done(); + lab.test('makes a GET request to /systems/coderdojo/badges', (done) => { + expect(checkRequestStub.args[0][0].method).to.equal('GET'); + expect(checkRequestStub.args[0][0].url).to.equal(resource); + done(); }); - - lab.afterEach(function(done) { - clock.restore(); - sandbox.restore(); + lab.experiment('request header', () => { + lab.test('sets the Authorization header', (done) => { + expect(checkRequestStub.args[0][0].headers.authorization).to.equal(`JWT token="${dummyToken}"`); + done(); + }); + + lab.test('calls jws sign with claimData', (done) => { + const claimData = { + header: { + typ: 'JWT', + alg: 'HS256', + }, + payload: { + key: 'master', + exp: Date.now() + seconds(60), + method: 'GET', + path: resource, + }, + secret: dummySecret, + }; + + expect(jwsSignStub.args[0][0]).to.deep.equal(claimData); done(); + }); }); + }); + lab.experiment('response', () => { + let testApiTestResponseStub; - lab.experiment('request', function() { - - lab.beforeEach(function(done) { - listBadges({}, done); - }); - - lab.test('makes a GET request to /systems/coderdojo/badges', function(done) { - expect(checkRequestStub.args[0][0].method).to.equal('GET'); - expect(checkRequestStub.args[0][0].url).to.equal(resource); - done(); - }); - - - lab.experiment('request header', function() { - lab.test('sets the Authorization header', function(done) { - expect(checkRequestStub.args[0][0].headers.authorization) - .to.equal('JWT token="' + dummyToken + '"'); - done(); - }); - - lab.test('calls jws sign with claimData', function(done) { - var claimData = { - header: { - typ: 'JWT', - alg: 'HS256' - }, - payload: { - key: 'master', - exp: Date.now() + (1000 * 60), - method: 'GET', - path: resource - }, - secret: dummySecret - }; - - expect(jwsSignStub.args[0][0]).to.deep.equal(claimData); - done(); - }); - }); + lab.beforeEach((done) => { + testApiTestResponseStub = sandbox.stub(testApi, 'getTestResponse'); + done(); }); + lab.test('passes the error to the callback', (done) => { + testApiTestResponseStub.returns({ + statusCode: 500, + data: {}, + }); - lab.experiment('response', function() { - - var testApiTestResponseStub; - - lab.beforeEach(function(done) { - testApiTestResponseStub = sandbox.stub(testApi, 'getTestResponse'); - done(); - }); - - lab.test('passes the error to the callback', function(done) { - testApiTestResponseStub.returns({ - statusCode: 500, - data: {} - }); - - listBadges({}, function(err, res) { - expect(err).to.exist; - done(); - }); - }); - - lab.test('passes the data to the callback', function(done) { - testApiTestResponseStub.returns({ - statusCode: 200, - data: {} - }); + listBadges({}, (err) => { + expect(err).to.exist; + done(); + }); + }); - listBadges({}, function(err, res) { - expect(err).to.not.exist; - expect(res).to.exist; - done(); - }); - }); + lab.test('passes the data to the callback', (done) => { + testApiTestResponseStub.returns({ + statusCode: 200, + data: {}, + }); + listBadges({}, (err, res) => { + expect(err).to.not.exist; + expect(res).to.exist; + done(); + }); }); + }); }); diff --git a/test/stubs/cd-profiles.js b/test/stubs/cd-profiles.js index 052fbeb..38945e0 100644 --- a/test/stubs/cd-profiles.js +++ b/test/stubs/cd-profiles.js @@ -1,19 +1,18 @@ -'use strict'; +const fs = require('fs'); -var fs = require('fs'); +function cdProfile() { + const seneca = this; + const plugin = 'cd-profiles'; + const badgeData = JSON.parse(fs.readFileSync(`${__dirname}/../data/badgeData.json`, 'utf8')); -module.exports = function(options) { - var seneca = this; - var plugin = 'cd-profiles'; - var badgeData = JSON.parse(fs.readFileSync(__dirname + '/../data/badgeData.json', 'utf8')); + seneca.add({ role: plugin, cmd: 'list' }, cmdList); - seneca.add({role: plugin, cmd: 'list'}, cmd_list); - - function cmd_list(args, done) { - done(null, [{badges: badgeData}]); + function cmdList(args, done) { + done(null, [{ badges: badgeData }]); } return { - name: plugin + name: plugin, }; -}; \ No newline at end of file +} +module.exports = cdProfile; diff --git a/test/update-badge.spec.js b/test/update-badge.spec.js index 83da53c..33cae23 100644 --- a/test/update-badge.spec.js +++ b/test/update-badge.spec.js @@ -1,186 +1,183 @@ -'use strict'; - -var expect = require('chai').expect; -var sinon = require('sinon'); -var jws = require('jws'); -var startTestApi = require('./utils/test-server'); -var getSha256Hash = require('../lib/utils/get-sha256-hash'); -var lab = exports.lab = require('lab').script(); - -var testApi; - -var badgeInfo = { - slug: 'slug', - name: 'name', - imageUrl: 'http://issuersite.com/badge.png', - unique: false, - criteriaUrl: 'http://issuersite.com/criteria', - earnerDescription: 'description for potential earners', - consumerDescription: 'description for consumers', - strapline: 'strapline', - issuerUrl: 'http://issuersite.com', - rubricUrl: 'http://issuersite.com/rubric', - timeValue: 10, - timeUnits: 'minutes', - evidenceType: 'URL', - limit: 5, - archived: false, - criteria: [{ - id: 1, - description: 'criteria description', - required: 1, - note: 'note for assessor' - }], - type: 'badge type', - categories: [], - tags: [], - milestones: [] -}; - - -lab.experiment('update badge', function() { +exports.lab = require('lab').script(); + +const lab = exports.lab; +const { expect } = require('chai'); +const sinon = require('sinon'); +const jws = require('jws'); +const startTestApi = require('./utils/test-server'); +const getSha256Hash = require('../lib/utils/get-sha256-hash'); + +const dummyBaseUrl = 'http://localhost:3000'; +const dummySecret = 'dummySecret'; +const updateBadge = require('../lib/update-badge')({ + apiBaseUrl: dummyBaseUrl, + apiSecret: dummySecret, +}); - var sandbox; - var clock; - var now = 0; - var jwsSignStub; - var checkRequestStub; - var updateBadge; - var resource = '/systems/coderdojo/badges/'; - var dummyBaseUrl = 'http://localhost:3000'; - var dummyToken = 'dummyToken'; - var dummySecret = 'dummySecret'; +let testApi; +const seconds = sec => sec * 1000; + +const badgeInfo = { + slug: 'slug', + name: 'name', + imageUrl: 'http://issuersite.com/badge.png', + unique: false, + criteriaUrl: 'http://issuersite.com/criteria', + earnerDescription: 'description for potential earners', + consumerDescription: 'description for consumers', + strapline: 'strapline', + issuerUrl: 'http://issuersite.com', + rubricUrl: 'http://issuersite.com/rubric', + timeValue: 10, + timeUnits: 'minutes', + evidenceType: 'URL', + limit: 5, + archived: false, + criteria: [ + { + id: 1, + description: 'criteria description', + required: 1, + note: 'note for assessor', + }, + ], + type: 'badge type', + categories: [], + tags: [], + milestones: [], +}; - lab.before(function(done) { - testApi = startTestApi(done); +lab.experiment('update badge', () => { + let sandbox; + let clock; + const now = 0; + let jwsSignStub; + let checkRequestStub; + const resource = '/systems/coderdojo/badges/'; + const dummyToken = 'dummyToken'; + + lab.before((done) => { + testApi = startTestApi(done); + }); + + lab.after((done) => { + testApi.server.close(done); + }); + + lab.beforeEach((done) => { + sandbox = sinon.sandbox.create(); + jwsSignStub = sandbox.stub(jws, 'sign').returns(dummyToken); + checkRequestStub = sandbox.stub(testApi, 'checkRequest'); + done(); + }); + + lab.afterEach((done) => { + sandbox.restore(); + done(); + }); + + lab.experiment('request', () => { + lab.beforeEach((done) => { + clock = sinon.useFakeTimers(now); + updateBadge( + { + slug: 'slug', + badgeInfo, + }, + done, + ); }); - lab.after(function(done) { - testApi.server.close(done); + lab.afterEach((done) => { + clock.restore(); + done(); }); - - lab.beforeEach(function(done) { - sandbox = sinon.sandbox.create(); - - jwsSignStub = sandbox.stub(jws, 'sign').returns(dummyToken); - checkRequestStub = sandbox.stub(testApi, 'checkRequest'); - - updateBadge = require('../lib/update-badge')({ - apiBaseUrl: dummyBaseUrl, - apiSecret: dummySecret - }); - - done(); + lab.test('makes a PUT request to /systems/coderdojo/badges/slug', (done) => { + expect(checkRequestStub.args[0][0].method).to.equal('PUT'); + expect(checkRequestStub.args[0][0].url).to.equal(resource + badgeInfo.slug); + done(); }); + lab.experiment('request header', () => { + lab.test('sets the Authorization header', (done) => { + expect(checkRequestStub.args[0][0].headers.authorization).to.equal(`JWT token="${dummyToken}"`); + done(); + }); + + lab.test('calls jws sign with claimData', (done) => { + const claimData = { + header: { + typ: 'JWT', + alg: 'HS256', + }, + payload: { + key: 'master', + exp: Date.now() + seconds(60), + method: 'PUT', + path: resource + badgeInfo.slug, + body: { + alg: 'sha256', + hash: getSha256Hash(JSON.stringify(badgeInfo)), + }, + }, + secret: dummySecret, + }; + + expect(jwsSignStub.args[0][0]).to.deep.equal(claimData); - lab.afterEach(function(done) { - sandbox.restore(); done(); + }); }); + }); + lab.experiment('response', () => { + let testApiTestResponseStub; - lab.experiment('request', function() { - lab.beforeEach(function(done) { - clock = sinon.useFakeTimers(now); - updateBadge({ - slug: 'slug', - badgeInfo: badgeInfo - }, done); - }); - - lab.afterEach(function(done) { - clock.restore(); - done(); - }); - - lab.test('makes a PUT request to /systems/coderdojo/badges/slug', function(done) { - expect(checkRequestStub.args[0][0].method).to.equal('PUT'); - expect(checkRequestStub.args[0][0].url).to.equal(resource + badgeInfo.slug); - done(); - }); - - lab.experiment('request header', function() { - lab.test('sets the Authorization header', function(done) { - expect(checkRequestStub.args[0][0].headers.authorization) - .to.equal('JWT token="' + dummyToken + '"'); - done(); - }); - - lab.test('calls jws sign with claimData', function(done) { - var claimData = { - header: { - typ: 'JWT', - alg: 'HS256' - }, - payload: { - key: 'master', - exp: Date.now() + (1000 * 60), - method: 'PUT', - path: resource + badgeInfo.slug, - body: { - alg: 'sha256', - hash: getSha256Hash(JSON.stringify(badgeInfo)) - } - }, - secret: dummySecret - }; - - expect(jwsSignStub.args[0][0]).to.deep.equal(claimData); - - done(); - }); - }); + lab.beforeEach((done) => { + testApiTestResponseStub = sandbox.stub(testApi, 'getTestResponse'); + done(); }); + lab.test('passes the error to the callback', (done) => { + testApiTestResponseStub.returns({ + statusCode: 500, + data: {}, + }); + + updateBadge( + { + slug: 'slug', + badge: badgeInfo, + }, + (err) => { + expect(err).to.exist; + done(); + }, + ); + }); - lab.experiment('response', function() { - var testApiTestResponseStub; - - lab.beforeEach(function(done) { - testApiTestResponseStub = sandbox.stub(testApi, 'getTestResponse'); - done(); - }); - - lab.test('passes the error to the callback', function(done) { - testApiTestResponseStub.returns({ - statusCode: 500, - data: {} - }); - - updateBadge({ - slug: 'slug', - badge: badgeInfo - }, - function(err, res) { - expect(err).to.exist; - done(); - } - ); - }); - - lab.test('passes the data to the callback', function(done) { - var error = null; - var data = { - result: [1, 2, 3] - }; - - testApiTestResponseStub.returns({ - statusCode: 200, - data: data - }); - - updateBadge({ - slug: 'slug', - badge: badgeInfo - }, - function(err, res) { - expect(err).to.not.exist; - expect(res).to.exist; - done(); - } - ); - }); + lab.test('passes the data to the callback', (done) => { + const data = { + result: [1, 2, 3], + }; + + testApiTestResponseStub.returns({ + statusCode: 200, + data, + }); + + updateBadge( + { + slug: 'slug', + badge: badgeInfo, + }, + (err, res) => { + expect(err).to.not.exist; + expect(res).to.exist; + done(); + }, + ); }); + }); }); diff --git a/test/utils/test-server.js b/test/utils/test-server.js index 3761f18..d56f739 100644 --- a/test/utils/test-server.js +++ b/test/utils/test-server.js @@ -1,29 +1,28 @@ -'use strict'; - -var http = require('http'); +const http = require('http'); function startTestApi(callback) { + const testApi = { + checkRequest() {}, + getTestResponse() { + return { + statusCode: 200, + data: {}, + }; + }, + }; - var testApi = { - checkRequest: function() {}, - getTestResponse: function() { - return { - statusCode: 200, - data: {} - }; - } - }; - - testApi.server = http.createServer(function(req, res) { - testApi.checkRequest(req); - res.setHeader('Content-Type', 'application/json'); + testApi.server = http + .createServer((req, res) => { + testApi.checkRequest(req); + res.setHeader('Content-Type', 'application/json'); - var testData = testApi.getTestResponse(); - res.writeHead(testData.statusCode); - res.end(JSON.stringify(testData.data)); - }).listen(3000, 'localhost', callback); + const testData = testApi.getTestResponse(); + res.writeHead(testData.statusCode); + res.end(JSON.stringify(testData.data)); + }) + .listen(3000, 'localhost', callback); - return testApi; + return testApi; } module.exports = startTestApi; diff --git a/yarn.lock b/yarn.lock index 319cea8..5b957d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,18 +2,11 @@ # yarn lockfile v1 -CSSselect@0.x: - version "0.7.0" - resolved "https://registry.yarnpkg.com/CSSselect/-/CSSselect-0.7.0.tgz#e4054c67b467465f3c9500c0da0aa7878c4babd2" +"@newrelic/native-metrics@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@newrelic/native-metrics/-/native-metrics-2.1.2.tgz#9a595dc602654b717188a294507087a51e79fba3" dependencies: - CSSwhat "0.4" - boolbase "~1.0.0" - domutils "1.4" - nth-check "~1.0.0" - -CSSwhat@0.4: - version "0.4.7" - resolved "https://registry.yarnpkg.com/CSSwhat/-/CSSwhat-0.4.7.tgz#867da0ff39f778613242c44cfea83f0aa4ebdf9b" + nan "^2.4.0" abbrev@1: version "1.1.1" @@ -25,21 +18,13 @@ acorn-jsx@^3.0.0: dependencies: acorn "^3.0.4" -acorn-to-esprima@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/acorn-to-esprima/-/acorn-to-esprima-2.0.8.tgz#003f0c642eb92132f417d3708f14ada82adf2eb1" - -acorn@^1.0.3: - version "1.2.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-1.2.2.tgz#c8ce27de0acc76d896d2b1fad3df588d9e82f014" - acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" acorn@^5.2.1: - version "5.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822" + version "5.2.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" agent-base@~1.0.1: version "1.0.2" @@ -56,7 +41,7 @@ ajv@^4.9.1: co "^4.6.0" json-stable-stringify "^1.0.1" -ajv@^5.2.0, ajv@^5.2.3: +ajv@^5.1.0, ajv@^5.2.0, ajv@^5.2.3: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" dependencies: @@ -73,17 +58,17 @@ align-text@^0.1.1, align-text@^0.1.3: longest "^1.0.1" repeat-string "^1.5.2" -alter@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/alter/-/alter-0.2.0.tgz#c7588808617572034aae62480af26b1d4d1cb3cd" - dependencies: - stable "~0.1.3" - amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" -ansi-escapes@^1.1.0: +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + dependencies: + string-width "^2.0.0" + +ansi-escapes@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" @@ -99,11 +84,11 @@ ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" -ansi-styles@^2.0.1, ansi-styles@^2.2.1: +ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" -ansi-styles@^3.1.0: +ansi-styles@^3.1.0, ansi-styles@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" dependencies: @@ -116,6 +101,10 @@ anymatch@^1.3.0: micromatch "^2.1.5" normalize-path "^2.0.0" +app-root-path@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46" + aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -131,12 +120,18 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -argparse@^1.0.2, argparse@^1.0.7: +argparse@^1.0.7: version "1.0.9" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" dependencies: sprintf-js "~1.0.2" +aria-query@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.7.0.tgz#4af10a1e61573ddea0cf3b99b51c52c05b424d24" + dependencies: + ast-types-flow "0.0.7" + arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" @@ -147,6 +142,13 @@ arr-flatten@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -165,14 +167,10 @@ arrify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" -asap@^2.0.0: +asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" -asn1@0.1.11: - version "0.1.11" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.1.11.tgz#559be18376d08a4ec4dbe80877d27818639b2df7" - asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" @@ -181,33 +179,17 @@ assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" -assert-plus@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.1.5.tgz#ee74009413002d84cec7219c6ac811812e723160" - assert-plus@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" -assertion-error@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.0.tgz#c7f85438fdd466bc7ca16ab90c81513797a5d23b" - -ast-traverse@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ast-traverse/-/ast-traverse-0.1.1.tgz#69cf2b8386f19dcda1bb1e05d68fe359d8897de6" - -ast-types@0.8.12: - version "0.8.12" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.12.tgz#a0d90e4351bb887716c83fd637ebf818af4adfcc" - -ast-types@0.8.15: - version "0.8.15" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.15.tgz#8eef0827f04dff0ec8857ba925abe3fea6194e52" +assertion-error@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" -ast-types@0.9.6: - version "0.9.6" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" +ast-types-flow@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" async-each@^1.0.0: version "1.0.1" @@ -217,15 +199,11 @@ async@0.9.2: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" -async@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/async/-/async-1.3.0.tgz#a6f1631e8a595a663496d0a5586bd12007d4871d" - -async@^1.4.0: +async@^1.3.0, async@^1.4.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@^2.0.0-rc.5, async@^2.0.1: +async@^2.0.0-rc.5, async@^2.1.4: version "2.6.0" resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" dependencies: @@ -239,19 +217,25 @@ asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" -aws-sign2@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.5.0.tgz#c57103f7a17fc037f02d7c2e64b602ea223f7d63" - aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" -aws4@^1.2.1: +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.2.1, aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: +axobject-query@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-0.1.0.tgz#62f59dbc59c9f9242759ca349960e7a2fe3c36c0" + dependencies: + ast-types-flow "0.0.7" + +babel-code-frame@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: @@ -259,175 +243,29 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^5.8.34: - version "5.8.38" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-5.8.38.tgz#1fcaee79d7e61b750b00b8e54f6dfc9d0af86558" - dependencies: - babel-plugin-constant-folding "^1.0.1" - babel-plugin-dead-code-elimination "^1.0.2" - babel-plugin-eval "^1.0.1" - babel-plugin-inline-environment-variables "^1.0.1" - babel-plugin-jscript "^1.0.4" - babel-plugin-member-expression-literals "^1.0.1" - babel-plugin-property-literals "^1.0.1" - babel-plugin-proto-to-assign "^1.0.3" - babel-plugin-react-constant-elements "^1.0.3" - babel-plugin-react-display-name "^1.0.3" - babel-plugin-remove-console "^1.0.1" - babel-plugin-remove-debugger "^1.0.1" - babel-plugin-runtime "^1.0.7" - babel-plugin-undeclared-variables-check "^1.0.2" - babel-plugin-undefined-to-void "^1.1.6" - babylon "^5.8.38" - bluebird "^2.9.33" - chalk "^1.0.0" - convert-source-map "^1.1.0" - core-js "^1.0.0" - debug "^2.1.1" - detect-indent "^3.0.0" - esutils "^2.0.0" - fs-readdir-recursive "^0.1.0" - globals "^6.4.0" - home-or-tmp "^1.0.0" - is-integer "^1.0.4" - js-tokens "1.0.1" - json5 "^0.4.0" - lodash "^3.10.0" - minimatch "^2.0.3" - output-file-sync "^1.1.0" - path-exists "^1.0.0" - path-is-absolute "^1.0.0" - private "^0.1.6" - regenerator "0.8.40" - regexpu "^1.3.0" - repeating "^1.1.2" - resolve "^1.1.6" - shebang-regex "^1.0.0" - slash "^1.0.0" - source-map "^0.5.0" - source-map-support "^0.2.10" - to-fast-properties "^1.0.0" - trim-right "^1.0.0" - try-resolve "^1.0.0" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-constant-folding@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz#8361d364c98e449c3692bdba51eff0844290aa8e" - -babel-plugin-dead-code-elimination@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz#5f7c451274dcd7cccdbfbb3e0b85dd28121f0f65" - -babel-plugin-eval@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz#a2faed25ce6be69ade4bfec263f70169195950da" - -babel-plugin-inline-environment-variables@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz#1f58ce91207ad6a826a8bf645fafe68ff5fe3ffe" - -babel-plugin-jscript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz#8f342c38276e87a47d5fa0a8bd3d5eb6ccad8fcc" - -babel-plugin-member-expression-literals@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz#cc5edb0faa8dc927170e74d6d1c02440021624d3" - -babel-plugin-property-literals@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz#0252301900192980b1c118efea48ce93aab83336" - -babel-plugin-proto-to-assign@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz#c49e7afd02f577bc4da05ea2df002250cf7cd123" - dependencies: - lodash "^3.9.3" - -babel-plugin-react-constant-elements@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz#946736e8378429cbc349dcff62f51c143b34e35a" - -babel-plugin-react-display-name@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz#754fe38926e8424a4e7b15ab6ea6139dee0514fc" - -babel-plugin-remove-console@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz#d8f24556c3a05005d42aaaafd27787f53ff013a7" - -babel-plugin-remove-debugger@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz#fd2ea3cd61a428ad1f3b9c89882ff4293e8c14c7" - -babel-plugin-runtime@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz#bf7c7d966dd56ecd5c17fa1cb253c9acb7e54aaf" - -babel-plugin-undeclared-variables-check@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz#5cf1aa539d813ff64e99641290af620965f65dee" - dependencies: - leven "^1.0.2" - -babel-plugin-undefined-to-void@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz#7f578ef8b78dfae6003385d8417a61eda06e2f81" - -babel-runtime@5.4.7: - version "5.4.7" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-5.4.7.tgz#75f2335c3cf69917f116aa707d27cd5431da0a09" +babel-runtime@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.6.1.tgz#788b94b6f634e25b91bd6c5df72d467457afb000" dependencies: - core-js "^0.9.0" + core-js "^2.1.0" -babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.6.1: +babel-runtime@^6.6.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-traverse@^6.9.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^5.8.38: - version "5.8.38" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-5.8.38.tgz#ec9b120b11bf6ccd4173a18bf217e60b79859ffd" - -babylon@^6.18.0, babylon@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - backoff@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.3.0.tgz#ee7c7e38093f92e472859db635e7652454fc21ea" +backoff@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" + dependencies: + precond "0.2" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -436,21 +274,14 @@ base64-js@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.2.tgz#024f0f72afa25b75f9c0ee73cd4f55ec1bed9784" -base64url@0.0.6, base64url@~0.0.3, base64url@~0.0.4: +base64url@0.0.6, base64url@~0.0.3: version "0.0.6" resolved "https://registry.yarnpkg.com/base64url/-/base64url-0.0.6.tgz#9597b36b330db1c42477322ea87ea8027499b82b" -base64url@^2.0.0: +base64url@2.0.0, base64url@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/base64url/-/base64url-2.0.0.tgz#eac16e03ea1438eff9423d69baa36262ed1f70bb" -base64url@~1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/base64url/-/base64url-1.0.6.tgz#d64d375d68a7c640d912e2358d170dca5bb54681" - dependencies: - concat-stream "~1.4.7" - meow "~2.0.0" - bcrypt-pbkdf@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" @@ -471,26 +302,12 @@ bitwriter@~0.0.5: dependencies: errs "~0.2.4" -bl@~0.9.0: - version "0.9.5" - resolved "https://registry.yarnpkg.com/bl/-/bl-0.9.5.tgz#c06b797af085ea00bc527afc8efcf11de2232054" - dependencies: - readable-stream "~1.0.26" - block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" dependencies: inherits "~2.0.0" -bluebird@^2.9.30, bluebird@^2.9.33: - version "2.11.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" - -bluebird@^3.0.5: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" - boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -501,6 +318,18 @@ boom@2.x.x: dependencies: hoek "2.x.x" +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + dependencies: + hoek "4.x.x" + bops@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/bops/-/bops-0.0.6.tgz#082d1d55fa01e60dbdc2ebc2dba37f659554cf3a" @@ -515,7 +344,19 @@ bossy@3.x.x: hoek "4.x.x" joi "10.x.x" -brace-expansion@^1.0.0, brace-expansion@^1.1.7: +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +brace-expansion@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" dependencies: @@ -530,15 +371,11 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -breakable@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/breakable/-/breakable-1.0.0.tgz#784a797915a38ead27bad456b5572cb4bbaa78c1" - buffer-crc32@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.1.1.tgz#7e110dc9953908ab7c32acdc70c9f945b1cbc526" -buffer-equal-constant-time@^1.0.1: +buffer-equal-constant-time@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" @@ -550,6 +387,10 @@ buffer-equal@~0.0.0: version "0.0.2" resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.2.tgz#ecbb790f568d40098a6242b54805c75805eb938f" +builtin-modules@^1.0.0, builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + bunyan@1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.1.tgz#68c6a4a502d5620bc9f72d6736810c1b1898097f" @@ -569,20 +410,17 @@ callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" -camelcase-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-1.0.0.tgz#bd1a11bf9b31a1ce493493a930de1a0baf4ad7ec" - dependencies: - camelcase "^1.0.1" - map-obj "^1.0.0" - -camelcase@^1.0.1, camelcase@^1.0.2, camelcase@^1.2.1: +camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" -caseless@~0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.10.0.tgz#ed6b2719adcd1fd18f58dc081c0f1a5b43963909" +camelcase@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +capture-stack-trace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" caseless@~0.12.0: version "0.12.0" @@ -595,14 +433,18 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -chai@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-2.3.0.tgz#8a2f6a34748da801090fd73287b2aa739a4e909a" +chai@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" dependencies: - assertion-error "1.0.0" - deep-eql "0.1.3" + assertion-error "^1.0.1" + check-error "^1.0.1" + deep-eql "^3.0.0" + get-func-name "^2.0.0" + pathval "^1.0.0" + type-detect "^4.0.0" -chalk@^1.0.0, chalk@^1.1.3: +chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -612,7 +454,7 @@ chalk@^1.0.0, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.1.0: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" dependencies: @@ -624,22 +466,32 @@ chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" -cheerio-select@*: - version "0.0.3" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-0.0.3.tgz#3f2420114f3ccb0b1b075c245ccfaae5d617a388" - dependencies: - CSSselect "0.x" - -cheerio@~0.12.3: - version "0.12.4" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.12.4.tgz#c199626e9e1eb0d4233a91a4793e7f8aaa69a18b" - dependencies: - cheerio-select "*" - entities "0.x" - htmlparser2 "3.1.4" - underscore "~1.4" - -chokidar@^1.4.3: +check-error@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + +cheerio@0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash.assignin "^4.0.9" + lodash.bind "^4.1.4" + lodash.defaults "^4.0.1" + lodash.filter "^4.4.0" + lodash.flatten "^4.2.0" + lodash.foreach "^4.3.0" + lodash.map "^4.4.0" + lodash.merge "^4.4.0" + lodash.pick "^4.2.1" + lodash.reduce "^4.4.0" + lodash.reject "^4.4.0" + lodash.some "^4.4.0" + +chokidar@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" dependencies: @@ -654,11 +506,19 @@ chokidar@^1.4.3: optionalDependencies: fsevents "^1.0.0" +ci-info@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.2.tgz#03561259db48d0474c8bdc90f5b47b068b6bbfb4" + circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" -cli-cursor@^1.0.1: +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + +cli-cursor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" dependencies: @@ -670,9 +530,16 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -cli-width@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-1.1.1.tgz#a4d293ef67ebb7b88d4a4d42c0ccf00c4d1e366d" +cli-spinners@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" + +cli-truncate@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + dependencies: + slice-ansi "0.0.4" + string-width "^1.0.1" cli-width@^2.0.0: version "2.2.0" @@ -686,10 +553,6 @@ cliui@^2.1.0: right-align "^0.1.1" wordwrap "0.0.2" -clone@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" - co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -704,12 +567,6 @@ code@4.1.x: dependencies: hoek "4.x.x" -codependency@0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/codependency/-/codependency-0.1.3.tgz#69aed841be6f931829a07273ef8ebbe8407bd1b6" - dependencies: - semver "2.2.1" - codependency@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/codependency/-/codependency-0.1.4.tgz#d1763ab7264bd70c91d9626e98862d3792bf8d4a" @@ -726,7 +583,7 @@ color-name@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" -combined-stream@^1.0.5, combined-stream@~1.0.1, combined-stream@~1.0.5: +combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" dependencies: @@ -738,29 +595,15 @@ combined-stream@~0.0.4: dependencies: delayed-stream "0.0.5" -commander@^2.5.0, commander@^2.8.1, commander@^2.9.0: +commander@^2.11.0, commander@^2.9.0: version "2.12.2" resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" -commoner@~0.10.3: - version "0.10.8" - resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5" - dependencies: - commander "^2.5.0" - detective "^4.3.1" - glob "^5.0.15" - graceful-fs "^4.1.2" - iconv-lite "^0.4.5" - mkdirp "^0.5.0" - private "^0.1.6" - q "^1.1.2" - recast "^0.11.17" - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@^1.4.6, concat-stream@^1.4.7, concat-stream@^1.5.0, concat-stream@^1.6.0: +concat-stream@^1.5.0, concat-stream@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" dependencies: @@ -774,33 +617,16 @@ concat-stream@~1.1.0: dependencies: bops "0.0.6" -concat-stream@~1.4.7: - version "1.4.10" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.4.10.tgz#acc3bbf5602cb8cc980c6ac840fa7d8603e3ef36" - dependencies: - inherits "~2.0.1" - readable-stream "~1.1.9" - typedarray "~0.0.5" - -config-chain@~1.1.5: - version "1.1.11" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2" - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - -configstore@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-1.4.0.tgz#c35781d0501d268c25c54b8b17f6240e8a4fb021" +configstore@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" dependencies: + dot-prop "^4.1.0" graceful-fs "^4.1.2" - mkdirp "^0.5.0" - object-assign "^4.0.1" - os-tmpdir "^1.0.0" - osenv "^0.1.0" - uuid "^2.0.1" - write-file-atomic "^1.1.2" - xdg-basedir "^2.0.0" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" connect-query@0.2.0: version "0.2.0" @@ -830,19 +656,15 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" -convert-source-map@^1.1.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" - -core-js@^0.9.0: - version "0.9.18" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-0.9.18.tgz#13f458e430232b0f4ec1f480da7c2f5288e9d095" +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" -core-js@^2.4.0: +core-js@^2.1.0, core-js@^2.4.0: version "2.5.3" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" @@ -850,17 +672,30 @@ core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" -"cp-logs-lib@git://github.com/CoderDojo/cp-logs-lib#1.1.0": +cosmiconfig@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-1.1.0.tgz#0dea0f9804efdfb929fbb1b188e25553ea053d37" + dependencies: + graceful-fs "^4.1.2" + js-yaml "^3.4.3" + minimist "^1.2.0" + object-assign "^4.0.1" + os-homedir "^1.0.1" + parse-json "^2.2.0" + pinkie-promise "^2.0.0" + require-from-string "^1.1.0" + +cp-logs-lib@CoderDojo/cp-logs-lib#1.1.0: version "1.1.0" - resolved "git://github.com/CoderDojo/cp-logs-lib#5c65480d0605546cf65e6f9b9b3de5ca26b43317" + resolved "https://codeload.github.com/CoderDojo/cp-logs-lib/tar.gz/5c65480d0605546cf65e6f9b9b3de5ca26b43317" dependencies: bunyan "1.8.1" le_node "1.4" lodash "4.13.1" -"cp-permissions-plugin@git://github.com/CoderDojo/cp-permissions-plugin#1.0.2": +cp-permissions-plugin@CoderDojo/cp-permissions-plugin#1.0.2: version "1.0.2" - resolved "git://github.com/CoderDojo/cp-permissions-plugin#95c507a0cd47842755652605b849c2699d28dacf" + resolved "https://codeload.github.com/CoderDojo/cp-permissions-plugin/tar.gz/95c507a0cd47842755652605b849c2699d28dacf" dependencies: async "^2.0.0-rc.5" lodash "^4.13.1" @@ -869,21 +704,13 @@ crc@3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/crc/-/crc-3.2.1.tgz#5d9c8fb77a245cd5eca291e5d2d005334bab0082" -cross-spawn-async@^2.0.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" - dependencies: - lru-cache "^4.0.0" - which "^1.2.8" - -cross-spawn@2.0.x: - version "2.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-2.0.1.tgz#ab6fd893a099759d9b85220e3a64397de946b0f6" +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" dependencies: - cross-spawn-async "^2.0.0" - spawn-sync "1.0.13" + capture-stack-trace "^1.0.0" -cross-spawn@^5.1.0: +cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" dependencies: @@ -897,15 +724,32 @@ cryptiles@2.x.x: dependencies: boom "2.x.x" -ctype@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f" +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" -d@1: +crypto-random-string@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + +css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" dependencies: - es5-ext "^0.10.9" + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-what@2.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" + +damerau-levenshtein@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" dashdash@^1.12.0: version "1.14.1" @@ -913,9 +757,9 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -debug-log@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" +date-fns@^1.27.2: + version "1.29.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" debug@1.0.2: version "1.0.2" @@ -929,16 +773,12 @@ debug@1.0.3: dependencies: ms "0.6.2" -debug@2, debug@^2.1.1, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.6.8: +debug@2, debug@^2.1.2, debug@^2.2.0, debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: ms "2.0.0" -debug@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" - debug@^3.0.1: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -961,11 +801,11 @@ decamelize@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" -deep-eql@0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" +deep-eql@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" dependencies: - type-detect "0.1.1" + type-detect "^4.0.0" deep-extend@~0.4.0: version "0.4.2" @@ -975,42 +815,12 @@ deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" -defaults@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - dependencies: - clone "^1.0.2" - -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - -defs@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/defs/-/defs-1.1.1.tgz#b22609f2c7a11ba7a3db116805c139b1caffa9d2" - dependencies: - alter "~0.2.0" - ast-traverse "~0.1.1" - breakable "~1.0.0" - esprima-fb "~15001.1001.0-dev-harmony-fb" - simple-fmt "~0.1.0" - simple-is "~0.2.0" - stringmap "~0.2.2" - stringset "~0.2.1" - tryor "~0.1.2" - yargs "~3.27.0" - -deglob@^1.0.0: +define-properties@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/deglob/-/deglob-1.1.2.tgz#76d577c25fe3f7329412a2b59eadea57ac500e3f" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" dependencies: - find-root "^1.0.0" - glob "^7.0.5" - ignore "^3.0.9" - pkg-config "^1.1.0" - run-parallel "^1.1.2" - uniq "^1.0.1" - xtend "^4.0.0" + foreach "^2.0.5" + object-keys "^1.0.8" del@^2.0.2: version "2.2.2" @@ -1044,53 +854,24 @@ destroy@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.3.tgz#b433b4724e71fd8551d9885174851c5fc377e2c9" -detect-indent@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" - dependencies: - get-stdin "^4.0.1" - minimist "^1.1.0" - repeating "^1.1.0" - detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" -detective@^4.3.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e" - dependencies: - acorn "^5.2.1" - defined "^1.0.0" - -dezalgo@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" - dependencies: - asap "^2.0.0" - wrappy "1" - diff@3.3.x: version "3.3.1" resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" -diff@^1.3.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" - -disparity@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/disparity/-/disparity-2.0.0.tgz#57ddacb47324ae5f58d2cc0da886db4ce9eeb718" - dependencies: - ansi-styles "^2.0.1" - diff "^1.3.2" +diff@^3.1.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" -doctrine@^0.7.0, doctrine@^0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523" +doctrine@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" dependencies: - esutils "^1.1.6" - isarray "0.0.1" + esutils "^2.0.2" + isarray "^1.0.0" doctrine@^2.0.0: version "2.0.2" @@ -1098,83 +879,95 @@ doctrine@^2.0.0: dependencies: esutils "^2.0.2" -domelementtype@1: +dom-serializer@0, dom-serializer@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + +domelementtype@1, domelementtype@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" -domhandler@2.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.0.3.tgz#889f8df626403af0788e29d66d5d5c6f7ebf0fd6" +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + +domhandler@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259" dependencies: domelementtype "1" -domutils@1.1: - version "1.1.6" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485" +domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" dependencies: + dom-serializer "0" domelementtype "1" -domutils@1.4: - version "1.4.3" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.4.3.tgz#0865513796c6b306031850e175516baf80b72a6f" +domutils@^1.5.1: + version "1.6.2" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.6.2.tgz#1958cc0b4c9426e9ed367fb1c8e854891b0fa3ff" dependencies: + dom-serializer "0" domelementtype "1" +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + dependencies: + is-obj "^1.0.0" + dtrace-provider@~0.6: version "0.6.0" resolved "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.6.0.tgz#0b078d5517937d873101452d9146737557b75e51" dependencies: nan "^2.0.8" +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + duplexer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" -duplexify@^3.2.0: - version "3.5.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.1.tgz#4e1516be68838bc90a49994f0b39a6e5960befcd" - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" dependencies: jsbn "~0.1.0" -ecdsa-sig-formatter@^1.0.0: +ecdsa-sig-formatter@1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz#4bc926274ec3b5abb5016e7e1d60921ac262b2a1" dependencies: base64url "^2.0.0" safe-buffer "^5.0.1" -editorconfig@^0.13.2: - version "0.13.3" - resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.13.3.tgz#e5219e587951d60958fd94ea9a9a008cdeff1b34" - dependencies: - bluebird "^3.0.5" - commander "^2.9.0" - lru-cache "^3.2.0" - semver "^5.1.0" - sigmund "^1.0.1" - ee-first@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.0.tgz#6a0d7c6221e490feefd92ec3f441c9ce8cd097f4" -end-of-stream@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + +emoji-regex@^6.1.0: + version "6.5.1" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2" + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" dependencies: - once "^1.4.0" + iconv-lite "~0.4.13" -entities@0.x: - version "0.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-0.5.0.tgz#f611cb5ae221050e0012c66979503fd7ae19cc49" +entities@^1.1.1, entities@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" eraro@0.4.1, eraro@~0.4.1: version "0.4.1" @@ -1182,65 +975,33 @@ eraro@0.4.1, eraro@~0.4.1: dependencies: lodash "~2.4.1" +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + errs@~0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/errs/-/errs-0.2.4.tgz#48ccefec94fd3e613d6469840dd1c038937983f6" -es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.37" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.37.tgz#0ee741d148b80069ba27d020393756af257defc3" - dependencies: - es6-iterator "~2.0.1" - es6-symbol "~3.1.1" - -es6-iterator@^2.0.1, es6-iterator@~2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-map@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - -es6-promise@^3.0.2: - version "3.3.1" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" - -es6-set@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" - -es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" +es-abstract@^1.7.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" dependencies: - d "1" - es5-ext "~0.10.14" + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" -es6-weak-map@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" dependencies: - d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" escape-html@1.0.1: version "1.0.1" @@ -1250,111 +1011,45 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" -escope@^3.2.0, escope@^3.3.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" +eslint-config-airbnb-base@^11.3.0: + version "11.3.2" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-11.3.2.tgz#8703b11abe3c88ac7ec2b745b7fdf52e00ae680a" dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" + eslint-restricted-globals "^0.1.1" -esformatter-eol-last@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esformatter-eol-last/-/esformatter-eol-last-1.0.0.tgz#45a78ff4622b1d49e44f56b49905766a63290c07" - dependencies: - string.prototype.endswith "^0.2.0" - -esformatter-ignore@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/esformatter-ignore/-/esformatter-ignore-0.1.3.tgz#04d3b875bfa49dde004cc58df6f6bbc3c0567f1e" - -esformatter-jsx@^2.0.11: - version "2.3.11" - resolved "https://registry.yarnpkg.com/esformatter-jsx/-/esformatter-jsx-2.3.11.tgz#411c44ed324754af95aae5ded856d5a7eefcb5df" +eslint-config-airbnb@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-15.1.0.tgz#fd432965a906e30139001ba830f58f73aeddae8e" dependencies: - babel-core "^5.8.34" - esformatter-ignore "^0.1.3" - extend "^2.0.1" - fresh-falafel "^1.2.0" - js-beautify "^1.5.10" + eslint-config-airbnb-base "^11.3.0" -esformatter-literal-notation@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esformatter-literal-notation/-/esformatter-literal-notation-1.0.1.tgz#710e7b420175fe3f7e5afad5bbad329103842e2f" - dependencies: - rocambole "^0.3.6" - rocambole-token "^1.2.1" - -esformatter-parser@^1.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esformatter-parser/-/esformatter-parser-1.0.0.tgz#0854072d0487539ed39cae38d8a5432c17ec11d3" - dependencies: - acorn-to-esprima "^2.0.8" - babel-traverse "^6.9.0" - babylon "^6.8.0" - rocambole "^0.7.0" - -esformatter-quotes@^1.0.0: +eslint-config-coderdojo@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/esformatter-quotes/-/esformatter-quotes-1.1.0.tgz#e22c6c445c7f306041d81c9b9e51fca6cbfaca82" - -esformatter-semicolon-first@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/esformatter-semicolon-first/-/esformatter-semicolon-first-1.2.0.tgz#e3b512d1d4e07310eabcabf57277ea7c8a56e242" + resolved "https://registry.yarnpkg.com/eslint-config-coderdojo/-/eslint-config-coderdojo-1.1.0.tgz#6125c829e31bcd960ee46e133c2b6fbf057e74ff" dependencies: - esformatter-parser "^1.0" - rocambole ">=0.6.0 <2.0" - rocambole-linebreak "^1.0.2" - rocambole-token "^1.2.1" - -esformatter-semicolons@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/esformatter-semicolons/-/esformatter-semicolons-1.1.2.tgz#234190d222865a6dc5c5c5e8a02d8ac8472d8aee" - -esformatter-spaced-lined-comment@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/esformatter-spaced-lined-comment/-/esformatter-spaced-lined-comment-2.0.1.tgz#dc5f3407f93c295e1e56446bd344560da5e6dcac" - -esformatter@^0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/esformatter/-/esformatter-0.7.3.tgz#a74373b472ede8f355920b23dfdd6f9d5ee0e8aa" - dependencies: - debug "^0.7.4" - disparity "^2.0.0" - espree "^1.12.3" - glob "^5.0.3" - minimist "^1.1.1" - mout ">=0.9 <2.0" - npm-run "^1.1.1" - resolve "^1.1.5" - rocambole ">=0.6 <2.0" - rocambole-indent "^2.0.4" - rocambole-linebreak "^1.0.0" - rocambole-node "~1.0" - rocambole-token "^1.1.2" - rocambole-whitespace "^1.0.0" - semver "~2.2.1" - stdin "*" - strip-json-comments "~0.1.1" - supports-color "^1.3.1" - user-home "^2.0.0" + eslint-config-airbnb "^15.1.0" eslint-config-hapi@10.x.x: version "10.1.0" resolved "https://registry.yarnpkg.com/eslint-config-hapi/-/eslint-config-hapi-10.1.0.tgz#e65720917575da292c4ffe8d59ad9aa4e5b0a2ac" -eslint-config-semistandard@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/eslint-config-semistandard/-/eslint-config-semistandard-5.0.1.tgz#42043cdde5353fdd0511202146f769b0fbd0e712" +eslint-import-resolver-node@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz#4422574cde66a9a7b099938ee4d508a199e0e3cc" + dependencies: + debug "^2.6.8" + resolve "^1.2.0" -eslint-config-standard-react@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-standard-react/-/eslint-config-standard-react-1.2.1.tgz#ed045fdb22b3a0fe0bb0bd449cf3bfbeaedeb5b3" +eslint-module-utils@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz#abaec824177613b8a95b299639e1b6facf473449" + dependencies: + debug "^2.6.8" + pkg-dir "^1.0.0" -eslint-config-standard@^4.0.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-4.4.0.tgz#c129749e1999e0cf861077b275d9c51dcd97cd75" +eslint-plugin-chai-friendly@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.4.0.tgz#aad72b4f0ea3cd2655dd92528f66bc7da7a8c9fe" eslint-plugin-hapi@4.x.x: version "4.1.0" @@ -1366,13 +1061,45 @@ eslint-plugin-hapi@4.x.x: hapi-scope-start "2.x.x" no-arrowception "1.x.x" -eslint-plugin-react@^3.9.0: - version "3.16.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-3.16.1.tgz#262d96b77d7c4a42af809a73c0e527a58612293c" +eslint-plugin-import@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.7.0.tgz#21de33380b9efb55f5ef6d2e210ec0e07e7fa69f" + dependencies: + builtin-modules "^1.1.1" + contains-path "^0.1.0" + debug "^2.6.8" + doctrine "1.5.0" + eslint-import-resolver-node "^0.3.1" + eslint-module-utils "^2.1.1" + has "^1.0.1" + lodash.cond "^4.3.0" + minimatch "^3.0.3" + read-pkg-up "^2.0.0" + +eslint-plugin-jsx-a11y@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.1.1.tgz#5c96bb5186ca14e94db1095ff59b3e2bd94069b1" + dependencies: + aria-query "^0.7.0" + array-includes "^3.0.3" + ast-types-flow "0.0.7" + axobject-query "^0.1.0" + damerau-levenshtein "^1.0.0" + emoji-regex "^6.1.0" + jsx-ast-utils "^1.4.0" + +eslint-plugin-react@7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.3.0.tgz#ca9368da36f733fbdc05718ae4e91f778f38e344" + dependencies: + doctrine "^2.0.0" + has "^1.0.1" + jsx-ast-utils "^2.0.0" + prop-types "^15.5.10" -eslint-plugin-standard@^1.1.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-1.3.3.tgz#a3085451523431e76f409c70cb8f94e32bf0ec7f" +eslint-restricted-globals@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7" eslint-scope@^3.7.1: version "3.7.1" @@ -1381,45 +1108,47 @@ eslint-scope@^3.7.1: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint@1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-1.9.0.tgz#a75aaf07e28650772ed0e70daa2ce083079b6514" +eslint@4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.6.0.tgz#98ced4a706a87abbe63207895d0023a38e250bbe" dependencies: - chalk "^1.0.0" - concat-stream "^1.4.6" - debug "^2.1.1" - doctrine "^0.7.0" - escape-string-regexp "^1.0.2" - escope "^3.2.0" - espree "^2.2.4" - estraverse "^4.1.1" - estraverse-fb "^1.3.1" + ajv "^5.2.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^2.6.8" + doctrine "^2.0.0" + eslint-scope "^3.7.1" + espree "^3.5.0" + esquery "^1.0.0" + estraverse "^4.2.0" esutils "^2.0.2" - file-entry-cache "^1.1.1" - glob "^5.0.14" - globals "^8.11.0" - handlebars "^4.0.0" - inquirer "^0.11.0" - is-my-json-valid "^2.10.0" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^9.17.0" + ignore "^3.3.3" + imurmurhash "^0.1.4" + inquirer "^3.0.6" is-resolvable "^1.0.0" - js-yaml "^3.2.5" - json-stable-stringify "^1.0.0" - lodash.clonedeep "^3.0.1" - lodash.merge "^3.3.2" - lodash.omit "^3.1.0" - minimatch "^3.0.0" - mkdirp "^0.5.0" - object-assign "^4.0.1" - optionator "^0.6.0" - path-is-absolute "^1.0.0" - path-is-inside "^1.0.1" - shelljs "^0.5.3" - strip-json-comments "~1.0.1" + js-yaml "^3.9.1" + json-stable-stringify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^4.0.0" + progress "^2.0.0" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "^4.0.1" text-table "~0.2.0" - to-double-quotes "^2.0.0" - to-single-quotes "^2.0.0" - user-home "^2.0.0" - xml-escape "~1.0.0" eslint@4.7.x: version "4.7.2" @@ -1463,79 +1192,17 @@ eslint@4.7.x: table "^4.0.1" text-table "~0.2.0" -eslint@^1.0.0: - version "1.10.3" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-1.10.3.tgz#fb19a91b13c158082bbca294b17d979bc8353a0a" - dependencies: - chalk "^1.0.0" - concat-stream "^1.4.6" - debug "^2.1.1" - doctrine "^0.7.1" - escape-string-regexp "^1.0.2" - escope "^3.3.0" - espree "^2.2.4" - estraverse "^4.1.1" - estraverse-fb "^1.3.1" - esutils "^2.0.2" - file-entry-cache "^1.1.1" - glob "^5.0.14" - globals "^8.11.0" - handlebars "^4.0.0" - inquirer "^0.11.0" - is-my-json-valid "^2.10.0" - is-resolvable "^1.0.0" - js-yaml "3.4.5" - json-stable-stringify "^1.0.0" - lodash.clonedeep "^3.0.1" - lodash.merge "^3.3.2" - lodash.omit "^3.1.0" - minimatch "^3.0.0" - mkdirp "^0.5.0" - object-assign "^4.0.1" - optionator "^0.6.0" - path-is-absolute "^1.0.0" - path-is-inside "^1.0.1" - shelljs "^0.5.3" - strip-json-comments "~1.0.1" - text-table "~0.2.0" - user-home "^2.0.0" - xml-escape "~1.0.0" - -espree@3.5.x, espree@^3.5.1: +espree@3.5.x, espree@^3.5.0, espree@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.2.tgz#756ada8b979e9dcfcdb30aad8d1a9304a905e1ca" dependencies: acorn "^5.2.1" acorn-jsx "^3.0.0" -espree@^1.12.3: - version "1.12.3" - resolved "https://registry.yarnpkg.com/espree/-/espree-1.12.3.tgz#04ceeada91bda077a38c040c125ba186b13bb3cc" - -espree@^2.2.4: - version "2.2.5" - resolved "https://registry.yarnpkg.com/espree/-/espree-2.2.5.tgz#df691b9310889402aeb29cc066708c56690b854b" - -esprima-fb@~15001.1001.0-dev-harmony-fb: - version "15001.1001.0-dev-harmony-fb" - resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz#43beb57ec26e8cf237d3dd8b33e42533577f2659" - -esprima@^2.1, esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" -esprima@~1.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" - -esprima@~3.1.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - esquery@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" @@ -1549,19 +1216,11 @@ esrecurse@^4.1.0: estraverse "^4.1.0" object-assign "^4.0.1" -estraverse-fb@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/estraverse-fb/-/estraverse-fb-1.3.2.tgz#d323a4cb5e5ac331cea033413a9253e1643e07c4" - estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" -esutils@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375" - -esutils@^2.0.0, esutils@^2.0.2: +esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -1571,13 +1230,6 @@ etag@~1.6.0: dependencies: crc "3.2.1" -event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - dependencies: - d "1" - es5-ext "~0.10.14" - event-stream@~3.3.0: version "3.3.4" resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" @@ -1590,6 +1242,30 @@ event-stream@~3.3.0: stream-combiner "~0.0.4" through "~2.3.1" +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" @@ -1606,14 +1282,10 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -extend@3, extend@~3.0.0: +extend@3, extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" -extend@^2.0.1, extend@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-2.0.1.tgz#1ee8010689e7395ff9448241c98652bc759a8260" - external-editor@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" @@ -1644,15 +1316,23 @@ fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" -fast-levenshtein@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-1.0.7.tgz#0178dcdee023b92905193af0959e8a7639cfdcb9" - fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" -figures@^1.3.5: +fbjs@^0.8.16: + version "0.8.16" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.9" + +figures@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" dependencies: @@ -1665,13 +1345,6 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -file-entry-cache@^1.1.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-1.3.1.tgz#44c61ea607ae4be9c1402f41f44270cbfe334ff8" - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - file-entry-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" @@ -1704,13 +1377,18 @@ find-rc@3.0.x: version "3.0.1" resolved "https://registry.yarnpkg.com/find-rc/-/find-rc-3.0.1.tgz#54a4178370f10bc9371fa8d1b2c2809a2afa0cce" -find-root@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-0.1.2.tgz#98d2267cff1916ccaf2743b3a0eea81d79d7dcd1" +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" -find-root@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" flat-cache@^1.2.1: version "1.3.0" @@ -1735,7 +1413,7 @@ foreach@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" -forever-agent@~0.6.0, forever-agent@~0.6.1: +forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -1747,14 +1425,6 @@ form-data@~0.0.3: combined-stream "~0.0.4" mime "~1.2.2" -form-data@~1.0.0-rc1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.1.tgz#ae315db9a4907fa065502304a66d7733475ee37c" - dependencies: - async "^2.0.1" - combined-stream "^1.0.5" - mime-types "^2.1.11" - form-data@~2.1.1: version "2.1.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" @@ -1763,20 +1433,19 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" -formatio@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" +form-data@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" dependencies: - samsam "~1.1" + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" -fresh-falafel@^1.2.0: +formatio@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/fresh-falafel/-/fresh-falafel-1.2.0.tgz#5966dee95fb35d2a29b12d2f25168b17225e4b6c" + resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb" dependencies: - acorn "^1.0.3" - foreach "^2.0.5" - isarray "0.0.1" - object-keys "^1.0.6" + samsam "1.x" fresh@0.2.4: version "0.2.4" @@ -1786,10 +1455,6 @@ from@~0: version "0.1.7" resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" -fs-readdir-recursive@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz#315b4fb8c1ca5b8c47defef319d073dad3568059" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1818,6 +1483,10 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: mkdirp ">=0.5 0" rimraf "2" +function-bind@^1.0.2, function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" @@ -1843,19 +1512,17 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -generate-function@^2.0.0: +get-func-name@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - dependencies: - is-property "^1.0.0" +get-own-enumerable-property-symbols@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz#5c4ad87f2834c4b9b4e84549dc1e0650fb38c24b" -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" getpass@^0.1.1: version "0.1.7" @@ -1888,16 +1555,6 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@^5.0.14, glob@^5.0.15, glob@^5.0.3: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - glob@^6.0.1: version "6.0.4" resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" @@ -1919,15 +1576,13 @@ glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^6.4.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/globals/-/globals-6.4.1.tgz#8498032b3b6d1cc81eebc5f79690d8fe29fabf4f" - -globals@^8.11.0: - version "8.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-8.18.0.tgz#93d4a62bdcac38cfafafc47d6b034768cb0ffcb4" +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + dependencies: + ini "^1.3.4" -globals@^9.17.0, globals@^9.18.0: +globals@^9.17.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -1942,26 +1597,27 @@ globby@^5.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -got@^3.2.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/got/-/got-3.3.1.tgz#e5d0ed4af55fc3eef4d56007769d98192bcb2eca" +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" dependencies: - duplexify "^3.2.0" - infinity-agent "^2.0.0" + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" is-stream "^1.0.0" lowercase-keys "^1.0.0" - nested-error-stacks "^1.0.0" - object-assign "^3.0.0" - prepend-http "^1.0.0" - read-all-stream "^3.0.0" - timed-out "^2.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4: +graceful-fs@^4.1.11, graceful-fs@^4.1.2: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" -handlebars@4.x.x, handlebars@^4.0.0: +handlebars@4.x.x: version "4.0.11" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" dependencies: @@ -1991,14 +1647,9 @@ har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" -har-validator@^1.6.1: - version "1.8.0" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-1.8.0.tgz#d83842b0eb4c435960aeb108a067a3aa94c0eeb2" - dependencies: - bluebird "^2.9.30" - chalk "^1.0.0" - commander "^2.8.1" - is-my-json-valid "^2.12.0" +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" har-validator@~4.2.1: version "4.2.1" @@ -2007,6 +1658,13 @@ har-validator@~4.2.1: ajv "^4.9.1" har-schema "^1.0.5" +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -2021,6 +1679,12 @@ has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" +has@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + hawk@3.1.3, hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" @@ -2030,14 +1694,14 @@ hawk@3.1.3, hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" -hawk@~2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-2.3.1.tgz#1e731ce39447fa1d0f6d707f7bceebec0fd1ec1f" +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" hoek@2.x.x: version "2.16.3" @@ -2047,21 +1711,20 @@ hoek@4.x.x: version "4.2.0" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" -home-or-tmp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-1.0.0.tgz#4b9f1e40800c3e50c6c27f781676afcce71f3985" - dependencies: - os-tmpdir "^1.0.1" - user-home "^1.1.1" +hosted-git-info@^2.1.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" -htmlparser2@3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.1.4.tgz#72cbe7d5d56c01acf61fcf7b933331f4e45b36f0" +htmlparser2@^3.9.1: + version "3.9.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" dependencies: - domelementtype "1" - domhandler "2.0" - domutils "1.1" - readable-stream "1.0" + domelementtype "^1.3.0" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^2.0.2" http-errors@~1.2.8: version "1.2.8" @@ -2070,14 +1733,6 @@ http-errors@~1.2.8: inherits "~2.0.1" statuses "1" -http-signature@~0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-0.11.0.tgz#1796cf67a001ad5cd6849dca0991485f09089fe6" - dependencies: - asn1 "0.1.11" - assert-plus "^0.1.5" - ctype "0.5.3" - http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" @@ -2086,6 +1741,14 @@ http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + https-proxy-agent@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-0.3.6.tgz#713fa38e5d353f50eb14a342febe29033ed1619b" @@ -2094,33 +1757,43 @@ https-proxy-agent@^0.3.5: debug "2" extend "3" -iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@^0.4.5: +husky@^0.14.2: + version "0.14.3" + resolved "https://registry.yarnpkg.com/husky/-/husky-0.14.3.tgz#c69ed74e2d2779769a17ba8399b54ce0b63c12c3" + dependencies: + is-ci "^1.0.10" + normalize-path "^1.0.0" + strip-indent "^2.0.0" + +iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" -ignore-by-default@^1.0.0: +ignore-by-default@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" -ignore@^3.0.9, ignore@^3.3.3: +ignore@^3.3.3: version "3.3.7" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" -indent-string@^1.1.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-1.2.2.tgz#db99bcc583eb6abbb1e48dcbb1999a986041cb6b" +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" dependencies: - get-stdin "^4.0.1" - minimist "^1.1.0" - repeating "^1.1.0" + repeating "^2.0.0" -infinity-agent@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/infinity-agent/-/infinity-agent-2.0.3.tgz#45e0e2ff7a9eb030b27d62b74b3744b7a7ac4216" +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" inflight@^1.0.4: version "1.0.6" @@ -2133,32 +1806,10 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" -inquirer@^0.11.0: - version "0.11.4" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.11.4.tgz#81e3374e8361beaff2d97016206d359d0b32fa4d" - dependencies: - ansi-escapes "^1.1.0" - ansi-regex "^2.0.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" - cli-width "^1.0.1" - figures "^1.3.5" - lodash "^3.3.1" - readline2 "^1.0.1" - run-async "^0.1.0" - rx-lite "^3.1.2" - string-width "^1.0.1" - strip-ansi "^3.0.0" - through "^2.3.6" - inquirer@^3.0.6: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" @@ -2178,21 +1829,9 @@ inquirer@^3.0.6: strip-ansi "^4.0.0" through "^2.3.6" -invariant@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - -is-absolute@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.1.7.tgz#847491119fccb5fb436217cc737f7faad50f603f" - dependencies: - is-relative "^0.1.0" +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" is-binary-path@^1.0.0: version "1.0.1" @@ -2204,6 +1843,26 @@ is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + +is-ci@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" + dependencies: + ci-info "^1.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" @@ -2222,6 +1881,10 @@ is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" @@ -2244,20 +1907,18 @@ is-glob@^2.0.0, is-glob@^2.0.1: dependencies: is-extglob "^1.0.0" -is-integer@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-integer/-/is-integer-1.0.7.tgz#6bde81aacddf78b659b6629d629cadc51a886d5c" +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" dependencies: - is-finite "^1.0.0" + is-extglob "^2.1.1" -is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.0: - version "2.17.1" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz#3da98914a70a22f0a8563ef1511a246c6fc55471" +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" + global-dirs "^0.1.0" + is-path-inside "^1.0.0" is-npm@^1.0.0: version "1.0.0" @@ -2275,6 +1936,10 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-obj@^1.0.0, is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" @@ -2303,26 +1968,36 @@ is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" -is-property@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" -is-relative@^0.1.0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.1.3.tgz#905fee8ae86f45b3ec614bc3c15c869df0876e82" +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" is-resolvable@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.1.tgz#acca1cd36dbe44b974b924321555a70ba03b1cf4" -is-stream@^1.0.0: +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + +is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -2331,7 +2006,7 @@ isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" -isarray@1.0.0, isarray@~1.0.0: +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -2349,7 +2024,14 @@ isobject@^2.0.0: dependencies: isarray "1.0.0" -isstream@~0.1.1, isstream@~0.1.2: +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -2357,6 +2039,19 @@ items@2.x.x: version "2.1.1" resolved "https://registry.yarnpkg.com/items/-/items-2.1.1.tgz#8bd16d9c83b19529de5aea321acaada78364a198" +jest-get-type@^21.2.0: + version "21.2.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-21.2.0.tgz#f6376ab9db4b60d81e39f30749c6c466f40d4a23" + +jest-validate@^21.1.0: + version "21.2.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-21.2.1.tgz#cc0cbca653cd54937ba4f2a111796774530dd3c7" + dependencies: + chalk "^2.0.1" + jest-get-type "^21.2.0" + leven "^2.1.0" + pretty-format "^21.2.1" + joi@10.x.x: version "10.6.0" resolved "https://registry.yarnpkg.com/joi/-/joi-10.6.0.tgz#52587f02d52b8b75cdb0c74f0b164a191a0e1fc2" @@ -2366,31 +2061,11 @@ joi@10.x.x: items "2.x.x" topo "2.x.x" -js-beautify@^1.5.10: - version "1.7.5" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.7.5.tgz#69d9651ef60dbb649f65527b53674950138a7919" - dependencies: - config-chain "~1.1.5" - editorconfig "^0.13.2" - mkdirp "~0.5.0" - nopt "~3.0.1" - -js-tokens@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.1.tgz#cc435a5c8b94ad15acb7983140fc80182c89aeae" - js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" -js-yaml@3.4.5: - version "3.4.5" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.4.5.tgz#c3403797df12b91866574f2de23646fe8cafb44d" - dependencies: - argparse "^1.0.2" - esprima "^2.6.0" - -js-yaml@^3.2.5, js-yaml@^3.9.1: +js-yaml@^3.4.3, js-yaml@^3.9.1: version "3.10.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" dependencies: @@ -2401,10 +2076,6 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" @@ -2413,20 +2084,16 @@ json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" -json-stable-stringify@1.x.x, json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: +json-stable-stringify@1.x.x, json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" dependencies: jsonify "~0.0.0" -json-stringify-safe@5.0.1, json-stringify-safe@5.x.x, json-stringify-safe@^5.0.0, json-stringify-safe@~5.0.0, json-stringify-safe@~5.0.1: +json-stringify-safe@5.0.1, json-stringify-safe@5.x.x, json-stringify-safe@^5.0.0, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" -json5@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" - jsonic@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/jsonic/-/jsonic-0.2.0.tgz#7e3a539642ddf2c4b80d3fa9115c0bfa9377c5bd" @@ -2439,10 +2106,6 @@ jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" -jsonpointer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" - jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -2452,26 +2115,38 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +jsx-ast-utils@^1.4.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" + +jsx-ast-utils@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" + dependencies: + array-includes "^3.0.3" + jwa@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/jwa/-/jwa-0.0.1.tgz#2d05f54d68f170648c30fe45944731a388cd07cc" dependencies: base64url "~0.0.3" -jwa@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.0.2.tgz#fd79609f1e772e299dce8ddb76d00659dd83511f" +jwa@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.5.tgz#a0552ce0220742cd52e153774a32905c30e756e5" dependencies: - base64url "~0.0.4" - buffer-equal-constant-time "^1.0.1" - ecdsa-sig-formatter "^1.0.0" + base64url "2.0.0" + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.9" + safe-buffer "^5.0.1" -jws@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.0.0.tgz#da5f267897dd4e9cf8137979db33fc54a3c05418" +jws@^3.0.0: + version "3.1.4" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.4.tgz#f9e8b9338e8a847277d6444b1464f61880e050a2" dependencies: - base64url "~1.0.4" - jwa "~1.0.0" + base64url "^2.0.0" + jwa "^1.1.4" + safe-buffer "^5.0.1" jws@~0.2.2: version "0.2.6" @@ -2492,7 +2167,7 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" -lab@14.x: +lab@^14.1.0: version "14.3.2" resolved "https://registry.yarnpkg.com/lab/-/lab-14.3.2.tgz#77dc567043bebffaaa2e20630a1bc45bcaf95eec" dependencies: @@ -2515,31 +2190,16 @@ lab@14.x: source-map-support "0.4.x" supports-color "4.4.x" -latest-version@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-1.0.1.tgz#72cfc46e3e8d1be651e1ebb54ea9f6ea96f374bb" +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" dependencies: - package-json "^1.0.0" + package-json "^4.0.0" lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - dependencies: - invert-kv "^1.0.0" - -le_node@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/le_node/-/le_node-1.1.0.tgz#bb5d09715335f623ced24c3e7e744a161fa42a86" - dependencies: - babel-runtime "5.4.7" - codependency "0.1.3" - json-stringify-safe "5.0.1" - lodash "3.9.3" - le_node@1.4: version "1.4.0" resolved "https://registry.yarnpkg.com/le_node/-/le_node-1.4.0.tgz#eb2c8025082224ed9e6f0195fa30b40bef560fce" @@ -2550,9 +2210,20 @@ le_node@1.4: lodash "3.9.3" semver "^5.1.0" -leven@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/leven/-/leven-1.0.2.tgz#9144b6eebca5f1d0680169f1a6770dcea60b75c3" +le_node@^1.1.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/le_node/-/le_node-1.7.1.tgz#8316409dada82b9f29657ca4060663f8f11551d1" + dependencies: + babel-runtime "6.6.1" + codependency "0.1.4" + json-stringify-safe "5.0.1" + lodash "3.9.3" + reconnect-core "1.3.0" + semver "5.1.0" + +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" levn@^0.3.0, levn@~0.3.0: version "0.3.0" @@ -2561,207 +2232,140 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -levn@~0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.2.5.tgz#ba8d339d0ca4a610e3a3f145b9caf48807155054" +lint-staged@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-4.3.0.tgz#ed0779ad9a42c0dc62bb3244e522870b41125879" dependencies: - prelude-ls "~1.1.0" - type-check "~0.3.1" - -lodash._arraycopy@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" - -lodash._arrayeach@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz#bab156b2a90d3f1bbd5c653403349e5e5933ef9e" + app-root-path "^2.0.0" + chalk "^2.1.0" + commander "^2.11.0" + cosmiconfig "^1.1.0" + execa "^0.8.0" + is-glob "^4.0.0" + jest-validate "^21.1.0" + listr "^0.12.0" + lodash "^4.17.4" + log-symbols "^2.0.0" + minimatch "^3.0.0" + npm-which "^3.0.1" + p-map "^1.1.1" + staged-git-files "0.0.4" + stringify-object "^3.2.0" -lodash._arraymap@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._arraymap/-/lodash._arraymap-3.0.0.tgz#1a8fd0f4c0df4b61dea076d717cdc97f0a3c3e66" +listr-silent-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" -lodash._baseassign@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" +listr-update-renderer@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz#ca80e1779b4e70266807e8eed1ad6abe398550f9" dependencies: - lodash._basecopy "^3.0.0" - lodash.keys "^3.0.0" + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^1.0.2" + strip-ansi "^3.0.1" -lodash._baseclone@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz#303519bf6393fe7e42f34d8b630ef7794e3542b7" +listr-verbose-renderer@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35" dependencies: - lodash._arraycopy "^3.0.0" - lodash._arrayeach "^3.0.0" - lodash._baseassign "^3.0.0" - lodash._basefor "^3.0.0" - lodash.isarray "^3.0.0" - lodash.keys "^3.0.0" - -lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + chalk "^1.1.3" + cli-cursor "^1.0.2" + date-fns "^1.27.2" + figures "^1.7.0" -lodash._basedifference@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash._basedifference/-/lodash._basedifference-3.0.3.tgz#f2c204296c2a78e02b389081b6edcac933cf629c" +listr@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.12.0.tgz#6bce2c0f5603fa49580ea17cd6a00cc0e5fa451a" dependencies: - lodash._baseindexof "^3.0.0" - lodash._cacheindexof "^3.0.0" - lodash._createcache "^3.0.0" + chalk "^1.1.3" + cli-truncate "^0.2.1" + figures "^1.7.0" + indent-string "^2.1.0" + is-promise "^2.1.0" + is-stream "^1.1.0" + listr-silent-renderer "^1.1.1" + listr-update-renderer "^0.2.0" + listr-verbose-renderer "^0.4.0" + log-symbols "^1.0.2" + log-update "^1.0.2" + ora "^0.2.3" + p-map "^1.1.1" + rxjs "^5.0.0-beta.11" + stream-to-observable "^0.1.0" + strip-ansi "^3.0.1" -lodash._baseflatten@^3.0.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/lodash._baseflatten/-/lodash._baseflatten-3.1.4.tgz#0770ff80131af6e34f3b511796a7ba5214e65ff7" +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" dependencies: - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - -lodash._basefor@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash._basefor/-/lodash._basefor-3.0.3.tgz#7550b4e9218ef09fad24343b612021c79b4c20c2" - -lodash._baseindexof@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" - -lodash._bindcallback@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - -lodash._cacheindexof@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" -lodash._createassigner@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" dependencies: - lodash._bindcallback "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash.restparam "^3.0.0" + p-locate "^2.0.0" + path-exists "^3.0.0" -lodash._createcache@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" - dependencies: - lodash._getnative "^3.0.0" +lodash.assignin@^4.0.9: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" +lodash.bind@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" -lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" +lodash.cond@^4.3.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" -lodash._pickbyarray@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash._pickbyarray/-/lodash._pickbyarray-3.0.2.tgz#1f898d9607eb560b0e167384b77c7c6d108aa4c5" +lodash.defaults@^4.0.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" -lodash._pickbycallback@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._pickbycallback/-/lodash._pickbycallback-3.0.0.tgz#ff61b9a017a7b3af7d30e6c53de28afa19b8750a" - dependencies: - lodash._basefor "^3.0.0" - lodash.keysin "^3.0.0" +lodash.filter@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" -lodash.assign@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" - dependencies: - lodash._baseassign "^3.0.0" - lodash._createassigner "^3.0.0" - lodash.keys "^3.0.0" +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" -lodash.clonedeep@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz#a0a1e40d82a5ea89ff5b147b8444ed63d92827db" - dependencies: - lodash._baseclone "^3.0.0" - lodash._bindcallback "^3.0.0" +lodash.foreach@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" -lodash.defaults@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz#c7308b18dbf8bc9372d701a73493c61192bd2e2c" - dependencies: - lodash.assign "^3.0.0" - lodash.restparam "^3.0.0" +lodash.map@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" +lodash.merge@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5" -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" -lodash.isplainobject@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-3.2.0.tgz#9a8238ae16b200432960cd7346512d0123fbf4c5" - dependencies: - lodash._basefor "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.keysin "^3.0.0" +lodash.reduce@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" -lodash.istypedarray@^3.0.0: - version "3.0.6" - resolved "https://registry.yarnpkg.com/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz#c9a477498607501d8e8494d283b87c39281cef62" +lodash.reject@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" -lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - -lodash.keysin@^3.0.0: - version "3.0.8" - resolved "https://registry.yarnpkg.com/lodash.keysin/-/lodash.keysin-3.0.8.tgz#22c4493ebbedb1427962a54b445b2c8a767fb47f" - dependencies: - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - -lodash.merge@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-3.3.2.tgz#0d90d93ed637b1878437bb3e21601260d7afe994" - dependencies: - lodash._arraycopy "^3.0.0" - lodash._arrayeach "^3.0.0" - lodash._createassigner "^3.0.0" - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - lodash.isplainobject "^3.0.0" - lodash.istypedarray "^3.0.0" - lodash.keys "^3.0.0" - lodash.keysin "^3.0.0" - lodash.toplainobject "^3.0.0" - -lodash.omit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-3.1.0.tgz#897fe382e6413d9ac97c61f78ed1e057a00af9f3" - dependencies: - lodash._arraymap "^3.0.0" - lodash._basedifference "^3.0.0" - lodash._baseflatten "^3.0.0" - lodash._bindcallback "^3.0.0" - lodash._pickbyarray "^3.0.0" - lodash._pickbycallback "^3.0.0" - lodash.keysin "^3.0.0" - lodash.restparam "^3.0.0" - -lodash.restparam@^3.0.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - -lodash.toplainobject@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash.toplainobject/-/lodash.toplainobject-3.0.0.tgz#28790ad942d293d78aa663a07ecf7f52ca04198d" - dependencies: - lodash._basecopy "^3.0.0" - lodash.keysin "^3.0.0" +lodash.some@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" lodash@2.4.2, lodash@~2.4.1: version "2.4.2" @@ -2771,10 +2375,6 @@ lodash@3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.0.tgz#93d51c672828a4416a12af57220ba8a8737e2fbb" -lodash@3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.7.0.tgz#3678bd8ab995057c07ade836ed2ef087da811d45" - lodash@3.9.3: version "3.9.3" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.9.3.tgz#0159e86832feffc6d61d852b12a953b99496bd32" @@ -2783,7 +2383,7 @@ lodash@4.13.1: version "4.13.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.13.1.tgz#83e4b10913f48496d4d16fec4a560af2ee744b68" -lodash@^3.10.0, lodash@^3.3.1, lodash@^3.9.3: +lodash@^3.7.0: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" @@ -2791,15 +2391,34 @@ lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.3.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" -lolex@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.1.0.tgz#5dbbbc850395e7523c74b3586f7fbd2626d25b1b" +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + dependencies: + chalk "^1.0.0" + +log-symbols@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.1.0.tgz#f35fa60e278832b538dc4dddcbb478a45d3e3be6" + dependencies: + chalk "^2.0.1" + +log-update@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" + dependencies: + ansi-escapes "^1.0.0" + cli-cursor "^1.0.2" + +lolex@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6" longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" -loose-envify@^1.0.0: +loose-envify@^1.0.0, loose-envify@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" dependencies: @@ -2813,36 +2432,23 @@ lru-cache@2.6.4: version "2.6.4" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.6.4.tgz#2675190ccd1b0701ec2f652a4d0d3d400d76c0dd" -lru-cache@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee" - dependencies: - pseudomap "^1.0.1" - -lru-cache@^4.0.0, lru-cache@^4.0.1: +lru-cache@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" dependencies: pseudomap "^1.0.2" yallist "^2.1.2" -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" +make-dir@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" + dependencies: + pify "^3.0.0" map-stream@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" -meow@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-2.0.0.tgz#8f530a8ecf5d40d3f4b4df93c3472900fba2a8f1" - dependencies: - camelcase-keys "^1.0.0" - indent-string "^1.1.0" - minimist "^1.1.0" - object-assign "^1.0.0" - micromatch@^2.1.5: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" @@ -2861,26 +2467,16 @@ micromatch@^2.1.5: parse-glob "^3.0.4" regex-cache "^0.4.2" -mime-db@~1.12.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.12.0.tgz#3d0c63180f458eb10d325aaa37d7c58ae312e9d7" - mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" -mime-types@^2.1.11, mime-types@^2.1.12, mime-types@~2.1.7: +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.7: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" dependencies: mime-db "~1.30.0" -mime-types@~2.0.1: - version "2.0.14" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.0.14.tgz#310e159db23e077f8bb22b748dabfa4957140aa6" - dependencies: - mime-db "~1.12.0" - mime@1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" @@ -2893,18 +2489,12 @@ mimic-fn@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: brace-expansion "^1.1.7" -minimatch@^2.0.3: - version "2.0.10" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" - dependencies: - brace-expansion "^1.0.0" - minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -2913,7 +2503,7 @@ minimist@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.1.tgz#1bc2bc71658cdca5712475684363615b0b4f695b" -minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0: +minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -2921,28 +2511,16 @@ minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" -mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" -moment@2.10.3: - version "2.10.3" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.10.3.tgz#0abb99f307f65218308c6935efe29c57b1a0a27f" - -moment@^2.10.6: +moment@^2.10.3, moment@^2.10.6: version "2.20.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.20.1.tgz#d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd" -"mout@>=0.9 <2.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/mout/-/mout-1.1.0.tgz#0b29d41e6a80fa9e2d4a5be9d602e1d9d02177f6" - -mout@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/mout/-/mout-0.11.1.tgz#ba3611df5f0e5b1ffbfd01166b8f02d1f5fa2b99" - ms@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/ms/-/ms-0.6.2.tgz#d89c2124c6fdc1353d65a8b77bf1aac4b193708c" @@ -2963,16 +2541,6 @@ mstring@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/mstring/-/mstring-0.1.2.tgz#8a268b1b2deade1e58e4d1eba5484a9fefafaf02" -multiline@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/multiline/-/multiline-1.0.2.tgz#69b1f25ff074d2828904f244ddd06b7d96ef6c93" - dependencies: - strip-indent "^1.0.0" - -mute-stream@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" - mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -2985,10 +2553,14 @@ mv@~2: ncp "~2.0.0" rimraf "~2.4.0" -nan@^2.0.8, nan@^2.3.0: +nan@^2.0.8, nan@^2.3.0, nan@^2.4.0: version "2.8.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" +native-promise-only@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11" + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -3004,22 +2576,18 @@ needle@0.9.2: debug "^2.1.2" iconv-lite "^0.4.4" -nested-error-stacks@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz#19f619591519f096769a5ba9a86e6eeec823c3cf" - dependencies: - inherits "~2.0.1" - -newrelic@1.21.1: - version "1.21.1" - resolved "https://registry.yarnpkg.com/newrelic/-/newrelic-1.21.1.tgz#cbf5c02031bd01c89bb38213a7b0ce30d6123dbd" +newrelic@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/newrelic/-/newrelic-2.4.2.tgz#ce63238b989f8fa27dae60ea24fe3c2fad969e5c" dependencies: + async "^2.1.4" concat-stream "^1.5.0" https-proxy-agent "^0.3.5" json-stringify-safe "^5.0.0" - readable-stream "^1.1.13" - semver "^4.2.0" - yakaa "^1.0.1" + readable-stream "^2.1.4" + semver "^5.3.0" + optionalDependencies: + "@newrelic/native-metrics" "^2.1.0" nid@0.3.2, nid@~0.3.2: version "0.3.2" @@ -3029,6 +2597,13 @@ no-arrowception@1.x.x: version "1.0.0" resolved "https://registry.yarnpkg.com/no-arrowception/-/no-arrowception-1.0.0.tgz#5bf3e95eb9c41b57384a805333daa3b734ee327a" +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-pre-gyp@^0.6.39: version "0.6.39" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" @@ -3045,24 +2620,18 @@ node-pre-gyp@^0.6.39: tar "^2.2.1" tar-pack "^3.4.0" -node-uuid@~1.4.0: - version "1.4.8" - resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" - -nodemon@1.11.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.11.0.tgz#226c562bd2a7b13d3d7518b49ad4828a3623d06c" +nodemon@^1.11.0: + version "1.14.3" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.14.3.tgz#f08d66726fb9876d76956b57cc91624793de4dbb" dependencies: - chokidar "^1.4.3" - debug "^2.2.0" - es6-promise "^3.0.2" - ignore-by-default "^1.0.0" - lodash.defaults "^3.1.2" - minimatch "^3.0.0" - ps-tree "^1.0.1" - touch "1.0.0" + chokidar "^1.7.0" + debug "^2.6.8" + ignore-by-default "^1.0.1" + minimatch "^3.0.4" + pstree.remy "^1.1.0" + touch "^3.1.0" undefsafe "0.0.3" - update-notifier "0.5.0" + update-notifier "^2.3.0" nopt@^4.0.1: version "4.0.1" @@ -3077,12 +2646,6 @@ nopt@~1.0.10: dependencies: abbrev "1" -nopt@~3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - dependencies: - abbrev "1" - norma@0.3.0, norma@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/norma/-/norma-0.3.0.tgz#27265c3411018c32c93ee719f692cf90dec5ab64" @@ -3090,26 +2653,44 @@ norma@0.3.0, norma@~0.3.0: eraro "~0.4.1" lodash "~2.4.1" +normalize-package-data@^2.3.2: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" + normalize-path@^2.0.0, normalize-path@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" dependencies: remove-trailing-separator "^1.0.1" -npm-path@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-1.1.0.tgz#0474ae00419c327d54701b7cf2cd05dc88be1140" +npm-path@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.3.tgz#15cff4e1c89a38da77f56f6055b24f975dfb2bbe" dependencies: - which "^1.2.4" + which "^1.2.10" -npm-run@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/npm-run/-/npm-run-1.1.1.tgz#c4312451f382b7aee7a4858e60283abf3dbac8ec" +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" dependencies: - minimist "^1.1.0" - npm-path "^1.0.1" - serializerr "^1.0.1" - sync-exec "^0.5.0" + path-key "^2.0.0" + +npm-which@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa" + dependencies: + commander "^2.9.0" + npm-path "^2.0.2" + which "^1.2.10" npmlog@^4.0.2: version "4.1.2" @@ -3120,7 +2701,7 @@ npmlog@^4.0.2: gauge "~2.7.3" set-blocking "~2.0.0" -nth-check@~1.0.0: +nth-check@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" dependencies: @@ -3130,23 +2711,15 @@ 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" -oauth-sign@~0.8.0, oauth-sign@~0.8.1: +oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" -object-assign@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-1.0.0.tgz#e65dc8766d3b47b4b8307465c8311da030b070a6" - -object-assign@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" - -object-assign@^4.0.1, object-assign@^4.1.0: +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" -object-keys@^1.0.6: +object-keys@^1.0.8: version "1.0.11" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" @@ -3167,7 +2740,7 @@ on-headers@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" -once@^1.3.0, once@^1.3.3, once@^1.4.0: +once@^1.3.0, once@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -3183,12 +2756,12 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -openbadges-bakery@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/openbadges-bakery/-/openbadges-bakery-1.0.4.tgz#d2dc61a74426d4ced84920384b27b3782276a4f6" +openbadges-bakery@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/openbadges-bakery/-/openbadges-bakery-1.0.5.tgz#c1709fa8d130433949b3413f5cb818df933f982d" dependencies: buffer-equal "0.0.0" - cheerio "~0.12.3" + cheerio "0.22.0" concat-stream "~1.1.0" jws "~0.2.2" optimist "~0.3.5" @@ -3209,17 +2782,6 @@ optimist@~0.3.5: dependencies: wordwrap "~0.0.2" -optionator@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.6.0.tgz#b63ecbbf0e315fad4bc9827b45dc7ba45284fcb6" - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~1.0.6" - levn "~0.2.5" - prelude-ls "~1.1.1" - type-check "~0.3.1" - wordwrap "~0.0.2" - optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" @@ -3231,45 +2793,56 @@ optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" +ora@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" dependencies: - lcid "^1.0.0" + chalk "^1.1.1" + cli-cursor "^1.0.2" + cli-spinners "^0.1.2" + object-assign "^4.0.1" -os-shim@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" +os-homedir@^1.0.0, os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" -osenv@^0.1.0, osenv@^0.1.4: +osenv@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -output-file-sync@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" dependencies: - graceful-fs "^4.1.4" - mkdirp "^0.5.1" - object-assign "^4.1.0" + p-limit "^1.1.0" -package-json@^1.0.0: +p-map@^1.1.1: version "1.2.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-1.2.0.tgz#c8ecac094227cdf76a316874ed05e27cc939a0e0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" dependencies: - got "^3.2.0" - registry-url "^3.0.0" + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" parambulator@1.5.1: version "1.5.1" @@ -3288,6 +2861,12 @@ parse-glob@^3.0.4: is-extglob "^1.0.0" is-glob "^2.0.0" +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + parseurl@~1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.1.3.tgz#1f005738ac71b417bc2d0845cbdfa2a8b63ea639" @@ -3296,9 +2875,15 @@ parseurl@~1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" -path-exists@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" path-is-absolute@^1.0.0: version "1.0.1" @@ -3308,10 +2893,30 @@ path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" +path-to-regexp@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + dependencies: + isarray "0.0.1" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + +pathval@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + patrun@0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/patrun/-/patrun-0.4.3.tgz#9cd4c4952691423bb753659d2df9c2714aef8892" @@ -3336,10 +2941,18 @@ performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -3350,30 +2963,29 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" -pkg-config@^1.0.1, pkg-config@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pkg-config/-/pkg-config-1.1.1.tgz#557ef22d73da3c8837107766c52eadabde298fe4" +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" dependencies: - debug-log "^1.0.0" - find-root "^1.0.0" - xtend "^4.0.1" + find-up "^1.0.0" + +pluralize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-4.0.0.tgz#59b708c1c0190a2f692f1c7618c446b052fd1762" pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" -pre-commit@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/pre-commit/-/pre-commit-1.1.2.tgz#6cc01c9cfa01ccbdeb06810d842bb200c4547926" - dependencies: - cross-spawn "2.0.x" - which "1.1.x" +precond@0.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" -prelude-ls@~1.1.0, prelude-ls@~1.1.1, prelude-ls@~1.1.2: +prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" -prepend-http@^1.0.0: +prepend-http@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" @@ -3381,9 +2993,12 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -private@^0.1.6, private@~0.1.5: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" +pretty-format@^21.2.1: + version "21.2.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-21.2.1.tgz#ae5407f3cf21066cd011aa1ba5fce7b6a2eddb36" + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" process-nextick-args@~1.0.6: version "1.0.7" @@ -3393,44 +3008,52 @@ progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" -protochain@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/protochain/-/protochain-1.0.5.tgz#991c407e99de264aadf8f81504b5e7faf7bfa260" +prop-types@^15.5.10: + version "15.6.0" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.3.1" + object-assign "^4.1.1" -ps-tree@^1.0.1: +ps-tree@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" dependencies: event-stream "~3.3.0" -pseudomap@^1.0.1, pseudomap@^1.0.2: +pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" +pstree.remy@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.0.tgz#f2af27265bd3e5b32bbfcc10e80bac55ba78688b" + dependencies: + ps-tree "^1.1.0" + punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - qs@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/qs/-/qs-1.1.0.tgz#2845cd9df462b2db28a90370e142d492c5a45dde" -qs@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-3.1.0.tgz#d0e9ae745233a12dc43fb4f3055bba446261153c" - qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" +qs@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + randomatic@^1.1.3: version "1.1.7" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" @@ -3442,7 +3065,7 @@ range-parser@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.0.3.tgz#6872823535c692e2c2a0103826afd82c2e0ff175" -rc@^1.0.1, rc@^1.1.7: +rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: version "1.2.2" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077" dependencies: @@ -3451,32 +3074,22 @@ rc@^1.0.1, rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -read-all-stream@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" - dependencies: - pinkie-promise "^2.0.0" - readable-stream "^2.0.0" - -readable-stream@1.0, readable-stream@~1.0.26: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" + find-up "^2.0.0" + read-pkg "^2.0.0" -readable-stream@^1.1.13, readable-stream@~1.1.9: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" -readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: +readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -3497,40 +3110,11 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" -readline2@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - mute-stream "0.0.5" - -recast@0.10.33: - version "0.10.33" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.33.tgz#942808f7aa016f1fa7142c461d7e5704aaa8d697" - dependencies: - ast-types "0.8.12" - esprima-fb "~15001.1001.0-dev-harmony-fb" - private "~0.1.5" - source-map "~0.5.0" - -recast@^0.10.10: - version "0.10.43" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.43.tgz#b95d50f6d60761a5f6252e15d80678168491ce7f" - dependencies: - ast-types "0.8.15" - esprima-fb "~15001.1001.0-dev-harmony-fb" - private "~0.1.5" - source-map "~0.5.0" - -recast@^0.11.17: - version "0.11.23" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" +reconnect-core@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/reconnect-core/-/reconnect-core-1.3.0.tgz#fbae52919a7877d844e3246d01a2f26701c833c8" dependencies: - ast-types "0.9.6" - esprima "~3.1.0" - private "~0.1.5" - source-map "~0.5.0" + backoff "~2.5.0" reconnect-core@~0.0.0: version "0.0.1" @@ -3544,57 +3128,29 @@ reconnect-net@0.0.0: dependencies: reconnect-core "~0.0.0" -regenerate@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" - regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" -regenerator@0.8.40: - version "0.8.40" - resolved "https://registry.yarnpkg.com/regenerator/-/regenerator-0.8.40.tgz#a0e457c58ebdbae575c9f8cd75127e93756435d8" - dependencies: - commoner "~0.10.3" - defs "~1.1.0" - esprima-fb "~15001.1001.0-dev-harmony-fb" - private "~0.1.5" - recast "0.10.33" - through "~2.3.8" - regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" dependencies: is-equal-shallow "^0.1.3" -regexpu@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexpu/-/regexpu-1.3.0.tgz#e534dc991a9e5846050c98de6d7dd4a55c9ea16d" +registry-auth-token@^3.0.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" dependencies: - esprima "^2.6.0" - recast "^0.10.10" - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" + rc "^1.1.6" + safe-buffer "^5.0.1" -registry-url@^3.0.0: +registry-url@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" dependencies: rc "^1.0.1" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - dependencies: - jsesc "~0.5.0" - remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -3603,40 +3159,16 @@ repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" -repeat-string@^1.5.0, repeat-string@^1.5.2: +repeat-string@^1.5.2: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" -repeating@^1.1.0, repeating@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" dependencies: is-finite "^1.0.0" -request@2.58.0: - version "2.58.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.58.0.tgz#b5f49c0b94aab7fad388612a1fb6ad03b6cc1580" - dependencies: - aws-sign2 "~0.5.0" - bl "~0.9.0" - caseless "~0.10.0" - combined-stream "~1.0.1" - extend "~2.0.1" - forever-agent "~0.6.0" - form-data "~1.0.0-rc1" - har-validator "^1.6.1" - hawk "~2.3.0" - http-signature "~0.11.0" - isstream "~0.1.1" - json-stringify-safe "~5.0.0" - mime-types "~2.0.1" - node-uuid "~1.4.0" - oauth-sign "~0.8.0" - qs "~3.1.0" - stringstream "~0.0.4" - tough-cookie ">=0.12.0" - tunnel-agent "~0.4.0" - request@2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" @@ -3664,6 +3196,33 @@ request@2.81.0: tunnel-agent "^0.6.0" uuid "^3.0.0" +request@^2.58.0: + version "2.83.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + request@~2.11.4: version "2.11.4" resolved "https://registry.yarnpkg.com/request/-/request-2.11.4.tgz#6347d7d44e52dc588108cc1ce5cee975fc8926de" @@ -3671,6 +3230,10 @@ request@~2.11.4: form-data "~0.0.3" mime "~1.2.7" +require-from-string@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" + require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" @@ -3682,7 +3245,7 @@ resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" -resolve@^1.1.5, resolve@^1.1.6: +resolve@^1.2.0: version "1.5.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" dependencies: @@ -3720,70 +3283,16 @@ rimraf@~2.4.0: dependencies: glob "^6.0.1" -rocambole-indent@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/rocambole-indent/-/rocambole-indent-2.0.4.tgz#a18a24977ca0400b861daa4631e861dcb52d085c" - dependencies: - debug "^2.1.3" - mout "^0.11.0" - rocambole-token "^1.2.1" - -rocambole-linebreak@^1.0.0, rocambole-linebreak@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/rocambole-linebreak/-/rocambole-linebreak-1.0.2.tgz#03621515b43b4721c97e5a1c1bca5a0366368f2f" - dependencies: - debug "^2.1.3" - rocambole-token "^1.2.1" - semver "^4.3.1" - -rocambole-node@~1.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rocambole-node/-/rocambole-node-1.0.0.tgz#db5b49de7407b0080dd514872f28e393d0f7ff3f" - -rocambole-token@^1.1.2, rocambole-token@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/rocambole-token/-/rocambole-token-1.2.1.tgz#c785df7428dc3cb27ad7897047bd5238cc070d35" - -rocambole-whitespace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rocambole-whitespace/-/rocambole-whitespace-1.0.0.tgz#63330949256b29941f59b190459f999c6b1d3bf9" - dependencies: - debug "^2.1.3" - repeat-string "^1.5.0" - rocambole-token "^1.2.1" - -"rocambole@>=0.6 <2.0", "rocambole@>=0.6.0 <2.0", rocambole@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/rocambole/-/rocambole-0.7.0.tgz#f6c79505517dc42b6fb840842b8b953b0f968585" - dependencies: - esprima "^2.1" - -rocambole@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/rocambole/-/rocambole-0.3.6.tgz#4debbf5943144bc7b6006d95be8facc0b74352a7" - dependencies: - esprima "~1.0" - rolling-stats@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/rolling-stats/-/rolling-stats-0.1.1.tgz#cd5af774a8893b30a674832fa2f4abaa478cfc80" -run-async@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" - dependencies: - once "^1.3.0" - run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" dependencies: is-promise "^2.1.0" -run-parallel@^1.1.2: - version "1.1.6" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.6.tgz#29003c9a2163e01e2d2dfc90575f2c6c1d61a039" - rx-lite-aggregates@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" @@ -3794,11 +3303,13 @@ rx-lite@*, rx-lite@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" -rx-lite@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" +rxjs@^5.0.0-beta.11: + version "5.5.6" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.6.tgz#e31fb96d6fd2ff1fd84bcea8ae9c02d007179c02" + dependencies: + symbol-observable "1.0.1" -safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -3806,67 +3317,31 @@ safe-json-stringify@~1: version "1.0.4" resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.0.4.tgz#81a098f447e4bbc3ff3312a243521bc060ef5911" -samsam@~1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.3.tgz#9f5087419b4d091f232571e7fa52e90b0f552621" +samsam@1.x, samsam@^1.1.3: + version "1.3.0" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" seedrandom@2.4.x: version "2.4.3" resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.3.tgz#2438504dad33917314bff18ac4d794f16d6aaecc" -semistandard-format@^1.3.6: - version "1.6.7" - resolved "https://registry.yarnpkg.com/semistandard-format/-/semistandard-format-1.6.7.tgz#c72174fb3c3e21f65cb7fa9ca5386163a0eb8ec4" - dependencies: - deglob "^1.0.0" - esformatter "^0.7.3" - esformatter-eol-last "^1.0.0" - esformatter-jsx "^2.0.11" - esformatter-literal-notation "^1.0.0" - esformatter-quotes "^1.0.0" - esformatter-semicolon-first "^1.0.1" - esformatter-semicolons "^1.0.3" - esformatter-spaced-lined-comment "^2.0.0" - minimist "^1.1.0" - stdin "0.0.1" - -semistandard@7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/semistandard/-/semistandard-7.0.3.tgz#134afaff3c2be7c04125195da8071e53d0fc2f88" - dependencies: - defaults "^1.0.2" - eslint "^1.0.0" - eslint-config-semistandard "^5.0.0" - eslint-config-standard "^4.0.0" - eslint-config-standard-react "^1.0.0" - eslint-plugin-react "^3.9.0" - eslint-plugin-standard "^1.1.0" - get-stdin "^4.0.1" - minimist "^1.1.1" - semistandard-format "^1.3.6" - standard-engine "^2.0.4" - semver-diff@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" dependencies: semver "^5.0.3" -semver@2.2.1, semver@~2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-2.2.1.tgz#7941182b3ffcc580bff1c17942acdf7951c0d213" +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" semver@5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.1.tgz#9fb3f4004f900d83c47968fe42f7583e05832cc9" -semver@^4.2.0, semver@^4.3.1: - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - -semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" +semver@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.0.tgz#85f2cf8550465c4df000cf7d86f6b054106ab9e5" send@0.12.3: version "0.12.3" @@ -3930,7 +3405,7 @@ seneca-web@0.4.3: rolling-stats "0.1.1" serve-static "1.9.3" -seneca@0.7.2: +seneca@^0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/seneca/-/seneca-0.7.2.tgz#a3251be814891e6745057cd9ebfeca1667be13da" dependencies: @@ -3954,12 +3429,6 @@ seneca@0.7.2: use-plugin "0.3.1" zig "0.1.1" -serializerr@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/serializerr/-/serializerr-1.0.3.tgz#12d4c5aa1c3ffb8f6d1dc5f395aa9455569c3f91" - dependencies: - protochain "^1.0.5" - serve-static@1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.9.3.tgz#5f8da07323ad385ff3dc541f1a7917b2e436eb57" @@ -3977,6 +3446,10 @@ set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -3987,37 +3460,26 @@ shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" -shelljs@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.5.3.tgz#c54982b996c76ef0c1e6b59fbdc5825f5b713113" - -sigmund@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - 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" -simple-fmt@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/simple-fmt/-/simple-fmt-0.1.0.tgz#191bf566a59e6530482cb25ab53b4a8dc85c3a6b" - -simple-is@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0" - -sinon@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.14.1.tgz#d82797841918734507c94b7a73e3f560904578ad" +sinon@^2.3.6: + version "2.4.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-2.4.1.tgz#021fd64b54cb77d9d2fb0d43cdedfae7629c3a36" dependencies: - formatio "1.1.1" - lolex "1.1.0" - util ">=0.10.3 <1" + diff "^3.1.0" + formatio "1.2.0" + lolex "^1.6.0" + native-promise-only "^0.8.1" + path-to-regexp "^1.7.0" + samsam "^1.1.3" + text-encoding "0.6.4" + type-detect "^4.0.0" -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" slice-ansi@1.0.0: version "1.0.0" @@ -4025,34 +3487,24 @@ slice-ansi@1.0.0: dependencies: is-fullwidth-code-point "^2.0.0" -slide@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" dependencies: hoek "2.x.x" +sntp@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + dependencies: + hoek "4.x.x" + source-map-support@0.4.x: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" dependencies: source-map "^0.5.6" -source-map-support@^0.2.10: - version "0.2.10" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.2.10.tgz#ea5a3900a1c1cb25096a0ae8cc5c2b4b10ded3dc" - dependencies: - source-map "0.1.32" - -source-map@0.1.32: - version "0.1.32" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" - dependencies: - amdefine ">=0.0.4" - source-map@0.6.x: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -4063,16 +3515,23 @@ source-map@^0.4.4: dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1: +source-map@^0.5.6, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" -spawn-sync@1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.13.tgz#904091b9ad48a0f3afb0e84752154c01e82fd8d8" +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" dependencies: - concat-stream "^1.4.7" - os-shim "^0.1.2" + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" split@0.3: version "0.3.3" @@ -4098,42 +3557,23 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" -stable@~0.1.3: - version "0.1.6" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.6.tgz#910f5d2aed7b520c6e777499c1f32e139fdecb10" - -standard-engine@^2.0.4: - version "2.2.5" - resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-2.2.5.tgz#a2b9d4419f648a221b8d17823fb745406f37c34e" - dependencies: - defaults "^1.0.2" - deglob "^1.0.0" - dezalgo "^1.0.2" - eslint "1.9.0" - find-root "^0.1.1" - get-stdin "^4.0.1" - minimist "^1.1.0" - multiline "^1.0.2" - pkg-config "^1.0.1" - xtend "^4.0.0" +staged-git-files@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-0.0.4.tgz#d797e1b551ca7a639dec0237dc6eb4bb9be17d35" statuses@1: version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" -stdin@*, stdin@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/stdin/-/stdin-0.0.1.tgz#d3041981aaec3dfdbc77a1b38d6372e38f5fb71e" - stream-combiner@~0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" dependencies: duplexer "~0.1.1" -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" +stream-to-observable@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.1.0.tgz#45bf1d9f2d7dc09bed81f1c307c430e68b84cffe" streampng@0.1.7: version "0.1.7" @@ -4145,12 +3585,6 @@ streampng@0.1.7: buffer-equal "~0.0.0" errs "~0.2.4" -string-length@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" - dependencies: - strip-ansi "^3.0.0" - string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -4159,36 +3593,28 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string.prototype.endswith@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/string.prototype.endswith/-/string.prototype.endswith-0.2.0.tgz#a19c20dee51a98777e9a47e10f09be393b9bba75" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - string_decoder@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" dependencies: safe-buffer "~5.1.0" -stringmap@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stringmap/-/stringmap-0.2.2.tgz#556c137b258f942b8776f5b2ef582aa069d7d1b1" - -stringset@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/stringset/-/stringset-0.2.1.tgz#ef259c4e349344377fcd1c913dd2e848c9c042b5" +stringify-object@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.2.1.tgz#2720c2eff940854c819f6ee252aaeb581f30624d" + dependencies: + get-own-enumerable-property-symbols "^2.0.1" + is-obj "^1.0.1" + is-regexp "^1.0.0" -stringstream@~0.0.4: +stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -4204,19 +3630,17 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" -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" +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" -strip-json-comments@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" +strip-indent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" strip-json-comments@~2.0.1: version "2.0.1" @@ -4228,10 +3652,6 @@ supports-color@4.4.x: dependencies: has-flag "^2.0.0" -supports-color@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.3.1.tgz#15758df09d8ff3b4acc307539fabe27095e1042d" - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -4242,9 +3662,9 @@ supports-color@^4.0.0: dependencies: has-flag "^2.0.0" -sync-exec@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/sync-exec/-/sync-exec-0.5.0.tgz#3f7258e4a5ba17245381909fa6a6f6cf506e1661" +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" table@^4.0.1: version "4.0.2" @@ -4278,17 +3698,27 @@ tar@^2.2.1: fstream "^1.0.2" inherits "2" +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + dependencies: + execa "^0.7.0" + +text-encoding@0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" + text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" -through@2, through@^2.3.6, through@~2.3, through@~2.3.1, through@~2.3.4, through@~2.3.8: +through@2, through@^2.3.6, through@~2.3, through@~2.3.1, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" -timed-out@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-2.0.0.tgz#f38b0ae81d3747d628001f41dafc652ace671c0a" +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" tmp@^0.0.33: version "0.0.33" @@ -4296,18 +3726,6 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -to-double-quotes@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-double-quotes/-/to-double-quotes-2.0.0.tgz#aaf231d6fa948949f819301bbab4484d8588e4a7" - -to-fast-properties@^1.0.0, to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - -to-single-quotes@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/to-single-quotes/-/to-single-quotes-2.0.1.tgz#7cc29151f0f5f2c41946f119f5932fe554170125" - to-utf8@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/to-utf8/-/to-utf8-0.0.1.tgz#d17aea72ff2fba39b9e43601be7b3ff72e089852" @@ -4318,58 +3736,46 @@ topo@2.x.x: dependencies: hoek "4.x.x" -touch@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-1.0.0.tgz#449cbe2dbae5a8c8038e30d71fa0ff464947c4de" +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" dependencies: nopt "~1.0.10" -tough-cookie@>=0.12.0, tough-cookie@~2.3.0: +tough-cookie@~2.3.0, tough-cookie@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" dependencies: punycode "^1.4.1" -trim-right@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - -try-resolve@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/try-resolve/-/try-resolve-1.0.1.tgz#cfde6fabd72d63e5797cfaab873abbe8e700e912" - -tryor@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/tryor/-/tryor-0.1.2.tgz#8145e4ca7caff40acde3ccf946e8b8bb75b4172b" - tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" dependencies: safe-buffer "^5.0.1" -tunnel-agent@~0.4.0: - version "0.4.3" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" - tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" -type-check@~0.3.1, type-check@~0.3.2: +type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" dependencies: prelude-ls "~1.1.2" -type-detect@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" +type-detect@^4.0.0: + version "4.0.5" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.5.tgz#d70e5bc81db6de2a381bcaca0c6e0cbdc7635de2" -typedarray@^0.0.6, typedarray@~0.0.5: +typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" +ua-parser-js@^0.7.9: + version "0.7.17" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" + uglify-js@^2.6: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" @@ -4391,25 +3797,35 @@ undefsafe@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-0.0.3.tgz#ecca3a03e56b9af17385baac812ac83b994a962f" -underscore@~1.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + dependencies: + crypto-random-string "^1.0.0" -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" -update-notifier@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-0.5.0.tgz#07b5dc2066b3627ab3b4f530130f7eddda07a4cc" +update-notifier@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" dependencies: - chalk "^1.0.0" - configstore "^1.0.0" + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-installed-globally "^0.1.0" is-npm "^1.0.0" - latest-version "^1.0.0" - repeating "^1.1.2" + latest-version "^3.0.0" semver-diff "^2.0.0" - string-length "^1.0.0" + xdg-basedir "^3.0.0" + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + dependencies: + prepend-http "^1.0.1" use-plugin@0.3.1: version "0.3.1" @@ -4420,38 +3836,25 @@ use-plugin@0.3.1: nid "~0.3.2" norma "~0.3.0" -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - -user-home@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" - dependencies: - os-homedir "^1.0.0" - util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" -"util@>=0.10.3 <1": - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - dependencies: - inherits "2.0.1" - utils-merge@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" -uuid@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" - -uuid@^3.0.0: +uuid@^3.0.0, uuid@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -4460,13 +3863,11 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -which@1.1.x: - version "1.1.2" - resolved "https://registry.yarnpkg.com/which/-/which-1.1.2.tgz#486c48af6dfecc7a7dcf9c655acf108d2dcbdf3d" - dependencies: - is-absolute "^0.1.7" +whatwg-fetch@>=0.10.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" -which@^1.2.4, which@^1.2.8, which@^1.2.9: +which@^1.2.10, which@^1.2.9: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" dependencies: @@ -4478,14 +3879,16 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2" +widest-line@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" + dependencies: + string-width "^2.1.1" + window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" -window-size@^0.1.2: - version "0.1.4" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" - wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" @@ -4502,13 +3905,13 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -write-file-atomic@^1.1.2: - version "1.3.4" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" +write-file-atomic@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" - slide "^1.1.5" + signal-exit "^3.0.2" write@^0.2.1: version "0.2.1" @@ -4516,27 +3919,9 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" -xdg-basedir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" - dependencies: - os-homedir "^1.0.0" - -xml-escape@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/xml-escape/-/xml-escape-1.0.0.tgz#00963d697b2adf0c185c4e04e73174ba9b288eb2" - -xtend@^4.0.0, xtend@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - -y18n@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - -yakaa@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/yakaa/-/yakaa-1.0.1.tgz#3ecaae72f3d089da58089403126204cec772e60a" +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" yallist@^2.1.2: version "2.1.2" @@ -4551,17 +3936,6 @@ yargs@~3.10.0: decamelize "^1.0.0" window-size "0.1.0" -yargs@~3.27.0: - version "3.27.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.27.0.tgz#21205469316e939131d59f2da0c6d7f98221ea40" - dependencies: - camelcase "^1.2.1" - cliui "^2.1.0" - decamelize "^1.0.0" - os-locale "^1.4.0" - window-size "^0.1.2" - y18n "^3.2.0" - zig@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/zig/-/zig-0.1.1.tgz#801185594c7d1338f14c3ebfbe0ba74f0b969ccb"