From 9e84c721481b981fce4253b5ba31e910e1ccc086 Mon Sep 17 00:00:00 2001 From: Wyatt Johnson Date: Wed, 8 Nov 2017 09:41:38 -0700 Subject: [PATCH] added more mutations --- .gitignore | 1 + graph/mutators/user.js | 20 + graph/resolvers/root_mutation.js | 6 + graph/typeDefs.graphql | 24 +- package.json | 20 +- perms/constants/mutation.js | 3 +- perms/reducers/mutation.js | 12 +- services/users.js | 32 +- test/server/graph/mutations/changeUsername.js | 82 +++ test/server/services/users.js | 105 ++-- yarn.lock | 532 ++++++++++++++++-- 11 files changed, 728 insertions(+), 109 deletions(-) create mode 100644 test/server/graph/mutations/changeUsername.js diff --git a/.gitignore b/.gitignore index d30e961bd..f47efe570 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,4 @@ plugins/* !plugins/talk-plugin-slack-notifications **/node_modules/* +yarn-error.log diff --git a/graph/mutators/user.js b/graph/mutators/user.js index 4d4350739..fe2631186 100644 --- a/graph/mutators/user.js +++ b/graph/mutators/user.js @@ -2,6 +2,8 @@ const errors = require('../../errors'); const UserModel = require('../../models/user'); const UsersService = require('../../services/users'); const { + CHANGE_USERNAME, + SET_USERNAME, SET_USER_USERNAME_STATUS, SET_USER_BAN_STATUS, SET_USER_SUSPENSION_STATUS, @@ -70,10 +72,20 @@ const stopIgnoringUser = ({user}, userToStopIgnoring) => { return UsersService.stopIgnoringUsers(user.id, [userToStopIgnoring.id]); }; +const changeUsername = async (ctx, id, username) => { + return UsersService.changeUsername(id, username); +}; + +const setUsername = async (ctx, id, username) => { + return UsersService.setUsername(id, username); +}; + module.exports = (ctx) => { let mutators = { User: { ignoreUser: () => Promise.reject(errors.ErrNotAuthorized), + changeUsername: () => Promise.reject(errors.ErrNotAuthorized), + setUsername: () => Promise.reject(errors.ErrNotAuthorized), stopIgnoringUser: () => Promise.reject(errors.ErrNotAuthorized), setUserUsernameStatus: () => Promise.reject(errors.ErrNotAuthorized), setUserBanStatus: () => Promise.reject(errors.ErrNotAuthorized), @@ -85,6 +97,14 @@ module.exports = (ctx) => { mutators.User.ignoreUser = (action) => ignoreUser(ctx, action); mutators.User.stopIgnoringUser = (action) => stopIgnoringUser(ctx, action); + if (ctx.user.can(CHANGE_USERNAME)) { + mutators.User.changeUsername = (id, username) => changeUsername(ctx, id, username); + } + + if (ctx.user.can(SET_USERNAME)) { + mutators.User.setUsername = (id, username) => setUsername(ctx, id, username); + } + if (ctx.user.can(SET_USER_USERNAME_STATUS)) { mutators.User.setUserUsernameStatus = (id, status) => setUserUsernameStatus(ctx, id, status); } diff --git a/graph/resolvers/root_mutation.js b/graph/resolvers/root_mutation.js index 7dc31fef2..1417cdce9 100644 --- a/graph/resolvers/root_mutation.js +++ b/graph/resolvers/root_mutation.js @@ -25,6 +25,12 @@ const RootMutation = { rejectUsername: async (_, {id}, {mutators: {User}}) => { await User.setUserUsernameStatus(id, 'REJECTED'); }, + changeUsername: async (_, {id, username}, {mutators: {User}}) => { + await User.changeUsername(id, username); + }, + setUsername: async (_, {id, username}, {mutators: {User}}) => { + await User.setUsername(id, username); + }, setUserSuspensionStatus: async (_, {input: {id, until}}, {mutators: {User}}) => { await User.setUserSuspensionStatus(id, until); }, diff --git a/graph/typeDefs.graphql b/graph/typeDefs.graphql index c4dfee445..34f0b58b9 100644 --- a/graph/typeDefs.graphql +++ b/graph/typeDefs.graphql @@ -187,9 +187,6 @@ type User { # the tags on the user tags: [TagLink!] - # determines whether the user can edit their username - canEditName: Boolean - # ignored users. ignoredUsers: [User!] @@ -1361,6 +1358,18 @@ type SetUsernameStatusResponse implements Response { errors: [UserError!] } +type ChangeUsernameResponse implements Response { + + # An array of errors relating to the mutation that occurred. + errors: [UserError!] +} + +type SetUsernameResponse implements Response { + + # An array of errors relating to the mutation that occurred. + errors: [UserError!] +} + # All mutations for the application are defined on this object. type RootMutation { @@ -1395,6 +1404,15 @@ type RootMutation { # `MODERATOR` role. Mutation is restricted. rejectUsername(id: ID!): SetUsernameStatusResponse + # Changes the username to the desired username. Mutation is restricted to + # those users with permission do to so. + changeUsername(id: ID!, username: String!): ChangeUsernameResponse + + # Sets the username to the desired username if the user has not had a chance + # to set their username. Mutation is restricted to those users with permission + # do to so that have not done so before. + setUsername(id: ID!, username: String!): SetUsernameResponse + # Sets Comment status. Requires the `ADMIN` role. # Mutation is restricted. setCommentStatus(id: ID!, status: COMMENT_STATUS!): SetCommentStatusResponse diff --git a/package.json b/package.json index e2affee15..d3e7a2331 100644 --- a/package.json +++ b/package.json @@ -136,7 +136,7 @@ "node-emoji": "^1.8.1", "node-fetch": "^1.7.2", "nodemailer": "^2.6.4", - "npm-run-all": "^4.1.1", + "npm-run-all": "^4.1.2", "passport": "^0.4.0", "passport-jwt": "^3.0.0", "passport-local": "^1.0.0", @@ -203,6 +203,7 @@ "mocha-junit-reporter": "^1.12.1", "nightwatch": "^0.9.16", "nodemon": "^1.11.0", + "pre-git": "^3.16.0", "selenium-standalone": "^6.11.0", "sinon": "^3.2.1", "sinon-chai": "^2.13.0", @@ -210,5 +211,22 @@ }, "engines": { "node": "^8" + }, + "config": { + "pre-git": { + "pre-commit": [ + "yarn lint", + "yarn test:client", + "yarn test:server" + ], + "pre-push": [ + "yarn lint", + "yarn test:client", + "yarn test:server" + ], + "post-commit": [], + "post-checkout": [], + "post-merge": [] + } } } diff --git a/perms/constants/mutation.js b/perms/constants/mutation.js index 6e5d1ac8d..72ec0458c 100644 --- a/perms/constants/mutation.js +++ b/perms/constants/mutation.js @@ -1,8 +1,9 @@ module.exports = { CREATE_COMMENT: 'CREATE_COMMENT', CREATE_ACTION: 'CREATE_ACTION', + CHANGE_USERNAME: 'CHANGE_USERNAME', + SET_USERNAME: 'SET_USERNAME', DELETE_ACTION: 'DELETE_ACTION', - EDIT_NAME: 'EDIT_NAME', EDIT_COMMENT: 'EDIT_COMMENT', SET_USER_USERNAME_STATUS: 'SET_USER_USERNAME_STATUS', SET_USER_BAN_STATUS: 'SET_USER_BAN_STATUS', diff --git a/perms/reducers/mutation.js b/perms/reducers/mutation.js index ecd08980f..a49a901fa 100644 --- a/perms/reducers/mutation.js +++ b/perms/reducers/mutation.js @@ -3,14 +3,20 @@ const types = require('../constants'); module.exports = (user, perm) => { switch (perm) { + case types.CHANGE_USERNAME: + return user.status.username.status === 'REJECTED'; + + case types.SET_USERNAME: + return user.status.username.status === 'UNSET'; + case types.CREATE_COMMENT: case types.CREATE_ACTION: case types.DELETE_ACTION: - case types.EDIT_NAME: case types.EDIT_COMMENT: - // Anyone can do these things if they aren't suspended or banned. - return true; + // Anyone can do these things if they aren't suspended, banned, or blocked + // as they're editing their username. + return !['UNSET', 'REJECTED'].includes(user.status.username.status); case types.ADD_COMMENT_TAG: case types.REMOVE_COMMENT_TAG: diff --git a/services/users.js b/services/users.js index ca09c8f7a..04e85f541 100644 --- a/services/users.js +++ b/services/users.js @@ -102,23 +102,25 @@ module.exports = class UsersService { return user; } - static async changeUsername(id, username) { + static async _setUsername(id, username, fromStatus, toStatus, resetAllowed = false) { try { - let user = await UserModel.findOneAndUpdate({ + const query = { id, - username: {$ne: username}, - 'status.username.status': { - $in: ['UNSET', 'REJECTED'] - } - }, { + 'status.username.status': fromStatus + }; + if (!resetAllowed) { + query.username = {$ne: username}; + } + + let user = await UserModel.findOneAndUpdate(query, { $set: { username, lowercaseUsername: username.toLowerCase(), - 'status.username.status': 'CHANGED', + 'status.username.status': toStatus, }, $push: { 'status.username.history': { - status: 'CHANGED', + status: toStatus, assigned_by: id, created_at: Date.now() } @@ -132,11 +134,11 @@ module.exports = class UsersService { throw errors.ErrNotFound; } - if (!['UNSET', 'REJECTED'].includes(user.status.username.status)) { + if (user.status.username.status !== fromStatus) { throw errors.ErrPermissionUpdateUsername; } - if (user.username === username) { + if (!resetAllowed && user.username === username) { throw errors.ErrSameUsernameProvided; } @@ -153,6 +155,14 @@ module.exports = class UsersService { } } + static async setUsername(id, username) { + return UsersService._setUsername(id, username, 'UNSET', 'SET', true); + } + + static async changeUsername(id, username) { + return UsersService._setUsername(id, username, 'REJECTED', 'CHANGED'); + } + /** * This checks to see if the current login attempts against a user exceeds the * maximum value allowed, if so, it rejects with: diff --git a/test/server/graph/mutations/changeUsername.js b/test/server/graph/mutations/changeUsername.js new file mode 100644 index 000000000..cacce9cc7 --- /dev/null +++ b/test/server/graph/mutations/changeUsername.js @@ -0,0 +1,82 @@ +const {graphql} = require('graphql'); + +const schema = require('../../../../graph/schema'); +const Context = require('../../../../graph/context'); +const SettingsService = require('../../../../services/settings'); +const UsersService = require('../../../../services/users'); + +const {expect} = require('chai'); + +describe('graph.mutations.changeUsername', () => { + let user; + beforeEach(async () => { + await SettingsService.init(); + user = await UsersService.createLocalUser('test@test.com', 'testpassword1!', 'kirk'); + + expect(user).to.have.property('username', 'kirk'); + expect(user).to.have.property('lowercaseUsername', 'kirk'); + expect(user.status.username.status).to.equal('SET'); + }); + + const changeUsernameMutation = ` + mutation ChangeUsername($user_id: ID!, $username: String!) { + changeUsername(id: $user_id, username: $username) { + errors { + translation_key + } + } + } + `; + + [ + {roles: null}, + {roles: ['STAFF']}, + {roles: []}, + {roles: ['MODERATOR']}, + {roles: ['ADMIN']}, + {roles: ['ADMIN', 'MODERATOR']}, + ].forEach(({roles}) => { + it(`can change the username with roles ${roles && roles.length ? roles : JSON.stringify(roles)}`, async () => { + let username = 'spock'; + + let ctx = new Context({user}); + + let res = await graphql(schema, changeUsernameMutation, {}, ctx, { + user_id: user.id, + username, + }); + + if (res.errors && res.errors.length > 0) { + console.error(res.errors); + } + + expect(res.errors).to.be.undefined; + expect(res.data.changeUsername).to.have.property('errors'); + expect(res.data.changeUsername.errors).to.have.length(1); + expect(res.data.changeUsername.errors[0]).to.have.property('translation_key', 'NOT_AUTHORIZED'); + + // Set the user to the desired status. + user = await UsersService.setUsernameStatus(user.id, 'REJECTED'); + + expect(user.status.username.status, 'REJECTED'); + + ctx = new Context({user}); + + res = await graphql(schema, changeUsernameMutation, {}, ctx, { + user_id: user.id, + username, + }); + + if (res.errors && res.errors.length > 0) { + console.error(res.errors); + } + + expect(res.errors).to.be.undefined; + expect(res.data.changeUsername).to.be.null; + + user = await UsersService.findById(user.id); + + expect(user.status.username.status, 'CHANGED'); + }); + }); +}); diff --git a/test/server/services/users.js b/test/server/services/users.js index 7f50c337c..c1db0519f 100644 --- a/test/server/services/users.js +++ b/test/server/services/users.js @@ -223,59 +223,86 @@ describe('services.UsersService', () => { }); }); - describe('#changeUsername', () => { - [ - {status: 'UNSET'}, - {status: 'REJECTED'}, - {error: 'EDIT_USERNAME_NOT_AUTHORIZED', status: 'SET'}, - {error: 'EDIT_USERNAME_NOT_AUTHORIZED', status: 'APPROVED'}, - {error: 'EDIT_USERNAME_NOT_AUTHORIZED', status: 'CHANGED'}, - ].forEach(({status, error}) => { - it(`${error ? 'should not' : 'should'} let them change the username if they have the status of ${status}`, async () => { + [ + {func: 'changeUsername', okStatus: 'REJECTED', notOKStatus: 'UNSET', newStatus: 'CHANGED'}, + {func: 'setUsername', okStatus: 'UNSET', notOKStatus: 'REJECTED', newStatus: 'SET'}, + ].forEach(({func, okStatus, notOKStatus, newStatus}) => { + describe(`#${func}`, () => { + [ + {status: okStatus}, + {error: 'EDIT_USERNAME_NOT_AUTHORIZED', status: notOKStatus}, + {error: 'EDIT_USERNAME_NOT_AUTHORIZED', status: 'SET'}, + {error: 'EDIT_USERNAME_NOT_AUTHORIZED', status: 'APPROVED'}, + {error: 'EDIT_USERNAME_NOT_AUTHORIZED', status: 'CHANGED'}, + ].forEach(({status, error}) => { + it(`${error ? 'should not' : 'should'} let them change the username if they have the status of ${status}`, async () => { + const user = mockUsers[0]; + + // Set the user to the desired status. + await UsersService.setUsernameStatus(user.id, status); + + try { + await UsersService[func](user.id, 'spock'); + } catch (err) { + if (error) { + expect(err).have.property('translation_key', error); + } else { + throw err; + } + } + }); + }); + + it(`should change the status to ${newStatus} when changed`, async () => { const user = mockUsers[0]; // Set the user to the desired status. - await UsersService.setUsernameStatus(user.id, status); + await UsersService.setUsernameStatus(user.id, okStatus); + + const editedUser = await UsersService[func](user.id, 'spock'); + + expect(editedUser.status.username.status).to.equal(newStatus); try { - await UsersService.changeUsername(user.id, 'spock'); + await UsersService[func](user.id, 'spock'); + throw new Error('edit was processed successfully'); } catch (err) { - if (error) { - expect(err).have.property('translation_key', error); - } else { - throw err; - } + expect(err).have.property('translation_key', 'EDIT_USERNAME_NOT_AUTHORIZED'); } }); - }); - it('should refuse changing the username to the same username', async () => { - const user = mockUsers[0]; + it(`${func === 'changeUsername' ? 'should' : 'should not'} refuse changing the username to the same username`, async () => { + const user = mockUsers[0]; - // Set the user to the desired status. - await UsersService.setUsernameStatus(user.id, 'UNSET'); + // Set the user to the desired status. + await UsersService.setUsernameStatus(user.id, okStatus); - try { - await UsersService.changeUsername(user.id, user.username); - throw new Error('edit was processed successfully'); - } catch (err) { - expect(err).have.property('translation_key', 'SAME_USERNAME_PROVIDED'); - } - }); + if (func === 'changeUsername') { + try { + await UsersService[func](user.id, user.username); + throw new Error('edit was processed successfully'); + } catch (err) { + expect(err).have.property('translation_key', 'SAME_USERNAME_PROVIDED'); + } + } else { + await UsersService[func](user.id, user.username); + } + }); - it('should refuse changing the username to one already taken', async () => { - const user = mockUsers[0]; - const otherUser = mockUsers[1]; + it('should refuse changing the username to one already taken', async () => { + const user = mockUsers[0]; + const otherUser = mockUsers[1]; - // Set the user to the desired status. - await UsersService.setUsernameStatus(user.id, 'UNSET'); + // Set the user to the desired status. + await UsersService.setUsernameStatus(user.id, okStatus); - try { - await UsersService.changeUsername(user.id, otherUser.username); - throw new Error('edit was processed successfully'); - } catch (err) { - expect(err).have.property('translation_key', 'USERNAME_IN_USE'); - } + try { + await UsersService[func](user.id, otherUser.username); + throw new Error('edit was processed successfully'); + } catch (err) { + expect(err).have.property('translation_key', 'USERNAME_IN_USE'); + } + }); }); }); diff --git a/yarn.lock b/yarn.lock index c3d0775c3..bd0d621f3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -170,6 +170,14 @@ alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" +always-error@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/always-error/-/always-error-1.0.0.tgz#95c84042cfa86f38c86ca6c2cc42c0a0103441b2" + +am-i-a-dependency@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/am-i-a-dependency/-/am-i-a-dependency-1.1.2.tgz#f9d3422304d6f642f821e4c407565035f6167f1f" + amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -180,10 +188,18 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" +ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + ansi-escapes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" +ansi-regex@^1.0.0, ansi-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-1.1.1.tgz#41c847194646375e6a1a5d10c3ca054ef9fc980d" + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -327,7 +343,7 @@ arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" -asap@~2.0.3: +asap@^2.0.0, asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -1110,7 +1126,15 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@^3.3.4, bluebird@^3.4.6, bluebird@^3.5.0, bluebird@^3.5.1: +bluebird@2.9.24: + version "2.9.24" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.9.24.tgz#14a2e75f0548323dc35aa440d92007ca154e967c" + +bluebird@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" + +bluebird@3.5.1, bluebird@^3.3.4, bluebird@^3.4.6, bluebird@^3.5.0, bluebird@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" @@ -1459,6 +1483,14 @@ chain-function@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc" +chalk@2.3.0, chalk@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + 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" @@ -1469,7 +1501,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: +chalk@^2.0.0, chalk@^2.0.1: version "2.2.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.2.0.tgz#477b3bf2f9b8fd5ca9e429747e37f724ee7af240" dependencies: @@ -1491,10 +1523,32 @@ charenc@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" +chdir-promise@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/chdir-promise/-/chdir-promise-0.4.1.tgz#1888bb33719699c9fb72138c07556503c4913e85" + dependencies: + check-more-types "2.24.0" + debug "2.6.8" + lazy-ass "1.6.0" + q "1.5.0" + spots "0.5.0" + check-error@^1.0.1, check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" +check-more-types@2.23.0: + version "2.23.0" + resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.23.0.tgz#6226264d30b1095aa1c0a5b874edbdd5d2d0a66f" + +check-more-types@2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" + +check-more-types@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.3.0.tgz#b8397c69dc92a3e645f18932c045b09c74419ec4" + cheerio@^0.20.0: version "0.20.0" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.20.0.tgz#5c710f2bab95653272842ba01c6ea61b3545ec35" @@ -1579,18 +1633,28 @@ 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.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + dependencies: + restore-cursor "^1.0.1" + cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" dependencies: restore-cursor "^2.0.0" -cli-table@^0.3.1: +cli-table@0.3.1, cli-table@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" dependencies: colors "1.0.3" +cli-width@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-1.1.1.tgz#a4d293ef67ebb7b88d4a4d42c0ccf00c4d1e366d" + cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" @@ -1702,10 +1766,14 @@ colors@1.0.3, colors@1.0.x: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" -colors@^1.1.2, colors@~1.1.2: +colors@1.1.2, colors@^1.1.2, colors@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" +colors@~0.6.0-1: + version "0.6.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" + 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" @@ -1718,6 +1786,10 @@ combined-stream@~0.0.4: dependencies: delayed-stream "0.0.5" +commander@2.11.0, commander@^2.11.0, commander@^2.9.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + commander@2.8.x: version "2.8.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" @@ -1730,9 +1802,9 @@ commander@2.9.0: dependencies: graceful-readlink ">= 1.0.0" -commander@^2.11.0, commander@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" +commander@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.1.0.tgz#d121bbae860d9992a3d517ba96f56588e47c6781" common-tags@^1.4.0: version "1.4.0" @@ -1844,6 +1916,19 @@ content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" +conventional-commit-message@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/conventional-commit-message/-/conventional-commit-message-1.1.0.tgz#ece8c661a168e983692e1d5a14875acb59510f6a" + dependencies: + check-more-types "2.3.0" + cz-conventional-changelog "1.1.5" + lazy-ass "1.3.0" + word-wrap "1.1.0" + +conventional-commit-types@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-2.2.0.tgz#5db95739d6c212acbe7b6f656a11b940baa68946" + convert-source-map@^1.4.0, convert-source-map@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" @@ -2111,6 +2196,26 @@ cycle@1.0.x: version "1.0.3" resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" +cz-conventional-changelog@1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-1.1.5.tgz#0a4d1550c4e2fb6a3aed8f6cd858c21760e119b8" + dependencies: + word-wrap "^1.0.3" + +cz-conventional-changelog@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-2.1.0.tgz#2f4bc7390e3244e4df293e6ba351e4c740a7c764" + dependencies: + conventional-commit-types "^2.0.0" + lodash.map "^4.5.1" + longest "^1.0.1" + right-pad "^1.0.1" + word-wrap "^1.0.3" + +d3-helpers@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/d3-helpers/-/d3-helpers-0.3.0.tgz#4b31dce4a2121a77336384574d893fbed5fb293d" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -2512,7 +2617,7 @@ errno@^0.1.3, errno@^0.1.4: dependencies: prr "~0.0.0" -error-ex@^1.2.0: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" dependencies: @@ -2742,6 +2847,10 @@ execa@^0.7.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" + exit@0.1.2, exit@0.1.x: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -2881,6 +2990,13 @@ fd-slicer@~1.0.1: dependencies: pend "~1.2.0" +figures@^1.3.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -2957,6 +3073,16 @@ find-cache-dir@^1.0.0: make-dir "^1.0.0" pkg-dir "^2.0.0" +find-parent-dir@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" + +find-up@2.1.0, find-up@^2.0.0, find-up@^2.1.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" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -2964,11 +3090,12 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" +findup@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/findup/-/findup-0.1.5.tgz#8ad929a3393bac627957a7e5de4623b06b0e2ceb" dependencies: - locate-path "^2.0.0" + colors "~0.6.0-1" + commander "~2.1.0" flat-cache@^1.2.1: version "1.3.0" @@ -3199,6 +3326,57 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +ggit@1.23.1: + version "1.23.1" + resolved "https://registry.yarnpkg.com/ggit/-/ggit-1.23.1.tgz#e513c2f222a6249a46e4d0df354b8604b5baeedb" + dependencies: + always-error "1.0.0" + bluebird "3.5.0" + chdir-promise "0.4.1" + check-more-types "2.24.0" + cli-table "0.3.1" + colors "1.1.2" + commander "2.11.0" + d3-helpers "0.3.0" + debug "2.6.8" + find-up "2.1.0" + glob "7.1.2" + lazy-ass "1.6.0" + lodash "3.10.1" + moment "2.18.1" + optimist "0.6.1" + pluralize "6.0.0" + q "2.0.3" + quote "0.4.0" + ramda "0.24.1" + semver "5.4.1" + +ggit@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/ggit/-/ggit-2.4.0.tgz#b99d981f3ede2a3a8a8e4bbff578bc277d400588" + dependencies: + always-error "1.0.0" + bluebird "3.5.1" + chdir-promise "0.4.1" + check-more-types "2.24.0" + cli-table "0.3.1" + colors "1.1.2" + commander "2.11.0" + d3-helpers "0.3.0" + debug "3.1.0" + find-up "2.1.0" + glob "7.1.2" + lazy-ass "1.6.0" + lodash "4.17.4" + moment "2.19.1" + moment-timezone "0.5.13" + optimist "0.6.1" + pluralize "7.0.0" + q "2.0.3" + quote "0.4.0" + ramda "0.25.0" + semver "5.4.1" + git-up@^2.0.0: version "2.0.9" resolved "https://registry.yarnpkg.com/git-up/-/git-up-2.0.9.tgz#219bfd27c82daeead8495beb386dc18eae63636d" @@ -3258,17 +3436,7 @@ glob@7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -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@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: +glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -3279,6 +3447,16 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" +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" + global-dirs@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.0.tgz#10d34039e0df04272e262cf24224f7209434df4f" @@ -3663,6 +3841,10 @@ hpkp@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/hpkp/-/hpkp-2.0.0.tgz#10e142264e76215a5d30c44ec43de64dee6d1672" +hr@0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/hr/-/hr-0.1.3.tgz#d9aa30f5929dabfd0b65ba395938a3e184dbcafe" + hsts@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/hsts/-/hsts-2.1.0.tgz#cbd6c918a2385fee1dd5680bfb2b3a194c0121cc" @@ -3846,7 +4028,45 @@ ini@^1.3.0, ini@^1.3.4, ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" -inquirer@^3.0.6, inquirer@^3.2.2: +inquirer-confirm@0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/inquirer-confirm/-/inquirer-confirm-0.2.2.tgz#6f406d037bf9d9e455ef0f953929f357fe9a8848" + dependencies: + bluebird "2.9.24" + inquirer "0.8.2" + +inquirer@0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" + dependencies: + ansi-escapes "^1.1.0" + ansi-regex "^2.0.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + figures "^1.3.5" + lodash "^4.3.0" + 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@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.8.2.tgz#41586548e1c5d9b3f81df7325034baacab6f58ab" + dependencies: + ansi-regex "^1.1.1" + chalk "^1.0.0" + cli-width "^1.0.1" + figures "^1.3.5" + lodash "^3.3.1" + readline2 "^0.1.1" + rx "^2.4.3" + through "^2.3.6" + +inquirer@3.3.0, inquirer@^3.0.6, inquirer@^3.2.2: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" dependencies: @@ -4637,6 +4857,10 @@ json-loader@^0.5.4, json-loader@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" +json-parse-better-errors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz#50183cd1b2d25275de069e9e71b467ac9eab973a" + 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" @@ -4785,12 +5009,31 @@ kue@0.11.6: optionalDependencies: reds "^0.2.5" +largest-semantic-change@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/largest-semantic-change/-/largest-semantic-change-1.0.0.tgz#25dc538bdaaa8bbdc30276b1ebf902d47a34bf0e" + dependencies: + check-more-types "2.23.0" + lazy-ass "1.5.0" + 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 "^4.0.0" +lazy-ass@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.3.0.tgz#7d0d14eef3ec9702c6f30c60ea81f1a8d3f900fb" + +lazy-ass@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.5.0.tgz#ca15be243c7c475b8565cdbfa0f9c2f374f2a01d" + +lazy-ass@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" + lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" @@ -4869,6 +5112,15 @@ load-json-file@^2.0.0: pify "^2.0.0" strip-bom "^3.0.0" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" @@ -5097,6 +5349,10 @@ lodash.keysin@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.keysin/-/lodash.keysin-4.2.0.tgz#8cc3fb35c2d94acc443a1863e02fa40799ea6f28" +lodash.map@^4.5.1: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -5161,11 +5417,15 @@ lodash.values@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" +lodash@3.10.1, lodash@^3.3.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + lodash@3.7.x: version "3.7.0" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.7.0.tgz#3678bd8ab995057c07ade836ed2ef087da811d45" -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.16.6, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: +lodash@4.17.4, lodash@^4.0.0, lodash@^4.1.0, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.16.6, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -5297,11 +5557,9 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" -memory-streams@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/memory-streams/-/memory-streams-0.1.2.tgz#273ff777ab60fec599b116355255282cca2c50c2" - dependencies: - readable-stream "~1.0.2" +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" merge-descriptors@1.0.1: version "1.0.1" @@ -5459,7 +5717,17 @@ mocha@^3.1.2: mkdirp "0.5.1" supports-color "3.1.2" -moment@2.x.x, moment@^2.10.3, moment@^2.18.1: +moment-timezone@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.13.tgz#99ce5c7d827262eb0f1f702044177f60745d7b90" + dependencies: + moment ">= 2.9.0" + +moment@2.18.1: + version "2.18.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" + +moment@2.19.1, moment@2.x.x, "moment@>= 2.9.0", moment@^2.10.3, moment@^2.18.1: version "2.19.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.1.tgz#56da1a2d1cbf01d38b7e1afc31c10bcfa1929167" @@ -5542,6 +5810,14 @@ murmurhash-js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51" +mute-stream@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.4.tgz#a9219960a6d5d5d046597aee51252c6655f7177e" + +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" @@ -5833,17 +6109,17 @@ normalize-url@^1.4.0: query-string "^4.1.0" sort-keys "^1.0.0" -npm-run-all@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.1.tgz#3095cf3f3cacf57fcb662b210ab10c609af6ddbb" +npm-run-all@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.2.tgz#90d62d078792d20669139e718621186656cea056" dependencies: ansi-styles "^3.2.0" chalk "^2.1.0" cross-spawn "^5.1.0" - memory-streams "^0.1.2" + memorystream "^0.3.1" minimatch "^3.0.4" ps-tree "^1.1.0" - read-pkg "^2.0.0" + read-pkg "^3.0.0" shell-quote "^1.6.1" string.prototype.padend "^3.0.0" @@ -5945,6 +6221,10 @@ once@^1.3.0, once@^1.3.3, once@^1.4.0: dependencies: wrappy "1" +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" @@ -6090,6 +6370,13 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + parse-url@^1.3.0: version "1.3.11" resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-1.3.11.tgz#57c15428ab8a892b1f43869645c711d0e144b554" @@ -6189,6 +6476,12 @@ path-type@^2.0.0: dependencies: pify "^2.0.0" +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + dependencies: + pify "^3.0.0" + pathval@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" @@ -6263,10 +6556,18 @@ platform@1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.4.tgz#6f0fb17edaaa48f21442b3a975c063130f1c3ebd" -pluralize@^7.0.0: +pluralize@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-6.0.0.tgz#d9b51afad97d3d51075cc1ddba9b132cacccb7ba" + +pluralize@7.0.0, pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" +pop-iterate@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pop-iterate/-/pop-iterate-1.0.1.tgz#ceacfdab4abf353d7a0f2aaa2c1fc7b3f9413ba3" + popsicle@^6.2.0: version "6.2.2" resolved "https://registry.yarnpkg.com/popsicle/-/popsicle-6.2.2.tgz#e273c8bd48181f73a59b199e2a5e25b692b3e237" @@ -6690,6 +6991,25 @@ postcss@^6.0.1: source-map "^0.6.1" supports-color "^4.4.0" +pre-git@^3.16.0: + version "3.16.0" + resolved "https://registry.yarnpkg.com/pre-git/-/pre-git-3.16.0.tgz#a7656bc5f277185fd213c78f39f24f2cb603eb61" + dependencies: + bluebird "3.5.1" + chalk "2.3.0" + check-more-types "2.24.0" + conventional-commit-message "1.1.0" + cz-conventional-changelog "2.1.0" + debug "2.6.9" + ggit "2.4.0" + inquirer "3.3.0" + lazy-ass "1.6.0" + require-relative "0.8.7" + shelljs "0.7.8" + simple-commit-message "3.3.2" + validate-commit-msg "2.14.0" + word-wrap "1.2.3" + precss@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/precss/-/precss-1.4.0.tgz#8d7c3ae70f10a00a3955287f85a66e0f8b31cda3" @@ -6931,10 +7251,18 @@ q@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" -q@^1.1.2: +q@1.5.0, q@^1.1.2: version "1.5.0" resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" +q@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/q/-/q-2.0.3.tgz#75b8db0255a1a5af82f58c3f3aaa1efec7d0d134" + dependencies: + asap "^2.0.0" + pop-iterate "^1.0.1" + weak-map "^1.0.5" + qs@6.5.1, qs@^6.1.0, qs@^6.2.0, qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" @@ -6970,6 +7298,10 @@ querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" +quote@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/quote/-/quote-0.4.0.tgz#10839217f6c1362b89194044d29b233fd7f32f01" + raf@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575" @@ -6980,10 +7312,14 @@ railroad-diagrams@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" -ramda@^0.24.1: +ramda@0.24.1, ramda@^0.24.1: version "0.24.1" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.24.1.tgz#c3b7755197f35b8dc3502228262c4c91ddb6b857" +ramda@0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.25.0.tgz#8fdf68231cffa90bc2f9460390a0cb74a29b29a9" + randexp@^0.4.2: version "0.4.6" resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3" @@ -7198,6 +7534,14 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + readable-stream@1.1, readable-stream@1.1.x: version "1.1.13" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" @@ -7219,15 +7563,6 @@ readable-stream@2, readable-stream@2.2.7, readable-stream@^2.0.0, readable-strea string_decoder "~1.0.0" util-deprecate "~1.0.1" -readable-stream@~1.0.2: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" @@ -7237,6 +7572,21 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" +readline2@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/readline2/-/readline2-0.1.1.tgz#99443ba6e83b830ef3051bfd7dc241a82728d568" + dependencies: + mute-stream "0.0.4" + strip-ansi "^2.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" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -7488,6 +7838,10 @@ require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" +require-relative@0.8.7: + version "0.8.7" + resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" + require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" @@ -7520,6 +7874,13 @@ resolve@^1.1.6, resolve@^1.1.7, resolve@^1.4.0: dependencies: path-parse "^1.0.5" +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -7541,6 +7902,10 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" +right-pad@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/right-pad/-/right-pad-1.0.1.tgz#8ca08c2cbb5b55e74dafa96bf7fd1a27d568c8d0" + rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" @@ -7567,6 +7932,12 @@ rst-selector-parser@^2.2.2: lodash.flattendeep "^4.4.0" nearley "^2.7.10" +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" @@ -7583,6 +7954,14 @@ 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" + +rx@^2.4.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/rx/-/rx-2.5.3.tgz#21adc7d80f02002af50dae97fd9dbf248755f566" + safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -7655,7 +8034,11 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1: +semver-regex@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-1.0.0.tgz#92a4969065f9c70c694753d55248fc68f8f652c9" + +"semver@2 || 3 || 4 || 5", semver@5.4.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" @@ -7740,7 +8123,7 @@ shelljs@0.3.x: version "0.3.0" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1" -shelljs@^0.7.0: +shelljs@0.7.8, shelljs@^0.7.0: version "0.7.8" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" dependencies: @@ -7756,6 +8139,22 @@ 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-commit-message@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/simple-commit-message/-/simple-commit-message-3.3.2.tgz#52bdadb7f4f680d8b29c07af1826a6611f7ee783" + dependencies: + am-i-a-dependency "1.1.2" + check-more-types "2.24.0" + debug "2.6.9" + ggit "1.23.1" + hr "0.1.3" + inquirer "0.12.0" + inquirer-confirm "0.2.2" + largest-semantic-change "1.0.0" + lazy-ass "1.6.0" + semver "5.4.1" + word-wrap "1.2.3" + simplemde@^1.11.2: version "1.11.2" resolved "https://registry.yarnpkg.com/simplemde/-/simplemde-1.11.2.tgz#a23a35d978d2c40ef07dec008c92f070d8e080e3" @@ -7919,6 +8318,10 @@ split@0.3: dependencies: through "2" +spots@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/spots/-/spots-0.5.0.tgz#b7aa0f1ac389a5a6d57c21e98da1d53839405fe1" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -8020,6 +8423,12 @@ stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" +strip-ansi@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-2.0.1.tgz#df62c1aa94ed2f114e1d0f21fd1d50482b79a60e" + dependencies: + ansi-regex "^1.0.0" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -8584,6 +8993,15 @@ v8flags@^2.1.1: dependencies: user-home "^1.1.1" +validate-commit-msg@2.14.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/validate-commit-msg/-/validate-commit-msg-2.14.0.tgz#e5383691012cbb270dcc0bc2a4effebe14890eac" + dependencies: + conventional-commit-types "^2.0.0" + find-parent-dir "^0.3.0" + findup "0.1.5" + semver-regex "1.0.0" + 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" @@ -8644,6 +9062,10 @@ watchpack@^1.3.1: chokidar "^1.7.0" graceful-fs "^4.1.2" +weak-map@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/weak-map/-/weak-map-1.0.5.tgz#79691584d98607f5070bd3b70a40e6bb22e401eb" + webidl-conversions@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506" @@ -8779,6 +9201,14 @@ with@^5.0.0: acorn "^3.1.0" acorn-globals "^3.0.0" +word-wrap@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.1.0.tgz#356153d61d10610d600785c5d701288e0ae764a6" + +word-wrap@1.2.3, word-wrap@^1.0.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"